2010-01-10 61 views
4

像treap这样的随机二分搜索树以高概率提供了良好性能(按O(log n)的顺序),同时避免了确定性平衡树(如AVL)所需的复杂(且昂贵)的重新平衡操作, red-blackm,AA等随机二分搜索树

我们知道,如果我们向一个简单的BST添加随机密钥,我们可以期望它是相当均衡的。一个简单的原因是,对于n个节点而言,严重的非平衡树的数量远低于“几乎平衡”的树的数量,因此,插入密钥的随机顺序很可能以可接受的树结束。

在这种情况下,在“计算机编程的艺术”中,Knuth给出了一个比1.3 * lg2(n)多一点的平均长度,这个路径相当不错。他还说删除从随机树中随机密钥保留其随机性(因此它的良好平均平衡)。

因此,似乎在随机顺序中插入和删除密钥的二叉搜索树最有可能在所有三个操作(搜索,插入和删除)中按O(log n)的顺序执行性能。

这么说,我不知道下面的方法将给出相同的优良性能:

  • 采取散列函数H(X),其被称为是“好”(例如,它确保甚至蔓延的键)
  • 使用h(x)在键上设置的顺序而不是k上的顺序。
  • 万一发生碰撞,按键重新排序。如果散列键足够好并且散列函数的范围比键集大得多,那么这应该是罕见的。

举个例子的密钥的BST {4,3,5,1,2}插入的顺序,将是:

    4 
       /\ 
       3 5 
       /\ 
       1 2 

假设散列函数将它们映射到(分别){221,142,12,380,18)我们会得到。

    221(4) 
       / \ 
       142(3) 380(1) 
      / \ 
      12(5) 18(2) 

的关键点是“常规” BST可能退化,因为密钥是根据被用于将它们存储在树中(它们的“天然”排序相同次序关系插入,例如,按字母顺序但是哈希函数会导致与“自然”完全无关的密钥排序,因此应该给出与密钥以随机顺序插入相同的结果。

一个强有力的假设是哈希函数是“好”的,但它不是一个不合理的,我想。

我没有在文献中找到任何类似方法的参考,所以它可能是完全错误的,但我不明白为什么!

你看到我的推理有什么缺点吗?任何人都已经试图做到这一点?

回答

5

我认为你的建议是简单地使用散列值进行排序,依靠散列值的平衡树的散布。这是有效的,它应该在实践中给你充分平衡的树木,并且具有良好的散列函数。

我们没有看到其他人使用类似这样的IMO的原因是,如果您使用散列函数进行排序,则您的数据结构不再被排序。是的,它仍然通过散列函数进行排序,但散列函数最小的元素通常不是您需要搜索的元素,而像最小/最大/第k个元素的搜索通常很有用。由于数据结构不再具有此属性,因此拥有使用散列函数存储在数组中以获得O(1)性能而不是O(log n)的散列表会更有意义。

0

这不就是存储散列表的一种方式吗?

2

听起来对我来说很合理。你有没有搜索过,看看它是否已经正式化或者至少有人注意到了?

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

一个相关的反对意见是,你有吗?。已经将时间复杂度与散列函数的分布属性联系起来,在这种情况下,树不会在散列表上添加太多,我喜欢树,但散列表通常更快,这意味着散列树的主要优点是它使用整个散列函数的范围,而哈希表在模数运算中将其大部分抛出。

0

虽然它通常使用类似于B树的东西来存储,这与扩展哈希的工作方式非常相似。是的,它通常工作得很好。