这是来自Cracking the Coding Interview on hash tables的争议线。
哈希表的另一个常见实现(除了链表之外)是使用BST作为底层数据结构。
我知道之前已经问过这个问题......它很混乱,因为每个人都给出了两个不同的答案。例如
Why implement a Hashtable with a Binary Search Tree?
这篇文章中最高投票的答案说,上面引用的声明是在谈论使用二进制搜索树的哈希表实现,没有底层数组。我理解,由于插入的每个元素都获得一个哈希值(一个整数),因此元素形成一个总顺序(每个对都可以与<和>进行比较)。因此,我们可以简单地使用二叉搜索树来保存哈希表的元素。
另一方面,其他人说
Hash table - implementing with Binary Search Tree
这本书说我们应该处理与二叉搜索树的冲突。所以有一个底层数组和碰撞时,因为多个元素获得相同的哈希值并被放置在数组中的同一个插槽中,这就是BST所在的位置。
因此,数组中的每个插槽都是指向BST的指针,BST保存具有相同散列值的元素。
我倾向于第二篇帖子的论点,因为第一篇文章并没有真正解释哈希表的这种实现如何处理冲突。而且我认为它无法实现预期的O(1)插入/删除/查找时间。
但是对于第二篇文章,如果我们有多个元素获得相同的哈希值并放在BST中,我不确定这些元素是如何排序的(它们如何相互比较?)< / p>
请帮助我一劳永逸地结束这个问题!
答案 0 :(得分:2)
第一篇文章并未真正解释哈希表的这种实现如何处理冲突
使用BST,您可以使用不会产生重复键的散列函数,因此不会发生冲突。这里的优点不是速度,而是减少内存消耗,并提供更好的最坏情况保证。如果您正在为关键的实时系统编写软件,则可能无法容忍对哈希表进行O(n)大小调整。
如果我们有多个元素获得相同的哈希值并放在BST中,我不确定这些元素是如何排序的(如何将它们相互比较?)
与其他功能重播。
最后,这一切都取决于您的数据结构的用途(内存与速度的关系更重要吗?分摊性能与最差情况的性能更重要吗?等等。)