像treap这样的随机二进制搜索树以高概率提供了良好的性能(按O(log n)的顺序),同时避免了确定性平衡树(如AVL,red-blackm)所需的复杂(且成本高昂)的重新平衡操作AA等。
我们知道,如果我们将随机密钥添加到简单的BST中,我们可以预期它会合理平衡。一个简单的原因是n个节点的非均衡树的数量远远低于“几乎平衡的”树的数量,因此,插入密钥的随机顺序很可能以可接受的树结束。
在这种情况下,在“计算机程序设计的艺术”中,Knuth给出了一点点多于1.3 * lg2(n)作为相当好的路径的平均长度。他还说从随机树中删除一个随机密钥保留了它的随机性(因此它具有良好的平均平衡)。
然后,似乎二进制搜索树以随机顺序插入和删除密钥,很可能会为所有三个操作提供O(log n)顺序的性能:搜索,插入和删除。
那就是说,我想知道以下方法是否会提供相同的好属性:
举例说明按顺序插入的密钥{4,3,5,1,2}的BST将是:
4
/ \
3 5
/\
1 2
假设哈希函数将它们映射到(分别){221,142,12,380,18),我们就会得到。
221(4)
/ \
142(3) 380(1)
/ \
12(5) 18(2)
关键点是“常规”BST可能会退化,因为键是按照用于将它们存储在树中的相同排序关系插入的(它们的“自然”排序,例如字符串的字母顺序)但是哈希函数在键上引入一个与“自然”序列完全无关的排序,因此,应该给出与按随机顺序插入键时相同的结果。
一个强有力的假设是哈希函数是“好的”,但我认为它不是一个不合理的。
我没有在文献中找到任何类似方法的参考,所以它可能完全错误,但我不明白为什么!
你认为我的推理有任何缺点吗?有人已经尝试过吗?
答案 0 :(得分:5)
我认为你的建议是简单地使用哈希值来命令,依赖于平衡树的哈希值的传播。这是有效的,它应该在实践中为您提供充分平衡的树和良好的哈希函数。
我们没有看到其他人使用这样的东西,IMO的原因是,如果你通过哈希函数订购,你的数据结构就不再排序了。是的,它仍然按哈希函数排序,但具有最小哈希函数的元素通常不是您需要搜索的元素,而像最小/最大/第k个元素的搜索通常是有用的。由于数据结构将不再具有此属性,因此使用哈希表使用哈希函数存储在数组中以获得O(1)性能而不是O(log n)更有意义。
答案 1 :(得分:2)
对我来说很合理。您是否进行过搜索,看看这是否已经正式化或至少已经注意到了?
关于缺点:我想一个可能的反对意见是:如果你已经为运行哈希函数支付了价格,为什么不只是使用哈希表?“。
相关的反对意见是您已经将时间复杂度与散列函数的分布属性联系起来,在这种情况下,树不会在散列表上添加太多内容。我喜欢树,但哈希表通常更快。这意味着散列树的主要优点是它使用了散列函数的全部范围,而散列表在模数op中抛出了大部分。
答案 2 :(得分:0)
这不仅仅是存储哈希表的一种方法吗?
答案 3 :(得分:0)
虽然它通常使用类似B树的东西来存储,但这通常与可扩展散列的工作方式非常相似。是的,它通常运作良好。