演算法導論·《迴圈不變式》
當我們編寫一則演算法時必定是期望對資料處理以達到某種效果,例如對於雜亂的數列進行大到小排序,那麼在迴圈前,迴圈中和迴圈結束時數列保持不變的性質,稱為迴圈不變式。
數列可以具有多個性質不變,就像插入排序,對於A[1...j-1]總是排序好的數列,並且A[j-1]比前方的數都要大或小。這兩個性質形式地表示為迴圈不變式。
迴圈前:第一次迴圈迭代前,即第一次檢驗迴圈條件之前and迴圈初始條件之後。
迴圈中:迴圈過程中性質不發生改變。即在插入排序中,不會出現A[1...j-1]沒有排序好的情況。
迴圈結束時:也就是演算法結束時,數列的性質仍然成立,進而證明演算法已經對資料處理達到我們想要的效果。
迴圈不變式是用來證明演算法的正確性。
1·1·1·1·1=1;1·1·0·1·1·=0;迴圈不變式要求數列的性質在演算法執行過程中始終為真,即1。而一旦為0,演算法就不正確或者該性質不能成為迴圈不變式。
相關推薦
演算法導論-迴圈不變式、插入排序、歸併排序
迴圈不變式演算法導論第二章中的原文是:We state these properties of A[1 ‥ j -1] formally as a loop invariant。其中舉的例子是插入排序,每次迴圈從陣列A中取出第j個元素插入有序區A[1 .. j-1],然後遞
演算法導論 第二章:演算法入門 筆記 (插入排序、迴圈不變式、演算法分析、最好和最壞時間複雜度、選擇排序、分治法、合併排序)
插入排序: 排序問題的定義如下: 輸入:N個數{a1, a2,..., an }。 輸出:輸入序列的一個排列{a'1 ,a'1 ,...,a'n },使得a'n <=a' n<=...<
演算法導論學習-數學歸納法與迴圈不變式理解
數學歸納法: 最簡單和常見的數學歸納法是證明當n等於任意一個自然數時某命題成立。證明分下面兩步: 證明當n= 1時命題成立。 假設n=m時命題成立,那麼可以推導出在n=m+1時命題也成立。(m代表任意自然數) 這種方法的原理在於:首先證明在某個起點值時命題成立,然後證
演算法導論·《迴圈不變式》
當我們編寫一則演算法時必定是期望對資料處理以達到某種效果,例如對於雜亂的數列進行大到小排序,那麼在迴圈前,迴圈中和迴圈結束時數列保持不變的性質,稱為迴圈不變式。數列可以具有多個性質不變,就像插入排序,對於A[1...j-1]總是排序好的數列,並且A[j-1]比前方的數都要大或
演算法導論 第二章 迴圈不變式(loop invariant)
Next, we tackle the second property: showing that each iteration maintains the loop invariant. Informally, the body of the outer for loop works by moving
迴圈不變式---演算法導論
迴圈不變式:個人理解為具有迴圈不變性的迴圈變數 迴圈不變性:在程式迴圈中不斷的重複相同的動作的特性 排序中,每次迴圈都需要: 1. 保持元素還是原先的元素 2. 每一次的迴圈都能部分的排好順序
演算法基礎-使用迴圈不變式解決插入排序問題
思想是直接插入排序,即每次拿一個數字向已排序好的數字中插入,採用迴圈不變式的設計思想。 迴圈不變式:一般而言,用這個式子表示希望得到的結果,如果在迴圈的每一步,這個式子都是正確的,那麼迴圈結束
巧用迴圈不變式書寫正確的二分查詢演算法(看不懂我撞牆)
1.二分查詢介紹 在進行開始之前,我們縣要來正確的認識一下什麼是二分查詢演算法 上過數值分析這門課的同學一定在迭代那一刻裡面清楚的瞭解過一個名詞叫做對分法 實際上,對分法的本質就是二分查詢 下面我們來介紹一下二分查詢演算法 Binary-Search 是不同於順序掃描的一種
插入排序與迴圈不變式
插入排序 《演算法導論》第一部分中並沒有詳細講解某一種演算法,而是以講解演算法這個概念,而插入排序是講解演算法基礎的例子。 輸入: n 個數的一個序列 <a1, a2, ..., an>。 輸出: 輸入序列的一個排列 <a1', a2', ..., an'> 因
迴圈不變式
迴圈不變式 迴圈不變式其主要是用來幫助我們理解和證明演算法的正確性。 關於迴圈不變式我們必須證明三個性質: 初始化:它在迴圈的第一輪迭代開始之前,應該是正確的。 保持:如果在某一次迴圈迭代開始之前是正確的,那麼在下一次迭代開始之前,它也應該保持正確。 結束:當迴圈
寫迴圈體的技巧-----迴圈不變式(loop invariant)
迴圈不變式是一種條件式(必須滿足的條件,對迴圈而言是保持不變的,無論迴圈執行了多少次),迴圈語句沒執行一次,就要求中間的結果必須符合不變式的要求。(1)進入迴圈語句時,不變式必須成立;(2)迴圈語句的迴圈體不能破壞不變式。也就是說,迴圈體開始迴圈時不變式成立,結束時也必須成立
如何寫出正確的二分查詢?——利用迴圈不變式理解二分查詢及其變體的正確性以及構造方式
序言 本文以經典的二分查詢為例,介紹如何使用迴圈不變式來理解演算法並利用迴圈不變式在原始演算法的基礎上根據需要產生演算法的變體。謹以本文獻給在理解演算法思路時沒有頭緒而又不甘心於死記硬背的人。 二分查詢究竟有多重要?《程式設計之美》第2.16節的最長遞增子序列
[珠璣之櫝]淺談程式碼正確性:迴圈不變式、斷言、debug
這個主題和程式碼的實際寫作有關,而且內容和用法相互交織,以下只是對於其內容的一個劃分。《程式設計珠璣》上只用了兩個章節20頁左右的篇幅介紹,如果希望能獲得更多的例項和技巧,我比較推崇《程式設計實踐》 (Practise of Programming)、《程式設計精粹:編寫高質量C語言程式碼》(Writin
二分查詢變形記:從迴圈不變數說起
二分查詢 二分查詢 二分查詢迴圈不變數 首選我們介紹標題中提到的兩個名詞: 二分查詢 二分查詢的搜尋過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則查詢成功;如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一
【c++語言基礎】關於C++中的不變式(invariant)
類必須實現不變式(Classes Should Enforce Invariants) Bjarne Stroustrup: 我的基本原則式真正的類必須有一個介面,有一個隱含的不變式(invariant) Bill Venners: 不變式(invari
演算法導論 第四章:遞迴式 筆記(代換法、遞迴樹方法、主方法、主定理的證明)
三種解遞迴式的方法:代換法、遞迴樹方法、主方法。 代換法: 用代換法解遞迴式需要兩個步驟: 猜測解的形式; 用數學歸納法找出使解真正有效的常數。 如: T(n) = 2T(n/2) + n,這個是合併排序的執行時間的遞迴表示式。歸併排序法的執行時間是O(nlgn),那麼我
【演算法】字串的排列與其變式題
面試題38:字串的排列 輸入一個字串,打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a、b、c所能排列出來的所有字串abc、acb、bac、bca、cab和cba。 把第一個字元和後面所有字元交換,則第一個位置可以出現所有種字元。其中又將該字元固
二分查詢演算法及其變式(Python)
二分查詢演算法是一種非常常用而且筆試很容易考到的演算法,但是演算法導論這本書上居然沒有講到,在這裡寫一篇blog做個記錄 1.經典二分查詢,從列表中找到一個數的索引 def search(a, p, r
迴圈不變性(loop invariant)-證明演算法的正確性的一種方法
迴圈不變性是在演算法中迴圈的前後都保持不變的一種屬性。 利用迴圈不變性證明演算法正確應該滿足3個條件:(演算法導論中提到的) 初始條件: 首次迴圈前不變性成立 保持條件: 一次迴圈前不變性如果成立,則下次迴圈開始前不變性成立 終止條件: 迴圈結束後,迴圈不變性應能表明程式的
[演算法導論] 遞迴式求解的三種方法
求解遞迴式,《演算法導論》上給出了三種方法,不過對我而言,遞迴樹法和主方法往往更加有效。給出的建議是,先用主方法求解,如果不能使用的情況嘗試用遞迴樹求解,如果還不行只有用代入法。代入法作為一種求解+證明的方法需要我們猜測解的形式,比較麻煩。 (一)代換法: