循环不变式?

boy8765 2009-07-16 11:20:50
谁能说清循环不变式?或者是提供关于循环不变式的写得较好的文档?
...全文
103 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
boy8765 2009-07-18
  • 打赏
  • 举报
回复
大家可否再说说?
Aeris 2009-07-17
  • 打赏
  • 举报
回复
循环不变式通常用于证明算法和程序的正确性。

通常用处不大,但是在净室软件工程的形式化方法中有重要意义。

yshuise 2009-07-17
  • 打赏
  • 举报
回复
循环不变式是《算法导论》里面的:
就是指:那段代码用for, while 写成的,条件变化,代码一样,功能也几乎一样(对不同值不一样)
amossavez 2009-07-17
  • 打赏
  • 举报
回复
不是很清楚
http://nickyye.javaeye.com/blog/374251
pengzhixi 2009-07-16
  • 打赏
  • 举报
回复
似乎和归纳法里面的那个在i=0;下成立,如果i=k下面成立 那么i=k+1下也成立这样的式子类似吧
  • 打赏
  • 举报
回复
看来就是在循环内及循环结束的时候都成立的表达式
一般而言,用这个式子表示希望得到的结果,如果在循环的每一步,这个式子都是正确的,那么循环结束后,这个式子也正确,并得到了期望的结果.
例子是这样的:
QUOTE:
apvector<int> list(n); // n is some positive integer
int k, indexMax;
<code which assigns values to all entries in list>

indexMax = 0;
for(k = 1; k < list.length(); k++){
// invariant true here
if (list[k] > list[indexMax])
indexMax = k;
}
这是一个很简单的求最大值(在数组中的下标)的问题,在循环内// invariant true here 处可以指明始终成立的不变式为:

QUOTE:
在当前的k之前, 最大值的下标是indexMax, 而且0<=indexMax<k
可以看出这个式子在整个循环过程中是始终成立的,所以在循环结束的时候(k=list.length()),这个式子也成立,
即:

QUOTE:
在整个list中,最大值的下标是indexMax, 而且0<=indexMax<list.length()
这就是我们期望得到的结果,也就是说我们得到了最大值的下标

算法导论中有这个概念:

算法导论第二章中的原文是:We state these properties of A[1 ‥ j -1] formally as a loop invariant。其中举的例子是插入排序,每次循环从数组A中取出第j个元素插入有序区A[1 .. j-1],然后递增j。这样A[1 .. j-1]的有序性始终得到保持,这就是所谓的“循环不变”了。
这个概念主要用来检验算法的正确性。
原文如下:We use loop invariants to help us understand why an algorithm is correct. We must show three things about a loop invariant:

Initialization: It is true prior to the first iteration of the loop.

Maintenance: If it is true before an iteration of the loop, it remains true before the next iteration.

Termination: When the loop terminates, the invariant gives us a useful property that helps show that the algorithm is correct.


1. 初始化(循环第一次迭代之前)的时候,A[1 ‥ j -1]的“有序性”是成立的;
2. 在循环的每次迭代过程中,A[1 ‥ j -1]的“有序性”仍然保持;
3. 循环结束的时候,A[1 ‥ j -1]的“有序性”仍然成立。
wokao112358 2009-07-16
  • 打赏
  • 举报
回复
这种循环不变式在实际应用当中有什么突出的优势吗?

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧