标签:line str article htm 面试 key == 很多 存在
在面试某手的时候,完成了一个有序链表的合并,之后面试官又要求用循环不变式来证明算法的正确性……循环不变式?这是啥
后来发现这是算法导论第一章的内容。
不会=算法导论没看
必须证明三条性质
前两步有点类似于数学归纳法,而最后一步其实也很重要,因为算法并不是无穷无尽的,必须要终止。例如二分,终止条件非常重要。
for(i = 2;i <= n;++i){
key = a[i];
j = i - 1;
while(j > 0 && a[j] > key){
a[j+1] = a[j];
j--;
}
a[j] = key;
}
在一个有序的数列里插入一个数,插到正确的位置同时比它大的后移,就是这个算法的思想
那就按照循环不变式这个算法的正确性
这个证明不是太数学,而是比较感性的,但也可以说明问题
之前说过,一个二分算法的正确性,终止条件很重要
https://www.cnblogs.com/smallocean/p/11913963.html 这是之前做过二分的笔记
while(l<r){
int mid = (l+r)>>1;/*右移运算 相当于除2并且向下取整*/
if(a[mid]>=x) r=mid;
else l=mid+1;
}
return a[l];
while(l<r){
int mid = (l+r+1)>>1;
if(a[mid]<=x) l=mid;
else r=mid-1;
}
return a[l];
(l+r)>>1
那么会取到\(l\),如果\(l\)满足,那么将陷入死循环。有一篇总结很好的文章:https://blog.csdn.net/ltyqljhwcm/article/details/52772002
总的来说循环不变式是一个很好的思想,能帮助我们证明算法的正确性。前两步的类似数学归纳的方法和终止时候的正确性,其实在平时写代码的时候也会不经意间用到类似的方法来想。这次把这种思路书面化,以后也不会再走很多弯路了。
标签:line str article htm 面试 key == 很多 存在
原文地址:https://www.cnblogs.com/smallocean/p/12602356.html