从流中查找运行媒体

时间:2015-10-20 00:13:39

标签: algorithm median

问题:假定从数据流中读取整数。到目前为止,以有效的方式查找元素的中位数。

我找到了解决方案here

我的问题是为什么我们需要使用堆而不是简单地在向量中添加数字?

例如,假设我们使用向量来存储传入数据,那么我们调用该方法来计算中位数,如下所示:

if vector size is even
   return (element at size/2 + element at size/2-1);
else
   return (element at size/2);

上述解决方案是否有效?

3 个答案:

答案 0 :(得分:2)

如果元素在向量中不按顺序排列,则解决方案无效。如果你在向量的末尾添加元素,它们就不会有序。

另一方面,元素在堆中按顺序排列。

此外,在第一个返回语句中缺少两个除法。

答案 1 :(得分:1)

至少有两个原因,你建议的解决方案一般不被使用:

  1. 一般来说,假设您处理数据流时,该流量很大甚至无限,因此存储所有值并不实用。
  2. 正如@ChronoTrigger所说,您必须对矢量进行排序才能使用它。该问题通常假设您希望能够反复询问中位数作为新数据流。为了使用您的解决方案,您必须对您的矢量进行一遍又一遍的排序。< / LI>

    总的来说,保持流数据集的准确中位数很难有效。有许多算法可以做到这一点,但它们都会做出权衡,例如较低的内存使用率等等。

答案 2 :(得分:0)

Vector仅在您将新元素添加到其正确位置时才会起作用(根据排序顺序)。

例如: 流:8 3 4 1 10 12

如果你只是在向量的末尾添加元素,那么每一步都是中位数:

step 1: vector: 8 median: 8
step 2: vector: 8, 3 median: (8+3)/2
step 3: vector: 8, 3, 4 median: 3 (when actually it should be 4)

希望你明白这个想法