Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 从AVL树中获取中值?_Performance_Algorithm_Data Structures_Median_Avl Tree - Fatal编程技术网

Performance 从AVL树中获取中值?

Performance 从AVL树中获取中值?,performance,algorithm,data-structures,median,avl-tree,Performance,Algorithm,Data Structures,Median,Avl Tree,如果你有一个AVL树,从中得到中值的最佳方法是什么?中位数将被定义为排序列表中具有索引ceil(n/2)(索引以1开头)的元素 所以如果名单是 1 3 5 7 8 中位数是5。如果名单是 1 3 5 7 8 1 3 5 7 8 10 中位数是5 如果可以扩充树,我认为最好让每个节点知道子树的大小(节点数)(即1+left.size+right.size)。使用这种方法,我能想到的最好的方法是使用中值搜索O(lgn)时间,因为您可以通过比较索引进行遍历 有更好的方法吗?如果您需要优化中位数以上

如果你有一个AVL树,从中得到中值的最佳方法是什么?中位数将被定义为排序列表中具有索引ceil(n/2)(索引以1开头)的元素

所以如果名单是

1 3 5 7 8
中位数是5。如果名单是

1 3 5 7 8
1 3 5 7 8 10

中位数是5

如果可以扩充树,我认为最好让每个节点知道子树的大小(节点数)(即1+left.size+right.size)。使用这种方法,我能想到的最好的方法是使用中值搜索O(lgn)时间,因为您可以通过比较索引进行遍历


有更好的方法吗?

如果您需要优化中位数以上的查询,那么增加AVL树来存储子树大小通常是最好的方法。它需要时间O(logn),这相当快

如果要计算大量的中值,可以使用扩充树并缓存中值,以便在时间O(1)内读取。每次执行插入或删除操作时,可能需要重新计算时间O(logn)中的中位数,这将使速度减慢一点,但不会影响渐进成本

另一种选择是在树中的节点之间穿行一个双链接列表,这样您就可以在固定时间内从一个节点导航到它的后续节点或前置节点。如果这样做,则可以存储指向中间值元素的指针,然后在插入或删除时,根据需要将指针向左或向右移动。如果删除中间值本身,只需将指针向左或向右移动即可。这不需要任何扩充,可能会快一点,但它会在每个节点中添加两个额外的指针


希望这有帮助

FWIW,将计数放入节点的技术使AVL树也成为顺序统计树:。当然,还必须修改平衡算法中的旋转以调整节点计数@templatetypedef对树进行线程化并使用单个中间指针的想法是最佳的。它不需要节点计数,每个操作的时间是恒定的。他没有提到你还需要知道树中的总节点计数,这样你就可以确定中位数是单个元素(奇数节点计数)还是两个平均数(偶数节点计数)。@Gene感谢你填写这些细节!我想看看Javascript中使用指针的代码。