《趣題學演算法》 第0章0 4節演算法的正確性

2021-09-23 16:43:53 字數 1685 閱讀 3196

0.4 演算法的正確性

解決乙個計算問題的演算法是正確的,指的是對問題中任意合法的輸入均應得到對應的正確輸出。大多數情況下,問題的合法輸入無法窮盡,當然就無法窮盡輸出是否正確的驗證。即使合法輸入是有限的,窮盡所有輸出正確的驗證,在實踐中也許是得不償失的。但是,無論如何,我們需要保證設計出來的演算法的正確性。否則,演算法設計就是去了它的應用意義。因此,對設計出來的演算法在提交應用之前,應當說明它的正確性。這就需要借助我們對問題的認識與理解,利用數學、科學及邏輯推理來證實演算法是正確的。例如,對於解決「計算逆序數」問題的演算法0-1,其正確性可以表述為如下命題:

當第3~7行的for迴圈結束時,count已記錄下了序列a[1..n]中的逆序數。

如果我們能說明上述命題是真的,那就說明了演算法0-1是正確的。由於陣列a[1..n]的長度n是任意正整數,所以這是乙個與正整數相關的命題。數學中要證明乙個與正整數相關的命題有乙個有力的工具——數學歸納法。下面我們對本命題中的n進行歸納。

當n=1時第3~7行的for迴圈重複0次。count保持初始值0,這與a[1..n]=a[1]沒有任何逆序相符,結論顯然為真。

設n>1且可用演算法計算出a[1..n−1]的逆序數count。在此假設下,我們來證明對a[1..n]利用演算法0-1也能得到正確的逆序數count。

考慮演算法中第3~7行的for迴圈在j=n時的第一次重複的操作:第4~6行內嵌的for迴圈從i=1開始到j−1為止,逐一檢測是否a[i]>a[j]。若是,意味著找到乙個關於a[n]的逆序,第6行count自增1。當此迴圈結束時count中累積了關於a[n]的逆序數。由於n>1,故第3~6行的外圍for迴圈必定會繼續對a[1..n−1]做同樣的操作。根據歸納假設,我們知道第3~6行的for迴圈接下來的重複操作能將a[1..n−1]中個元素的逆序數累加到count中。所以第3~6行for迴圈結束時,count已記錄下了序列a[1..n]中的逆序數。

這樣,我們就從邏輯上證明了演算法0-1能正確地解決「計算逆序數」問題的乙個案例,即演算法0-1是正確的。

應當指出,解決乙個計算問題時,演算法不必唯一。資料的組織方式、解題思路的不同,會導致不同的演算法。

例如,將計數器count設定為全域性變數,並初始化為0。解決「計算逆序數」問題乙個案例的演算法還可以表示為如下的形式。

get-the-inversion(a, n)            ▷a[1..n]表示乙個序列

1 if n<2

2 then return

3 for i←1 to n-1

4 do if a[i]>a[n] ▷檢測到乙個逆序

5 then count←count+1 ▷累加到計數器

6 get-the-inversion(a, n-1)

演算法0-2 解決「計算逆序數」問題乙個案例的遞迴演算法偽**過程

這是乙個「遞迴」演算法,它在定義的內部(第6行)進行了一次自我呼叫。受上述演算法0-1正確性命題證明的啟發,這個演算法的思想是基於先計算出a[1..n-1]中關於a[n]的逆序數count,然後將問題歸結為計算a[1..n-1]的逆序數的子問題。用相同的方法解決子問題(遞迴呼叫自身,注意表示a的長度的第2個引數變成n-1)把子問題的解與count合併就可得到原問題的解。其實,演算法0-2與演算法0-1僅僅是表達形式不同,本質上等價的:後者用末尾遞迴(第6行遞迴呼叫自身)隱式地替代演算法0-1中第3~6行的外層for迴圈。所以,演算法0-2也是正確的。

《趣題學演算法》 第1章1 5節置換與輪換

1.5 置換與輪換 設有n個兩兩不等的元素a1,a2,an構成的集合a,考慮a到自身的乙個1 1變換 a 1 a1 a 2 a2 a n an 換句話說,a 1,a 2,a n是a1,a2,an的乙個重排。數學中,稱這樣的對應關係 為a的乙個置換。例1 集合a 2 1,4 2,3 3,1 4就是a上...

《趣題學演算法》 第1章1 3節加法原理和乘法原理

1.3 加法原理和乘法原理 組合數學中有兩條著名的原理 加法原理和乘法原理。利用這兩條原理可以快速地解決一些計數問題。加法原理 做一件事,完成它可以有n類辦法,在第一類辦法中有m1種不同的方法,在第二類辦法中有m2種不同的方法,在第n類辦法中有mn種不同的方法,那麼完成這件事共有n m1 m2 m3...

演算法第8章習題 8 13題

a 這個問題是屬於 p 的,解法如下 選取任意乙個v l 中的頂點s,以s為根節點進行深度優先搜尋,每當訪問到l中的頂點時,就停止向下擴充套件,使得l中的頂點成為葉節點。如果深度優先搜尋完成後,所有頂點都已經被訪問到,這顆生成樹即是滿足條件的。否則就說明這樣的生成樹不存在。b 是 np 完全的,因為...