在數學定理證明和電腦演算法設計之間採用類比的思想能夠為演算法設計提供一個極好的方法,通過解釋這種做法來瞭解這種關鍵思想,從而對此有更深的理解。
這篇文章在進行組合演算法設計和教學過程中展示了一種基於數學歸納法的方法,儘管這種方法並不能涵蓋設計演算法時的所有可能方法,但它包含了大部分已知的技術方法。同時這種方法也提供了一個極好的並且也是直觀的結構,從而在解釋演算法設計的時候顯得更有深度。這種方法的核心是通過對數學定理證明過程中和設計組合演算法過程中的兩種智力過程進行類比。儘管我們承認這兩種過程是為不同的目的服務的並且取得的是不同類型的結果,但是這兩者要比看上去的更加相似。這種說法可以通過一系列的演算法例子得到驗證,在這些演算法中都可以採用這種方法進行設計和解釋。我們相信通過學習這種方法,學生能夠對演算法產生更多的熱情,也能更深入更好的理解演算法。
數學歸納法是一個非常強大的證明方法。使用如下:讓T是一個我們想證明的定理。假設T包含一個值可為任意自然數的參數n。我們不需要直接證明T對所有的n都成立,我們只需要證明以下兩點:(1)T對n=1時成立 (2)對於任意的n>1,T對於n-1成立。第一點往往很容易證明,證明第二點在很多情況下要比直接證明定理要容易,因為此時我們可以假設T對n-1已經成立。(從某種意義上來說,我們無條件的獲得這一假設)。換句話說,減小定理的規模使用一個更小的n值而不是從頭開始證明是很有協助的,我們關注的就是這種減小。
這一原則對於演算法同樣也適用。歸納法讓人們關注於從較小的子問題延伸到那些更大的問題上。可以通過從問題的任意一個執行個體入手,通過假設規模較小的相同問題已經得到解決,然後再試圖解決該問題。例如,給定一個n(n>1)的序列對其進行排序(排序一個序列顯然沒必要),我們可以假定已經知道如何對n-1個數進行排序。然後我們可以要麼排序前n-1個數,然後把第n個數插入到正確位置(這引出了一個叫插入排序的演算法),要麼一開始把第n個數放在它的最終位置然後再排序剩下的數(這引出了一個叫選擇排序的演算法)。我們只需要解決對第n個數的操作(當然這並不是唯一的排序方法,也不是唯一一種使用歸納法進行排序的方法)。
上面介紹的使用歸納法的例子很直觀,然後有許多不同的方法來使用歸納法,由此帶來了不同的演算法設計技巧。