接上文:http://blog.csdn.net/jj12345jj198999/article/details/6634096
逆向歸納法【標題3】
這個技巧在數學中不經常使用,但是在電腦科學領域卻經常使用。普通的歸納法通過從一個基本情況(n=1)開始然後不斷推廣從而覆蓋所有的自然數。假設我們想要逆推。我們假設它對n成立想要證明它對n-1也成立。我們稱這種類型的證明為逆向歸納。但是,什麼是最基本的情況呢?我們能夠從一個n=M(M是一個非常大的數)的基本情況開始。如果我們證明它對n=M成立,然後我們就可以使用逆向歸納法從而證明對所有小於等於M的數也成立。儘管通常這樣是不符合要求的,但在一些情況下卻是滿足要求的。例如,假設我們把雙倍歸納法用於兩個變數(即圖中的頂點數和邊數)。我們可以對一個變數應用普通的歸納法,如果第二個變數能夠在第一個變數的範圍內有界,那就對第二個變數使用逆向歸納法。例如,在一個有n個頂點的有向圖中最多由n*(n-1)條邊。對於n我們可以使用普通的歸納法並假設所有的邊都是存在的(也就是說我們僅僅考慮完全圖),然後對邊的數目使用逆向歸納法。
一種更常見的使用逆向歸納法的做法如下。僅對n中一個值的基本情況證明能限制於對那些比該值更小的值的證明(補充:證明了一個值比它小的值也就可以證明了)。假設我們能夠直接對一個n取值無限的定理加以證明。例如無限集中包含所有2的冪。那麼我們就可以使用逆向歸納法覆蓋n的所有值。這是一種有效證明技巧,因為對於每個n取值在基本集中都存在一個比其大的值(由於集合式無限的)。
使用這種技巧的一個非常好的例子是在算術平均不等式和幾何平均不等式(柯西不等式)中用到的優雅的證明方法(例子見[3])。當證明數學定理時,從n到n-1往往不比從n-1到n簡單,同時證明一個無限集的基本情況要比一個簡單集的基本情況困難的多。在設計演算法時,與之相反的是,從n到n-1總是很容易,也就是針對更小的輸入規模的問題求解。例如,我們可以引入那些不影響輸出的假資料。結論是,在很多情況下不根據輸入量的各種大小而是根據從無限集中取得的大小來設計演算法往往是充分的。最常見的使用這種原理的做法是在設計演算法時僅考慮是2的冪的n的大小輸入。這使得設計更簡潔也排除了很多雜亂的細節。很顯然這些細節最終也需要被解決,但是它們往往很容易處理。例如在最近對問題中,我們使用n是2的冪的假設。
明智的選擇歸納法的基本情況【標題2】
很多遞迴演算法(例如快排)對於小問題而言效果並不是很好。當問題被簡化為一個小問題時,可以使用另一種簡單的演算法(例如插入排序)。從歸納法來看,這中做法符合選擇一種n=k(k依據問題來定)基本情況然後使用一種直接的技巧來解決這種基本情況的思想。有些例子中這種做法甚至能夠改善演算法的漸近已耗用時間[12]。
結論【標題2】
我們展示了一種解釋和使用組合演算法設計的方法。使用這種普通的方法的好處是兩方面的。首先,它給演算法設計者們提供了一個更加統一的“進攻路線”(處理問題方法)。給定一個待解決的問題,一個人可以通過使用文章中描述和闡明的技巧嘗試找到一個解法。由於這些技巧有一些相似的地方(也就是數學歸納法),對它們全部進行嘗試的過程能夠被更好的理解也更容易進行。第二點,它提供了一種解釋現有演算法的的更統一的方法,使得學生能更多的參與創造過程。同時,對於演算法正確性的證明在描述中占更重要的部分。我們相信這種方法能夠包含在對組合演算法進行教學之中。
感謝:感謝Rachel Manber帶來很多關于歸納法和演算法極富啟發學習法的對話。感謝Greg Andrews, Darrah Chavey, Irv Elshoff,Susan Horwitz, Sanjay Manchanda, Kirk Pruhs, and Sun Wu在手稿的改進方面提供了很多有益的意見。
全文完