對手論證,一般用於給出問題的下界。若用$P$表示所討論的問題,$I$表示問題的輸入,$A$表示解決問題的基於比較運算的算法,$T(\,A,\,I)$表示對於輸入$I$,算法$A$的計算時間復雜性,那么函數$U(n)=min\{max\{T(A,\,I)\},\text{ for each } I\},\text{for each } A$表示問題$P$在輸入大小為$n$時在最壞情況下的最好時間下界,它是問題所固有的。
對手論證的基本思想是對每一個$A$構造一個輸入特殊的輸入$I'$,使$T(A,\,I')$盡量地大,然后在所有$A$的集合上,求$T(A,\,I')$的盡量小的下界作為$f(n)$。對手論證方法的關鍵在於有一套對於一切$A$的適用的構造符合要求的$I'$的策略,即對手策略,逐步第構造出一個輸入$I'$,使算法$A$如果想達到預期的結果,要做盡量多次的比較和判斷,從而使$T(A,\,I')$盡量大。需要注意的是,一方面對手策略需具有一致性,即不能前后矛盾,以保證$I'$的存在性;另一方面對手策略還必須對一切$A$都適用,因為我們需要在一切$A$組成的集合上求$T(A,\,I')$得下界。
1. Find $2^{nd}$ Largest Number
我們知道,找到數組中元素的最大值,需要至少進行$n-1$次比較,那么找到第二大的呢?暴力算法就是在找一次最大唄,又是$n-2$次比較,總共是$2n-3$次比較。乍看起來也不錯了,但是通過對手論證的分析,比較的總次數可以減少為$n+\lceil \log n \rceil -2$次。How to?
其實,所謂的第二大的元素,應該是在比較中僅僅輸給了最大元素,也就是說,只有跟最大的那個元素比過的敗者才有可能是。我們下面要說明的是,我們要找的第二大的元素應該是在那些跟最大元素比過的$\lceil \log n \rceil$個元素中。
在對手論證中,我們每次都是選擇兩兩配對,然后進行比較,這樣的話,每次配對完后的比較,數據規模都縮減一半,也就是說,總共經過$\lceil \log n \rceil$輪的比較,把這些輸給最大數的元素拿出來,進行一次find-Max,開銷是$O(\lceil \log n \rceil)$就可以找到第二大的啦!!
這里其實並不是嚴格的論證,只是證明了這個界是可以達到的,詳細證明請參見這兒
2. Find Max and Min
這里也能夠使用對手論證的方式得出其最少的比較次數為$\left\lceil \frac{3}{2}n \right\rceil - 2$,具體的證明同樣參見上述鏈接
下面,我們就來說說是怎么辦到的吧,首先兩兩配對,共進行$\left\lceil \frac{1}{2}n \right\rceil$次比較,將這里面的勝者和敗者分別分為兩組,再在兩組內分別挑選Max和Min,代價是$2\times (\left\lceil \frac{1}{2}n \right\rceil-1)$,這樣就可以得到Max和Min,總共的比較次數就是$\left\lceil \frac{3}{2}n \right\rceil - 2$啦。
3. Matrix Search
這個問題有一個十分美好的前提,那就是我們所給的$n\times n$矩陣是行列皆有序的,在這樣的條件下,我們要尋找某個元素$x$在不在矩陣中,通過對手論證,我們可以做到線性時間$O(n)$。
首先是一個並不高效的方法,對每一行采用二分搜索,最多搜索$n$行,所以復雜度為$O(n\log n)$
這里有一個超級機智的算法,<Step-wise線性搜索>從右上角開始,每次將搜索值$x$與右上角的值比較,如果大於右上角的值,則直接去除1行,否則,則去掉1列。如下所示,展示了在矩陣中查找$x=28$的過程
在對手論證中,我們只需要盡可能的構造一個數去查找,但是總是不滿足條件,比如找不到的情況,就能達到最壞情況,而最短時間就是采用這種<Step-wise>方法了。這種查找方式最多也就是遍歷完兩遍對角線,總共的探查次數最多為$n+n-1=2n-1$,所以復雜度為$O(n)$。
4. 25 Horses select $1^{st}, 2^{nd}, 3^{rd}$
問題描述:有25匹賽馬,一片場地只有5條賽道,現在要求你用盡可能少的比賽場次來選出最快的前三名。
首先,至少每一匹馬都有機會去跑一遍,所以至少要先比賽5場,得出總共25匹馬的5個小組排名。接着,就是把每一組的冠軍拿出來遛遛,第6場過后,我們就能選出冠軍了,同時,我們也知道這第六場中的最后兩名一定不可能是前三名了,因為他們至少都要輸給已知的3匹馬。順帶着,這兩匹不可能的賽馬所在小組里的馬廄都不可能了,想想小組第一都敗了。(咦,當年翁學姐小組第一但是沒出線就是這么一回事兒啊!!!)那么問題來了,下面只用一場比賽能夠搞定么?答案是:可以!!
我們先給出競賽的情況,
每一行上,從快到慢排序,不失一般性,小組第一的就是$X1,\ X=A,B,C,D,E$,我們假設第六場比賽$A1>B1>C1>D1>E1$,$>$表示快的比較。那么$A1$一定是冠軍!下面可能是第二、第三的只可能是$A2,\,A3,\,B1,\,B2,\,C1$這5個。為什么不可能是$C2$呢?因為$C2$至少輸給了$C1$,而$C1$又至少輸給了$A1$和$B1$,那么$C2$的最好成績也不過是第四,其他的情況也是類似的分析。
所以在這第七場,遛一遛$A2,\,A3,\,B1,\,B2,\,C1$,就有第二、第三名產生了。
<算法的Mid-Exam的三大分析方法至此完結撒花!>