基于列的后向替换(Column BS)算法Flop计数偏差问题咨询
错误原因分析
你的推导问题出在双重求和项的阶数计算错误,你错误将随j变化的内层循环迭代次数当成了固定常数,才得到了线性的最高次项,正确推导过程如下:
步骤1:拆分总运算量公式
你给出的总Flop计数原式是正确的:
总Flops = 1 + (∑_{j=2}^n 1) + 2 * (∑_{j=2}^n ∑_{i=1}^{j-1} 1)
其中前两项是低次项:
- 末尾的1是x[1]的除法开销
- ∑_{j=2}^n 1 是j循环里每次迭代的x[j]除法开销,总共有n-1次,加上前面的1,这两部分合计为n次Flop,确实是线性阶,问题出在最后一项的双重求和。
步骤2:计算双重求和的阶数
内层求和∑_{i=1}^{j-1} 1的结果是j-1,也就是内层i循环的迭代次数随j的取值变化:当j=n时内层跑n-1次,j=n-1时跑n-2次,直到j=2时跑1次。
所以双重求和可以简化为:
∑_{j=2}^n ∑_{i=1}^{j-1} 1 = ∑_{j=2}^n (j-1) = ∑_{k=1}^{n-1} k = n(n-1)/2
代入原式最后一项:2 * n(n-1)/2 = n(n-1) ≈ n²,这就是最高次的平方项,符合上三角回代算法的理论复杂度。
小例子验证
取n=3手动计数验证:
- j=3:1次除法,内层i=1、2各执行2次Flop,合计1 + 2*2 = 5 Flop
- j=2:1次除法,内层i=1执行2次Flop,合计1+2=3 Flop
- 末尾x[1]除法:1 Flop
总Flop=5+3+1=9,和n²=9完全匹配,显然不是线性阶的2n=6。
内容的提问来源于stack exchange,提问作者GMDev
相关产品推荐
相关产品推荐

