【发布时间】:2019-09-20 10:51:16
【问题描述】:
这是来自 coursera 的一门算法课程中的练习题;我已经被困了几个星期了。
问题是这样的:
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) 用于加权数组
我是不是想多了?假设我提前知道(total weight) / 2 的值,我应该使用DSelect 吗?我想即使我计算它也只会给运行时间增加线性时间。但是,这与预先计算加权数组 (combine A, W into Q where q<sub>i</sub> = x<sub>i</sub>*w<sub>i</sub>) 并将其转换回未加权数组问题没有什么不同,我可以在其中使用 RSelect(加上一些考虑到有两个中位数的情况)
我发现 https://archive.org/details/lineartimealgori00blei/page/n3 和 https://blog.nelsonliu.me/2016/07/05/gsoc-week-6-efficient-calculation-of-weighted-medians/ 描述了这个问题,但他们的方法似乎没有在课程中涵盖(而且我不熟悉堆/堆排序)
【问题讨论】:
-
你是说X和W的标量积得到的向量上的中位数与原问题中的加权中位数在同一指标上?比如
X=[5, 10, 7]和W=[2, 2, 3]的加权中位数是7,而X*W=[10, 20, 21]的中位数是20。
标签: algorithm