5個數通過6次比較求中位元的方法如下:
5個數之間的大小關係構成的一個樹形圖T。T中的一個結點代表一個數,而一條邊代表它所關聯的兩個數的大小關係,T的根就是中位元。顯然T中的一條
邊要由一次比賽來確定。在下面的圖中,如果x大於y,則節點x在節點y的上方且x和y有一條邊相連。另外,*表示一般的數,o表示下一次即將進行比較的兩
個數。
第1步,先任取兩個數比較,結果為:
*
|
* o o *
第2步,再取另外兩個數比較,結果為:
o o
| |
* * *
第3步,按照比較其中兩個標記為o的數,比較結果只有一種情況:
*
/ /
* o
|
* o
第4步,按照比較其中兩個標記為o的數,比較結果有兩種情況:
* o *
/ / / / /
o * o o
| | |
* * *
第5步,按照比較其中兩個標記為o的數,比較結果有兩種情況:
* * *
/ / / / /
/ // / /
| // | /
| / / | *
| / / | | /
|/ /| | /
o o | /
| o o
| |
| |
* *
第6步,按照比較其中兩個標記為o的數,比較結果有兩種情況:
* * * * * *
/ / / / | |
x x * *
| / / | |
* * * x x
| | / /
* * * *
|
*
其中的x就是中位元。
事實上,可以證明:對於n個數求中位元,至少需要3(n-1)/2次比較,並且存在一個O(n)次比較的演算法。
下面介紹如何利用對手論證方法來證明中位元問題的比較次數下界。
首先介紹“對手論證(Adversary Argument)”方法。
若用P表示所討論的問題,I表示問題的輸入,A表示求解問題P的基於比較運算的演算法T(A,I)表示對於輸入I演算法A的計算時間複雜性,那麼,函數
U(n)=min{max{T(A,I)}, for each I}, for each A,
是問題P當輸入的大小為n時在最壞情況下的最好下界。它是問題所固有的。
問題P的這個最好下界通常很難按其定義計算得到,因為對於一個具體的A,要得到
max{T(A,I)}, for each I
就是一件很難的事,更何況對於一切的A。因此,人們往往不去精確地求U(n),而是退而求其次,即找一個f(n),它不大於U(n)但盡量地接近於U(n),使f(n)成為問題P的一個好下界。
對手論證方法是找f(n)的一種有效方法。它的基本思想是對每一個A,構造一個輸入特殊的輸入I',使T(A,I')盡量地大,然後在所有A的集合上,求T(A,I')的盡量好的下界作為f(n)。這種方法通過
f(n) <= min{T(A,I')}, for each A <= min{max{T(A,I)}, for each I}, for each A = U(n)
來保證f(n)是問題P的一個下界,又通過使T(A,I')盡量大來保證f(n)是一個好的下界。
對手論證方法的關鍵在於有一套對一切A都適用的構造符合要求的I'的策略,即對手策略。這種策略,逐步地構造出一個輸入I',便演算法A為得到與幾相
應的結果,要做盡量多次的比較和判斷,從而使T(A,I')盡量大。需要注意的是,一方面對手策略須具有一致性,即不能前後矛盾,以保證I'的存在性;另
一方面對手策略還須對一切A都適用,因為我們需要在一切A組成的集合上求T(A,I')的下界。至於策略的具體內容將因問題而異。甚至同一個問題可能有多
種策略,要得到好的下界,需要有好的策略。
中位元問題的原型是:任給n個數,要求找出它們的中位元,即第[(n+1)/2]大的數。
下面我們用對手論證方法來證明中位元問題比較次數的下界為3(n-1)/2次。
不失一般性,這裡假設所給的n個數互不相同,且n為奇數。
我們用A表示求解中位元問題的任意一個基於比較的演算法。對於任意給定的輸入I,演算法A在最後輸出所要找的中位元之時,已經確定了I中哪(n-
1)/2個數大於該中位元和哪(n-1)/2個數小於該中位元。我們稱I中大於中位元的數為上部數,小於中位元的數為下部數。顯然,演算法最終從I中分出
(n-1)/2個上部數和(n-1)/2個下部數,靠的是"組織"一系列的比賽。一個數最後被確定為上部數,要麼曾經直接與中位元比賽過且贏了它,要麼曾
經與另一個上部數比賽過且贏了它;類似地,一個數最後被確定為下部數,要麼曾經直接與中位元比賽過且輸給它,要麼曾經與另一個下部數比賽過且輸給它。我們
稱演算法中同是上部數或同是下部數之間的比賽,以及上部數或下部數與中位元之間的比賽為關鍵性比賽;而稱演算法中分別是上部數和下部數的兩個數之間的比賽為非
關鍵性比賽。注意,只有關鍵性比賽才能使我們獲得有用的資訊,非關鍵性比賽並不能使我們獲得有用的資訊。若用N1(A,I),N2(A,I)和
T(A,I)分別表示對於輸人I演算法A的關鍵性比賽次數、非關鍵性比賽次數和計算時間複雜性,那麼我們明顯有
T(A,I) >= N1(A,I) + N2(A,I)
我們的目的是給出中位元問題的一個計算時間下界,即對於所有的演算法A,max{T(A,I)}的一個下界,而且希望這個下界的值盡量大。
為此,我們使用對手論證方法。對任意給定的演算法A,假設他的輸入為I,設M是不在I中的一個數,我們將從I出發,構造一個確定的輸入I'。因為非關
鍵性比賽不能使我們獲得有用資訊,是“無用”的比賽,為了得到盡量大的T(A,I'),我們構造的I'應該都使得N2(A,I')盡量地大。I中每兩數
x,y在進行比較前(參賽前)的狀態分別用N,N',L,S和E來表示,它們的含義依次是:
★ N : 該數未曾參加過比賽,且不是當前唯一的未參加過比賽的數;
★ N': 該數是當前唯一的末曾參加過比賽的數;
★ L : 該數已參加過比賽,且其值大於M;
★ S : 該數已參加過比賽,且其值小於M;
★ E : 該數已參加過比賽,且其值為M。
採取的對手策略如表1所示。注意,表1中的對手策略是一致的,因為I'中的數x,y只當在第一次參加比賽時(即x,y賽前狀態中有N'時)才會修改
x,y的值,一旦x,y的值被修改過了,以後再次參加比賽時就不再修改。表1中對手策略的關鍵是:當x,y第一次參加比賽時,如果該比賽可能成為關鍵性比
賽,則修改x,y的值使得該比賽便為非關鍵性比賽;在遇到最後一個參賽數時,將他的值修改為預先規定的中位元M的值。
表1 中位元問題的對手策略
+========+=======+=================================+============+===============+
| x:y賽前狀態 | | | x:y賽後狀態 |
|--------+-------| 對 手 策 略 | 比賽類型 +-------+-------+
| x | y | | | x | y |
+========+=======+=================================+============+=======+=======+
+========+=======+=================================+============+=======+=======+
| N | N | 若x>M且y>M,則減少y,使y<M; | 非關鍵性 | L | S |
| | +---------------------------------+------------+-------+-------+
| | | 若x<M且y<M,則增加x,使x>M; | 非關鍵性 | L | S |
| | +---------------------------------+------------+-------+-------+
| | | 若x<M且y>M,則不改變x,y | 非關鍵性 | S | L |
| | +---------------------------------+------------+-------+-------+
| | | 若x>M且y<M,則不改變x,y | 非關鍵性 | L | S |
+========+=======+=================================+============+=======+=======+
| L | L | 不改變x,y | 關鍵性 | L | L |
+========+=======+=================================+============+=======+=======+
| S | S | 不改變x,y | 關鍵性 | S | S |
+========+=======+=================================+============+=======+=======+
| E | E | 此情況不可能出現 | | - | - |
+========+=======+=================================+============+=======+=======+
| N' | N' | 此情況不可能出現 | - | - | - |
+========+=======+=================================+============+=======+=======+
+========+=======+=================================+============+=======+=======+
| L | N' | 不改變x的值,令y的值為M | 關鍵性 | L | E |
+========+=======+=================================+============+=======+=======+
| N' | L | 不改變y的值,令x的值為M | 關鍵性 | E | L |
+========+=======+=================================+============+=======+=======+
| S | N' | 不改變x的值,令y的值為M | 關鍵性 | S | E |
+========+=======+=================================+============+=======+=======+
| N' | S | 不改變y的值,令x的值為M | 關鍵性 | E | S |
+========+=======+=================================+============+=======+=======+
| N | N' | 若x<M,不改變x的值,令y的值為M | 關鍵性 | S | E |
| | +---------------------------------+------------+-------+-------+
| | | 若x>M,不改變x的值,令y的值為M | 關鍵性 | L | E |
+========+=======+=================================+============+=======+=======+
| N' | N | 若y<M,不改變y的值,令x的值為M | 關鍵性 | E | S |
| | +---------------------------------+------------+-------+-------+
| | | 若y>M,不改變y的值,令x的值為M | 關鍵性 | L | L |
+========+=======+=================================+============+=======+=======+
+========+=======+=================================+============+=======+=======+
| N | L | 若x>M,則減小x,使x<M; | 非關鍵性 | S | L |
+========+=======+=================================+============+=======+=======+
| L | N | 若y>M,則減少y,使y<M; | 非關鍵性 | L | S |
+========+=======+=================================+============+=======+=======+
| L | S | 不改變x,y | 非關鍵性 | L | S |
+========+=======+=================================+============+=======+=======+
| S | L | 不改變x,y | 非關鍵性 | S | L |
+========+=======+=================================+============+=======+=======+
| N | S | 若x<M,則增加x,使x>M; | 非關鍵性 | L | S |
+========+=======+=================================+============+=======+=======+
| S | N | 若y<M,則增加y,使y>M; | 非關鍵性 | S | L |
+========+=======+=================================+============+=======+=======+
+========+=======+=================================+============+=======+=======+
| N | E | 此情況不可能出現 | - | - | - |
+========+=======+=================================+============+=======+=======+
| E | N | 此情況不可能出現 | - | - | - |
+========+=======+=================================+============+=======+=======+
| L | E | 不改變x,y | 關鍵性 | L | E |
+========+=======+=================================+============+=======+=======+
| E | L | 不改變x,y | 關鍵性 | E | L |
+========+=======+=================================+============+=======+=======+
| S | E | 不改變x,y | 關鍵性 | S | E |
+========+=======+=================================+============+=======+=======+
| E | S | 不改變x,y | 關鍵性 | E | S |
+========+=======+=================================+============+=======+=======+
根據表1的策略,I'中的數只當它在第一次參賽時才被修改,更進一步,對於由該策略構造出來的I'的n個數,其中至少有n-2個數參加了非關鍵性的比賽。注意到n是奇數,因此演算法A對根據表1構造的輸入I'所“組織”的比賽中,非關鍵性的比賽至少有(n-1)/2次,即
N2(A,I') >= (n-1)/2 ------ (1)
下
面我們對於同一個I'來考慮N1(A,I')的界。如前所述,演算法A為了找出I'的中位元,必須識別出I'的(n-1)/2個上部數和(n-1)/2個下
部數。說得更具體些,演算法A至少必須識別出I'的n個數之間的大小關係構成的一個樹形圖T。T中的一個結點代表I'中的一個數,而一條邊代表它所關聯的兩
個數的大小關係,T的根就是中位元。顯然T中的一條邊要由一次比賽來確定,又因為一棵n個結點的樹有n-1條邊,因此T至少要有n-1次比賽才能夠確定,
而且這些比賽都必須是關鍵性的比賽。於是,我們有
N1(A,I') >= n-1 ------ (2)
綜合(1)(2)式可知:
max{T(A,I)} >= T(A,I') = N1(A,I') + N2(A,I') >= 3(n-1)/2
從而得到中位元問題的比較次數下界為3(n-1)/2。
至於最壞情況下O(n)次比較的選擇第k大元素的演算法,說起來比較麻煩,暫時就不說了(打字太累~~)