设置:我有一个长度为K的向量 y 。让y i 为i th 元素, y < / strong> -i 是除了 th 之外的所有元素的(K-1) - 向量,即 y - i =(y 1 ,y 2 ,...,y i-1 ,y i + 1 子>,...,Y <子>ķ子>)。
目标:根据 y -i 的最大值迭代更新每个y i ,即y i ←foo(max( y -i )),其中foo()是一些已知函数。
所以,我的算法基本上是:
对于i = 1到K:
y i ←foo(max( y -i ))
这很好用,但我正在寻找一种更有效的算法,它不需要重新计算 y -i 的所有K-1元素的最大值每次迭代。我想更好的算法会使用 y 中只有一个元素改变每次迭代的事实。
P.S。我发现了其他关于查找移动最大值的StackExchange问题,但没有找到 y 更改的问题。
P.P.S。一点上下文,万一有人想知道:我正在编写一个Gibbs采样器,每个y i 的完整条件分布取决于 y - i 仅通过其max(所以foo实际上是一个随机数生成器,其中一个参数设置为max( y -i ))。
答案 0 :(得分:1)
我认为这摆脱了循环内部的循环,因此减少了从O(K ^ 2)到O(K)的时间,代价是所需的内存增加了三倍:
Max_to_end[K+1] = -infinity
Max_from_beginning[1] = -infinity
for i = K down to 1
Max_to_end[i] = max(Max_to_end[i+1],y[i])
for i = 1 to K
y[i] = foo(max(Max_from_beginning[i],Max_to_end[i+1]))
Max_from_beginning[i+1] = max(Max_from_beginning[i],y[i])
我们有两个新数组,所有元素的最大值但不包括y [i],以及y [i]包含的所有元素的最大值。
存在一个一个错误的危险,因此请仔细检查,与现有例程进行比较等。更改算法以使Max_from_beginning和Max_to_end数组都包含在内可能是有意义的他们的终点。没什么大不了的,无论在上下文中最有意义。