在线性时间中找到未排序数组中的加权中位数

时间:2019-05-01 22:39:54

标签: algorithm

这是来自Coursera的Algorithms课程之一的实践问题;我被困了几周。

问题是这样的: Given an array of n distinct unsorted elements x1, x2, ..., xn ε X with positive weights w1, w2, ..., wn ε W, a weighted median is an element xk for which the total weight of all elements with values less than xk is at most (total weight)/2 and also the total weight of elements with values larger than xk is at most (total weight)/2. Observe that there are at most two weighted. Show how to compute all weighted medians in O(n) worst time

本课程主要涵盖分而治之算法,因此,我认为开始该课程的关键是确定所涵盖的算法可以用于解决此问题。

涵盖的算法之一是RSelect形式的RSelect(array X, length n, order statistic i)算法,对于加权中位数,可以写为RSelect(array X, weights W, length n, order statistic i)。我对这种方法的问题是,它假设我提前知道中值,这似乎不太可能。还有一个问题是,枢轴是随机地均匀选择的,我不认为在不计算每个条目的每个权重的情况下,权重也可能适用。

接下来是DSelect算法,其中使用中位数中位数方法可以在不进行随机化的情况下计算枢轴,因此我们可以计算适当的中位数。这似乎是可行的方法,但我有麻烦的地方是它还假设我提前知道了我所寻找的价值。

DSelect(array A, length n, order statistic i)用于未加权数组

DSelect(array A, weights W, length n, order statistic i)用于加权数组

我是否想得太多?假设我提前知道DSelect的值,我应该使用(total weight) / 2吗?我想即使我进行计算,它也只会在运行时间上增加线性时间。但这与预计算加权数组(combine A, W into Q where qi = xi*wi)并将其转换回未加权数组的问题没什么不同,在这里我可以使用RSelect(加上一些考虑到两个中位数的情况)< / p>

我发现https://archive.org/details/lineartimealgori00blei/page/n3https://blog.nelsonliu.me/2016/07/05/gsoc-week-6-efficient-calculation-of-weighted-medians/描述了此问题,但是他们的方法似乎并未涵盖在本课程中(而且我对堆/堆排序并不熟悉)< / p>

2 个答案:

答案 0 :(得分:0)

Quickselect可以达到这种平均性能。

可以使用Reservoir Sampling Algorithm选择带有权重的随机选择的枢轴。没错,找到第一个枢轴是O(n),但是您要使用的列表的大小将遵循几何级数,因此查找枢轴的总成本仍然只有{ {1}}。

答案 1 :(得分:0)

可以使用quickselect的简单变体来解决此问题:

  1. 计算所有权重的总和,然后除以2得到目标总和
  2. 选择枢轴并将数组划分为更大和更小的元素
  3. 将较小分区中的权重求和,然后从总和中减去以获得另一个分区中的总和
  4. 返回2来处理具有适当目标和的适当分区

就像普通的快速选择一样,如果您使用(普通的,未加权的)中位数方法来选择枢轴,则在最坏的情况下,它会变成线性。