Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hash 用二叉搜索树实现哈希表_Hash_Hashtable_Binary Search Tree - Fatal编程技术网

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

Hash 用二叉搜索树实现哈希表,hash,hashtable,binary-search-tree,Hash,Hashtable,Binary Search Tree,这是破解散列表编码面试中有争议的一句话 哈希表的另一个常见实现(除了链表)是使用BST作为底层数据结构 我知道以前有人问过这个问题。。。这太令人困惑了,因为每个人都给出了两个不同的答案。比如说 这篇文章中投票率最高的答案是,上面引用的语句是在谈论使用二叉搜索树的哈希表实现,而没有底层数组。我了解到,由于插入的每个元素都会得到一个散列值(一个整数),因此这些元素形成一个总的顺序(每一对都可以与)进行比较)。因此,我们可以简单地使用二叉搜索树来保存哈希表的元素 另一方面,也有人说 这本书说我们应

这是破解散列表编码面试中有争议的一句话

哈希表的另一个常见实现(除了链表)是使用BST作为底层数据结构

我知道以前有人问过这个问题。。。这太令人困惑了,因为每个人都给出了两个不同的答案。比如说

这篇文章中投票率最高的答案是,上面引用的语句是在谈论使用二叉搜索树的哈希表实现,而没有底层数组。我了解到,由于插入的每个元素都会得到一个散列值(一个整数),因此这些元素形成一个总的顺序(每一对都可以与<和>)进行比较)。因此,我们可以简单地使用二叉搜索树来保存哈希表的元素

另一方面,也有人说

这本书说我们应该用二叉搜索树来处理冲突。因此存在一个底层数组,当由于多个元素获得相同的哈希值并被放置在数组中的同一个插槽中而发生冲突时,BST就会出现

因此,数组中的每个插槽都是指向BST的指针,BST保存具有相同哈希值的元素

我倾向于第二篇文章的论点,因为第一篇文章并没有真正解释哈希表的这种实现如何处理冲突。我认为它不能达到预期的O(1)插入/删除/查找时间

但是对于第二篇文章,如果我们有多个元素获得相同的散列值并放在一个BST中,我不确定这些元素是如何排序的(它们如何相互比较?)

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

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

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

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

使用另一个函数重新刷新


最后,这完全取决于您的数据结构的用途(内存与速度是否更重要?摊销性能与最坏情况下的性能是否更重要?等等)

关于您对第一个blockquote的评论。。。不产生任何重复值的哈希函数是完美的哈希函数,对吗?如果我们使用PHF和BST来实现,有哪些缺点?它肯定有一些缺点。您还可以解释一下为什么BST+PHF实现会导致O(n)调整时间吗?PHF+BST的缺点是速度较慢,因为插入和搜索将是O(logn)而不是基于数组的哈希表,该哈希表具有O(1)。在C++中,STD::MAP使用PHF实现BST,而STD::unOrdEdEdmap使用数组,而STD::MAP几乎总是比STD::unOrdEdjMmap慢(除非STD::MAP是空的)。BST+PHF没有O(n)大小调整,只有每个bucket中的array+BST来处理冲突,它们必须以O(n)大小调整大小,通常当数组中的bucket数达到50%时。