RunningSum算法的循环不变量求解及运行结果确认
RunningSum算法的循环不变量求解及运行结果确认
先直接给你明确运行结果:你的第二个猜测是对的,最终输出会是{1,3,7,10},核心原因是这个算法是原地更新数组,每次迭代都会使用已经更新过的前一个元素值来计算当前元素,而不是原数组的原始值。
我们一步步拆解数组{1,2,4,3}的执行流程(这里默认算法描述里的数组是1-based索引,也就是第一个元素对应A[1],数组长度n=4):
- 初始状态:
A = [1, 2, 4, 3] - 第一次循环(i=2):
A[2] = A[2] + A[1] = 2 + 1 = 3,数组变为[1, 3, 4, 3] - 第二次循环(i=3):
A[3] = A[3] + A[2] = 4 + 3 = 7,数组变为[1, 3, 7, 3] - 第三次循环(i=4):
A[4] = A[4] + A[3] = 3 + 7 = 10,数组最终变为[1, 3, 7, 10]
你的第一个猜测错误是因为误用了原数组的前一个元素值,而忽略了算法会原地修改数组,后续迭代会依赖更新后的前缀和结果。
接下来是循环不变量的推导:
循环不变量是在循环的每次迭代开始前和结束后都保持成立的逻辑条件,是证明算法正确性的关键工具。针对这个RunningSum算法,合适的循环不变量可以定义为:
在循环迭代(i从2到n)开始时,对于所有满足
1 ≤ j ≤ i-1的j,A[j]等于原数组中前j个元素的累加和(即原A[1] + 原A[2] + ... + 原A[j])。
我们可以分三步验证这个不变量的正确性:
- 循环初始化(i=2时):此时i-1=1,
A[1]就是原数组的第一个元素,完全符合“前1个元素的累加和”,不变量成立。 - 迭代过程保持:假设当i=k时不变量成立(即
A[1]到A[k-1]都是原数组对应前j个元素的累加和),执行循环体后,A[k] = 原A[k] + A[k-1],也就是原A[k] + (原A[1]+...+原A[k-1]),正好等于原数组前k个元素的累加和。此时i变为k+1,对于所有j ≤ k,A[j]依然满足不变量的条件,因此不变量在迭代后依然成立。 - 循环终止(i=n+1时):此时i-1=n,意味着
A[1]到A[n]全部是原数组前j个元素的累加和,也就是整个数组已经转化为前缀和数组,完全符合算法的预期输出,证明算法是正确的。
备注:内容来源于stack exchange,提问作者Klea
相关产品推荐
相关产品推荐

