在处理哈希冲突时,为什么要在BST上使用链表?

时间:2015-01-01 16:30:11

标签: data-structures hashmap hashtable

链接列表需要O(n)进行搜索,而BST采用O(log n)。那么为什么要使用链表来处理冲突呢?我能想到的唯一原因是因为插入链表是O(1),而插入BST是O(log n)。

3 个答案:

答案 0 :(得分:5)

如果哈希函数是好的并且哈希表加载因子不太高,那么任何一个桶中都不应该有很多冲突。链表是一个非常简单的数据结构,足够好,碰撞次数少。速度快,占用空间小。请记住,大多数存储桶中都包含0或1个值。

此外,BST会强制要求物品可以订购。哈希表的一个不错的特性是密钥不需要具有可比性。

答案 1 :(得分:4)

散列表的理由是,应该有很少的项散列到相同的散列槽。对于这些小数字,链表实际上应该比BST更快(更好的常数因子),并且在任何情况下都会更简单,更可靠。在任何情况下,BST的最坏情况都与链表相同,除非您想要真正超越顶部并使用平衡树。

答案 2 :(得分:2)

我想主要原因是易于实施。至少有一个广泛使用的哈希表实现最近从使用链表到使用链表和平衡树的混合:Java 8中的JEP 180: Handle Frequent HashMap Collisions with Balanced Trees

  

主要思想是,一旦哈希桶中的项目数量增长超过某个阈值,该桶就会从使用链接的条目列表切换到平衡树。在高哈希冲突的情况下,这将改善从O(n)到O(log n)的最坏情况性能。

值得注意的是,在列表上使用树需要元素可以排序。普通哈希表(带或不带链表)没有这个要求:它所要求的只是元素是可清除的并且与相等相当。