O(logn)时间复杂度中BST的中位数

时间:2010-08-18 19:11:26

标签: algorithm data-structures traversal tree-traversal

我在http://discuss.joelonsoftware.com/default.asp?interview.11.780597.8使用Morris InOrder遍历时遇到了解决方案,我们可以在O(n)时间内找到中位数。

但是有可能使用O(logn)时间来实现相同的目标吗?这里也有同样的问题 - http://www.careercup.com/question?id=192816

3 个答案:

答案 0 :(得分:5)

如果还保持节点左右后代数的计数,则可以通过搜索中位数在O(logN)时间内完成。实际上,您可以在O(logn)时间内找到第k个最大元素。

当然,这假设树是平衡的。维护计数不会改变插入/删除的复杂性。

如果树不平衡,那么你的Omega(n)最坏情况复杂。

请参阅:Order Statistic Tree

不过,BigO和Smallo非常不同(你的头衔是Smallo)。

答案 1 :(得分:4)

除非你保证某种平衡的树,否则它是不可能的。

考虑一个完全退化的树 - 例如,每个left指针都是NULL(零,无论如何),因此每个节点只有一个正确的子节点(即,出于所有实际目的,“树”实际上是一个单链表)。

在这种情况下,只访问中间节点(根本)需要线性时间 - 即使你知道节点N是中位数,它仍然需要N步才能到达那个节点。

答案 2 :(得分:0)

我们可以使用rabbitturtle指针找到中位数。在BST的有序遍历中,兔子的移动速度是龟的两倍。这样当兔子到达遍历结束时,龟就会在BST的中间位置。

请参阅full explanation