Loop Invariant 循环不变量

循环不变量是证明算法正确性的重要工具,尤其在循环结构中。以二分查找为例,通过添加哨兵元素确保循环不变量F(low, high):= (a[low] < v < a[high])在循环开始和每次迭代后保持为真,最终找到单调递增数列A中大于或等于目标值target的最小序号。循环终止条件为low == high-1,此时a[high]即为所求。" 130434168,10526265,QT主窗口组件详解,"['QT开发', 'GUI设计', '窗口组件', '软件界面']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

循环不变量(loop invariant)是一个不变量,被用来证明循环的特点,更多地,算法使用循环 (usually 正确性)。非正式的说,一个循环不变量是指在循环开始和循环中每一次迭代时永远为真的量,这意味着在循环中和循环结束时循环不变量和循环终止条件必须同时成立。

以二分法为例:已知 A[1..n] 是单调递增的数列,求 A 中所有大于或等于target的值中,最小的那一个的序号。

int binary_search(int* A, int n, int target){
	int low = 0, high = n-1;
	assert(A != NULL && n >= 0);
	while (low <= high){
		int mid = low + (high - low)/2;
		if (A[mid] == target)
			return mid;
		else if (A[mid] < target)
			low = mid + 1;
		else
			high = mid - 1;
	}

	return -1;
}

在循环中用到的变量是low, high,首先想到的循环不变量是 F(low, high) :=(a[low] <= v <= a[high]),但其中的问题也是显而易见的:循环开始时,v 可能小于a[1],也可能大于a[n],而在循环过程中,如果a[mid-1] < v < a[mid],或者 a[mid] < v < a[mid+1],也会导致F(low, high) 为假。

解决的方法是在 a 的首尾添加哨兵,即假设 a[0] == -∞,a[n+1] == +∞,循环开始时,low = 0,high = n+1,F(low, high):= (a[low] < v < a[high]) 为真。

循环过程中,当 a[mid] < v 时 low = mid,于是有F(low,high) := (a[low] < v

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值