随机化二叉搜索树

4
随机化二叉搜索树(如treap)在高概率下可以提供良好的性能(O(log n)级别),同时避免了确定性平衡树(如AVL,红黑树,AA等)需要复杂(且昂贵)的再平衡操作。
我们知道,如果向简单的BST添加随机键,则可以期望它被合理地平衡。一个简单的原因是,n个节点的重度不平衡树的数量远低于“几乎平衡”的树的数量,因此,按键的随机顺序可能会得出一个可接受的树。
在这种情况下,Knuth在《计算机程序设计艺术》中给出的路径平均长度略大于1.3×lg2(n),这相当不错。他还说,从随机树中删除随机键会保持其随机性(因此保持其良好平衡性)。
因此,在随机顺序插入和删除键的二叉搜索树最有可能为所有三个操作(搜索、插入和删除)提供O(log n)级别的性能。
也就是说,我想知道以下方法是否具有同样良好的性质:
- 使用已知为“优秀”的哈希函数h(x)(例如,它确保键均匀分布) - 使用h(x)对键进行排序,而不是按照 k 的顺序。 - 如果有冲突,则按键排序。如果哈希键足够好且哈希函数的范围比键集大得多,则这应该很少发生。
例如,按照 {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)

关键点在于,“常规”的二叉搜索树可能会退化,因为插入键是根据与存储在树中的顺序关系相同的顺序进行的(例如它们的“自然”排序,例如字符串的字母顺序),但哈希函数会对键产生完全不相关的排序,因此应该产生与随机顺序插入键时相同的结果。
一个强烈的假设是哈希函数是“好的”,但我认为这并不是一个不合理的假设。
我没有在文献中找到类似方法的参考,因此它可能是完全错误的,但我看不出来为什么!
你是否看到我的推理有任何缺陷?有人已经尝试过吗?
4个回答

5
我认为你的建议是仅使用哈希值进行排序,依靠哈希值的分布来实现平衡树。这种方法是可行的,并且在使用良好的哈希函数时,应该可以给出足够平衡的树。
我认为我们不见其他人使用类似的方法的原因是,如果按哈希函数排序,你的数据结构就不再是有序的了。是的,它仍然按哈希函数排序,但是具有最小哈希函数的元素通常不是你需要搜索的元素,而像最小/最大/k-th元素这样的搜索通常是有用的。由于数据结构不再具有此属性,因此使用哈希表将哈希函数用于存储数组以获得O(1)性能而不是O(log n)会更加合理。

2

对我来说听起来很合理。你是否已经搜索过这个问题是否已经被正式化或至少被注意到了?

关于缺点:我想一个可能的反对意见是:“如果您已经为运行哈希函数付出了代价,为什么不使用哈希表?”

另一个相关的反对意见是,您已经将时间复杂度与哈希函数的分布特性联系起来,此时树在哈希表上并没有太多的优势。我喜欢树,但哈希表通常更快。这意味着散列树的主要优势在于它使用了哈希函数的全部范围,而哈希表则在模运算中丢失了大部分的哈希值。


0

这只是一种存储哈希表的方式吗?


0

尽管它通常使用类似B树的存储方式,但这与可扩展哈希的工作原理非常相似。而且,它通常表现得非常出色。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接