冲突
当给两个键分配的位置相同时就会出现冲突。
处理冲突最简单的方法就是,如果两个键映射到了同一个位置,就在这个位置存储一个链表。
总结如下:
- 散列函数很重要。最理想的情况是散列函数将键均匀地映射到散列表的不同位置。
- 如果散列表存储的链表很长,散列表的速度将急剧下降。
性能
散列表执行各种操作的时间都为O(1)。O(1)被称为常量时间。常量时间并不意味着马上,而是说不管散列表多大,所需的时间都相同。
在平均情况下,散列表的查找速度和数组一样快,插入、删除的速度和链表一样快。
但是在最糟糕的情况下,散列表的查找、插入、删除的时间复杂度是O(n)。因此在使用列表时,避开最糟糕情况至关重要。为了避免冲突,需要有:
- 较低的填装因子
- 良好的散列函数
填装因子
散列表采用数组来存储数据,填装因子等于散列表中包含的元素数除以数组中被占用的位置数。填装因子度量的是散列表中有多少位置是空的。
填装因子越低,发生冲突的可能性越小,散列表的性能越高。一旦填装因子大于0.7,就调整散列表的长度。
良好的散列函数
良好的散列函数让数组中的值呈均匀分布