我在http://discuss.joelonsoftware.com/default.asp?interview.11.780597.8使用Morris InOrder遍历时遇到了解决方案,我们可以在O(n)
时间内找到中位数。
但是有可能使用O(logn)
时间来实现相同的目标吗?这里也有同样的问题 - http://www.careercup.com/question?id=192816
答案 0 :(得分:5)
如果还保持节点左右后代数的计数,则可以通过搜索中位数在O(logN)时间内完成。实际上,您可以在O(logn)时间内找到第k个最大元素。
当然,这假设树是平衡的。维护计数不会改变插入/删除的复杂性。
如果树不平衡,那么你的Omega(n)最坏情况复杂。
请参阅:Order Statistic Tree。
不过,BigO和Smallo非常不同(你的头衔是Smallo)。答案 1 :(得分:4)
除非你保证某种平衡的树,否则它是不可能的。
考虑一个完全退化的树 - 例如,每个left
指针都是NULL(零,无论如何),因此每个节点只有一个正确的子节点(即,出于所有实际目的,“树”实际上是一个单链表)。
在这种情况下,只访问中间节点(根本)需要线性时间 - 即使你知道节点N是中位数,它仍然需要N步才能到达那个节点。
答案 2 :(得分:0)
我们可以使用rabbit
和turtle
指针找到中位数。在BST的有序遍历中,兔子的移动速度是龟的两倍。这样当兔子到达遍历结束时,龟就会在BST的中间位置。
请参阅full explanation。