目录
1. 字典和集合的高效性
许多时候,将列表改为字典或集合后,执行效率将会有巨大的飞跃,两者之间的主要区别在于,列表每次的查找运算都需要从头到尾进行扫描,而字典或集合则只需要进行查表。
在 Python 中,字典和集合所查找的表,即散列表(Hash table),也称为哈希表,是一个稀疏数组(总是有空白元素的数组称为稀疏数组)。
将要存储的数据是先通过哈希函数:hash() 进行计算获得哈希值,再根据哈希值将存储数据的引用地址(只有这样才无论数据大小,在散列表中存放的数据同样大小),存放在散列表中的一行(通常称之为 bucket)。
这也会导致一个效果,即:键的值如果相等,则视为重复键。这是因为相同值的键,即使一个是整数1,一个是浮点数1.00,哈希值计算相同,在散列表中的存放位置一致。
2. 散列表
2.1 散列表的写入
1. Python 调用 hash() 函数,计算字典的 “键” 的哈希值;
2. 将哈希值的最低几位数字加工后作为偏移量,在散列表中进行索引;
3. 若找到的 bucket 为空,将键值对写入;
4. 若找到的 bucket 已存放数据,产生散列冲突,执行如下冲突解决操作:
- Python 在哈希值中另取几位数字进行加工,重新得到新的 bucket 索引值
- 若新的 buc