【发布时间】:2021-09-16 05:01:08
【问题描述】:
如果您有一棵 AVL 树,从中获取中位数的最佳方法是什么?中位数将被定义为排序列表中索引为 ceil(n/2)(索引从 1 开始)的元素。
如果列表是
1 3 5 7 8
中位数是 5。如果列表是
1 3 5 7 8 10
中位数是 5。
如果可以扩充树,我认为最好让每个节点都知道子树的大小(节点数),(即 1 + left.size + right.size)。使用这个,我能想到的最好的方法是使中位数搜索 O(lg n) 时间,因为您可以通过比较索引来遍历。
有没有更好的办法?
【问题讨论】:
-
FWIW,将计数放入节点的技术使您的 AVL 树也可以放入顺序统计树:en.wikipedia.org/wiki/Order_statistic_tree。当然,您还必须修改平衡算法中的旋转以调整节点数。 @templatetypedef 对树进行线程化并使用单个中值指针的想法是最佳的。它不需要节点计数,并且每个操作的时间是恒定的。他没有提到您还需要知道树中的总节点数,以便您可以确定中位数是单个元素(奇数节点数)还是两个的平均值(偶数节点数)。
-
@Gene 感谢您填写这些详细信息!
标签: performance algorithm data-structures median avl-tree