1、散列函数
散列函数必须满足一些要求:它必须是一致的。 例如, 假设你输入apple时得到的是4, 那么每次输入apple时, 得到的都必须为4。 如果不是这样, 散列表将毫无用处;它应将不同的输入映射到不同的数字。 例如, 如果一个散列函数不管输入是什么都返回1, 它就不是好的散列函数。 最理想的情况是, 将不同的输入映射到不同的数字。
散列函数的特性:散列函数总是将同样的输入映射到相同的索引;散列函数将不同的输入映射到不同的索引;散列函数知道数组有多大, 只返回有效的索引。 如果数组包含5个元素, 散列函数就不会返回无效索引100。
Python中实现散列表:字典。
2、散列表的用途
- 仿真映射关系;
- 防止重复;
- 缓存/记住数据, 以免服务器再通过处理来生成它们。
3、冲突
实际中,散列函数并不是将不同的键映射到数组的不同位置。
经验:理想的散列函数将键均匀地映射到散列表的不同位置;如果散列表存储的链表很长, 散列表的速度将急剧下降。 然而, 如果使用的散列函数很好 , 这些链表就不会很长!
4、避免冲突
- 较低的填装因子
- 良好的散列函数
良好的散列函数让数组中的值呈均匀分布。
5、小结
- 你可以结合散列函数和数组来创建散列表。
- 冲突很糟糕, 你应使用可以最大限度减少冲突的散列函数。
- 散列表的查找、 插入和删除速度都非常快。
- 散列表适合用于仿真映射关系。
- 一旦填装因子超过0.7, 就该调整散列表的长度。
- 散列表可用于缓存数据(例如, 在Web服务器上) 。
- 散列表非常适合用于防止重复。