zoukankan      html  css  js  c++  java
  • 循环不变式(loop invariant)

    循环不变式是一种条件式(必须满足的条件,对循环而言是保持不变的,无论循环执行了多少次),循环语句没执行一次,就要求中间的结果必须符合不变式的要求。

    • (1)进入循环语句时,不变式必须成立;
    • (2)循环语句的循环体不能破坏不变式。也就是说,循环体开始循环时不变式成立,结束时也必须成立;
    • (3)如果循环语句终止时不变式,依旧成立,那么至少说明,循环在保持循环不变式上没有犯错。
    // (**) 不变式在进入循环之前必须成立
    while () {
        // 循环体开始
        ...
        // 循环体结束
        // (**) 不变式在此处也必须成立
    }

    1. 插入排序的循环不变式

    插入排序由 N-1 趟(pass)排序组成。对于 P = 1 趟到 P = N-1 趟,插入排序保证从位置 0 到位置 P 上的元素为已排序状态(sorted)。

    也即从位置 0 到位置 P-1 上的元素是已排序的。

    typedef int ElementType;
    void InsertionSort(ElementType* A, int N) {
        int j, P;
        ElementType Tmp;
        for (P = 1; P < N; ++P) {
            Tmp = A[P];
    
            // 应用循环不变式的地方
            // 因为前 0 ~ P-1 位置上所有的元素都是位于已排序的状态;
            // 所以当第一次出现 A[j-1] <= Tmp; 便找到了 Tmp 应该插入的位置
            for (j = P; j > 0 && A[j-1] > Tmp; --j) {
                A[j] = A[j-1];
            }
    
            A[j] = Tmp;
        }
    }
  • 相关阅读:
    java基础--日期--练习集锦
    java基础-数字与字符串-练习集锦
    java-多态-之疑惑
    java-接口与多态-
    java基础 -继承-练习集锦
    java基础-对象-练习集锦
    java基础--数组--练习集锦
    hibernate第二天
    jquery的一些笔记
    struts入门2
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9423551.html
Copyright © 2011-2022 走看看