python3字典底层实现原理

884 阅读2分钟
  1. 在python3中字典是通过散列表或者哈希表实现的,因此字典也被称为关联数组或者哈希数组
  2. 数组的索引是键经过哈希函数处理后得到的散列值
  3. python3的字典的键经过哈希函数的目的:使键均匀地分布在数组中并且可以在内存中以O(1)的时间复杂度进行寻址,从而实现快速查找和修改。
  4. 由于不同的键可能具有相同的哈希值,即可能出现冲突,高级的哈希函数能够使冲突数目最小化。
  5. Python中所有不可变的内置类型都是可哈希的,不可变类型(比如,数字,元组,字符串)可哈希。 可变类型(如列表,字典和集合)就是不可哈希的。
  6. 定义对象需要满足支持hash、支持通过__eq__()方法检测相等性、若a == b为真,则hash(a) == hash(b)也为真。

常见的哈希碰撞解决办法:

  1. 开放定址法(线行探查法、平方探查法、双散列函数)
  2. 链地址法(拉链法) 链接地址法的思路是将哈希值相同的元素构成一个同义词的单链表,并将单链表的头指针存放在哈希表的第 i个单元中,查找、插入和删除主要在同义词链表中进行。链表法适用于经常进行插入和删除的情况。
  3. 再哈希法 就是同时构造多个不同的哈希函数:
    Hi = RHi(key) i= 1,2,3 … k;
    当H1 = RH1(key) 发生冲突时,再用H2 = RH2(key) 进行计算,直到冲突不再产生,这种方法不易产生 聚集,但是增加了计算时间
  4. 建立公共溢出区 将哈希表分为公共表和溢出表,当溢出发生时,将所有溢出数据统一放到溢出区

处理冲突时平均查找长度:

1.哈希表的装填因子
装填因子a = (哈希表中的记录数) / (哈希表的长度)

装填因子是哈希表装满程度的标记因子。a值越大,填入表中的数据元素越多,产生冲突的可能性越大。
2.平均查找长度
在这里插入图片描述