寻找连续中位数

时间:2013-10-16 04:32:29

标签: median

如何为每次添加新输入时更新的给定输入计算中位数?例如:

1 - 中位数为1 1,2 - 中位数是3/2 1,2,3 - 中位数为2

2 个答案:

答案 0 :(得分:1)

我不知道如何在不到O(n)的时间内完成。

您必须保留现有项目的排序列表。每当新项目到达时,您必须将其插入正确的位置。这将需要O(n)时间。

然后计算新的中位数是基本的。如果新的N是奇数,则它是数组[(N-1)/ 2],否则它是 (array [(N)/ 2] + array [(N)/ 2 - 1])/ 2。

答案 1 :(得分:1)

你可以在每个元素的O(logn)中完成它。

构建AVL树(或RBT),将一个指针设置为中位数。现在使用完整线程(两者),父指针来增强AVL 插入时间是对数,后继和前驱是常量操作,因此更新中值指针是恒定时间操作。

父指针加上线程似乎是多余的,但是这保证不会进行遍历,中间更新在轮换阶段完成。

优点:只有插入时间才重要。结构是动态的,无需重新分配数组或移动元素。

缺点:空间开销和分配节点。