使用二叉搜索树实现哈希表

时间:2017-06-20 14:01:34

标签: hash hashtable binary-search-tree

这是来自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>

请帮助我一劳永逸地结束这个问题!

1 个答案:

答案 0 :(得分:2)

  

第一篇文章并未真正解释哈希表的这种实现如何处理冲突

使用BST,您可以使用不会产生重复键的散列函数,因此不会发生冲突。这里的优点不是速度,而是减少内存消耗,并提供更好的最坏情况保证。如果您正在为关键的实时系统编写软件,则可能无法容忍对哈希表进行O(n)大小调整。

  

如果我们有多个元素获得相同的哈希值并放在BST中,我不确定这些元素是如何排序的(如何将它们相互比较?)

与其他功能重播。

最后,这一切都取决于您的数据结构的用途(内存与速度的关系更重要吗?分摊性能与最差情况的性能更重要吗?等等。)