限制权重向量的条目

时间:2015-04-09 16:04:22

标签: algorithm

v = (v(1), ..., v(n))成为正实数的向量,使v(1) + ... + v(n) = 1。设l > 0 1/l ≤ n并假设某v(k) > l k

考虑以下算法:

  1. 为每个v(k) = l添加kv(k) > l
  2. 标准化v,即放v = v / (v(1) + ... + v(n))
  3. 很容易看出,此算法重复应用于v收敛到某个向量w,使得每个w(k) ≤ lkw(1) + ... w(k) = 1。我的目标是找到一个快速算法来计算w的确切值。

    一个想法是将v的每个条目替换为大于l l的条目,然后对其余条目进行规范化。这导致以下算法:

    1. I = (i(1), ..., i(m))成为索引列表,v(k) > l当且仅当k属于IJ = (j(1), ..., j(n-m))为其补充时,即v(k) ≥ l当且仅当k属于J时,v(i(k)) = l的索引列表。
    2. 1 ≤ k ≤ m添加v = (1 - m * l) * v(j(k)) / (v(j(1)) + ... + v(j(k)))
    3. 1 ≤ k ≤ n-m添加k
    4. 问题在于,在应用算法之前可能存在v(k) < l v(k) > l,而在应用算法之后w可能存在n。因此,仍然需要反复应用它。然而,它最多以m步收敛到v

      重复应用上一个算法相当于将l的{​​{1}}最大条目替换为m,然后对其余条目进行规范化,以便选择m 。有没有快速的方法可以找到w或向量{{1}}的值,可能是线性时间?

1 个答案:

答案 0 :(得分:0)

我的直觉(通常是错误的!)是你能做到的最好的时间是O(n log n)。要在O(n log n)时间内完成:

  1. 按升序排列数组(时间复杂度O(n log n) - 例如MergeSort)
  2. 创建一个累积总计数组(这需要遍历数组一次,因此O(n)时间复杂度。)
  3. 对于每个m,现在可以很容易地决定常量时间是否通过将最大m数字替换为1并且规范化而获得的数组是你想要什么。 (所有数字的总和将是累计总数加上m之一,因此您只需要检查(m+1) - 最大值除以该总数的值。因此要查找{{1此阶段需要线性搜索m
  4. 因此,此算法的总时间复杂度为O(n)