让v = (v(1), ..., v(n))
成为正实数的向量,使v(1) + ... + v(n) = 1
。设l > 0
1/l ≤ n
并假设某v(k) > l
k
。
考虑以下算法:
v(k) = l
添加k
,v(k) > l
。v
,即放v = v / (v(1) + ... + v(n))
。很容易看出,此算法重复应用于v
收敛到某个向量w
,使得每个w(k) ≤ l
和k
都w(1) + ... w(k) = 1
。我的目标是找到一个快速算法来计算w
的确切值。
一个想法是将v
的每个条目替换为大于l
l
的条目,然后对其余条目进行规范化。这导致以下算法:
I = (i(1), ..., i(m))
成为索引列表,v(k) > l
当且仅当k
属于I
且J = (j(1), ..., j(n-m))
为其补充时,即v(k) ≥ l
当且仅当k
属于J
时,v(i(k)) = l
的索引列表。1 ≤ k ≤ m
添加v = (1 - m * l) * v(j(k)) / (v(j(1)) + ... + v(j(k)))
。1 ≤ k ≤ n-m
添加k
。问题在于,在应用算法之前可能存在v(k) < l
v(k) > l
,而在应用算法之后w
可能存在n
。因此,仍然需要反复应用它。然而,它最多以m
步收敛到v
。
重复应用上一个算法相当于将l
的{{1}}最大条目替换为m
,然后对其余条目进行规范化,以便选择m
。有没有快速的方法可以找到w
或向量{{1}}的值,可能是线性时间?
答案 0 :(得分:0)
我的直觉(通常是错误的!)是你能做到的最好的时间是O(n log n)
。要在O(n log n)
时间内完成:
O(n log n)
- 例如MergeSort)O(n)
时间复杂度。)m
,现在可以很容易地决定常量时间是否通过将最大m
数字替换为1
并且规范化而获得的数组是你想要什么。 (所有数字的总和将是累计总数加上m
之一,因此您只需要检查(m+1)
- 最大值除以该总数的值。因此要查找{{1此阶段需要线性搜索m
。因此,此算法的总时间复杂度为O(n)
。