.原載於數學傳播第二卷第四期 .作者當時任職於美國貝爾實驗室 | |||
整理與合併問題
黃光明 |
假設有 n 個物品,重量互異,我們要把這些物品按照其重量大小整理起來。我們所有的工具是一個有兩個托盤的天平,兩端放上東西後,天平可以指出孰重孰輕。現在假設每一次秤時,每個托盤中祇能放一樣東西,問最少需秤多少次才能「保證」整理完成。這是「整理」(sorting) 問題。 令 I1,I2,…,In 代表這 n 個物品,當運氣好時我們可能在第一次秤時,發現 I1 比 I2 重,第二次秤時,發現 I2 比 I3 重,……,第 n-1 次秤時,發現 In-1 比 In 重。則一共祇用了 n-1 次,就可把 n 個物品整好,即 ,但運氣不這麼好時,很顯然 n-1 次就不夠了。我們關心的,是在運氣最壞時,你提出的方法需要秤多少次。換句話說,不管運氣如何,你的方法必需保證秤這麼多次後,一定可以整理完畢。我們現在以這個「保證數」來比較不同的方法,而要選一個保證數最小者,稱為最佳法。 假如有兩堆個數分別為 m 和 n 的物品,已分別整理好。現在要把這兩堆物品合併成一堆(仍需整理好),問最少需再秤多少次,才能保證合併完成。這是兩個集合的「合併」(merging) 問題。合併問題可以推廣到 s 個集合,不過本文祇牽涉了兩個集合的情形。
Steinhaus(參考 9)首先提出整理問題。他建議一個遞歸 (recursive) 法來整理 n 個物品。即先整理好 I1,I2,…,Ik+1,再把 Ik+1 合併進去,使 I1,I2,…,Ik+1 都整理好。如此從 k=1 一直到 k=n-1 遞歸進行,在最後一次把 In 合併入已整理好的 I1,I2,…,In-1 後,即完成了 n 個物品的整理。
令
為已整理 {I1,I2,…,Ik},則 Ik+1 合併入 {J1,J2,…,Jk} 用的是中分法 (binary insertion),即把 Ik+1 和 {J1,J2,…,Jk} 中重量居中的一個物品(如有二物品居中,任擇其一)放上天平兩端比較。假設 Jh 是拿來和 Ik+1 比較的物品。當 Ik+1 比 Jh 重時,下一次即從 {J1,J2,…,Jk-1} 中選出一重量居中的物品和 Ik+1 比較,當 Ik+1 比 Jh 輕時,下一次即從
{Jh+1,Jh+2,…,Jk} 中選出一重量居中的物品和 Ik+1 比較,如此重複進行,一直到 Ik+1,在 {J1,J2,…,Jk} 中的位置完全確定,即 {I1,I2,…,Ik+1}已整理好成{J1, J2,…,Jk+1} 時始畢。定義
為不超過(不低於)x 值的整數中最大(小)的一個(如
)則把 Ik+1 合併入 {J1,J2,…,Jk} 至多需比較
次,所以 Steinhaus 的遞歸法可以在
次數內保證完成整理(參考3)。 Ford 和 Johnson(以下簡稱 FJ)提出一不同的遞歸法。此法可以分成三個步驟: 一、把I2i-1和I2i比較, ,共比 次。 每一次比較中, 較大的一個我們稱之為勝者,較小的為敗者。 二、把第一步中 個勝者以Ford-Johnson法整理好。在第二步後, n個物品之間的關係可以用下圖表示:
此處每一圓圈代表一物品," "代表左端物品少於右端物品, 勝者以 ai 為名,敗者以 bi 為名。 在 之右有一虛線圓圈, 這代表當n為奇數時未參與第一步中比較的In(當n為偶數時,此虛圓圈不存在)。第三步要作的事是如何把bi插到已經整理好的 {ai} 中。其中 bi 不需經任何比較即可插到 ai 之後。FJ 提出的辦法是第三個步驟。 三、把 按照先後次序分為若干組, 如{b2,b3}是第一組,{b4,b5} 是第二組, 是第三組等。然後按照組的次序一組一組的插入ai中。 如何把一組bi插入{ai}中呢?仍是一個一個的以中分法合併入{ai}的次序應為 b3,b2,b5,b4,b11,b10, b9,b8, 。何以要規定這樣的次序呢? 因為這樣的次序所需比較的數目最少。注意在此次序中,第j組的每一個bi都只需j+1次比較即可合併 {ai}。譬如b3合併入 {b1,a1,a2},祇需比兩次。在最壞的情形下,b3小於a2,則b2 要和 {b1,a1,a3}合併,也祇需要比兩次。如果合併的次序是b2在b3之前,則b2合併入{b1,a1}固然祇需要比兩次,但b3和 {b1,a1,b2,a2}合併就要三次了。 讀者可試證FJ所提出的合併次序的確是最好的次序。
令FJ(n)為以FJ法整理n個物品時的保證數,則可算出(參考5)
比較FJ(n)和S(n)即知對任何一個n,FJ(n)都小於或等於S(n),同時自1959年FJ提出他們的方法後,也沒有任何一個其它方法在任何一個n上能得到比FJ(n)小的保證數。因此不少人以為FJ法對所有n的而言都是最好的整理法。但是只有在某些n值時,我們可以證明FJ(n)是最小的保證數。 證明的方法是利用資訊理論得到 任何一個整理n個物品的方法的保證數必不小於 的結論。 在或n=20,21時, ,因此在這些n值時,FJ法必為最佳法。 在其它的n值時FJ(n)都大於 , 那麼FJ法究竟是否最佳法呢?FJ(n)第一次不等於 是當n=12時,此時FJ(12)=30, 而 。所以要解答FJ法是否最佳之謎, 第一道要攻破的關口就是n=12時。在1965年,Wells(參考8)花了不少的計算機時間, 終於算出了整理12個物品最少需要30次,即FJ法在n=12時,仍為最佳法。 這一結果大大的增強了認為 FJ 法即最佳法的人的信心,但基本的謎題仍在。
一直到1977年,這個謎題才被解出。Manacher(參考7)證明了在無限多的n值時,
FJ(n)都不是最低的保證數。他找到最小的這樣一個n是當n=191時,這時FJ(n)=1192,
而Manacher的方法祇需1191次比較。我們現在來簡略的解釋Manacher的做法。我們知道當n大時
而FJ(n)則在 和 之間循環(參考7)。換句話說,在有些n時,FJ(n) 很接近 ,因此可能不容易再找到別的一個方法有更小的保證數。但在另一些 n 時,FJ(N) 和 相差較大,似乎有改進的餘地。我們把前一類 n 稱為好 n,後一類 n 稱為壞 n。Manacher 的想法是當 n 是壞n時,也許可以找到兩個數n1和n2其和為n,而n1和n2都是好n。在這情形下,我們可以把整理n個物品的原題分解成兩個子題, 其一是整理n1個物品,其二是整理n2個物品, 最後再把這兩組整理好的物品合併起來。令 Mt (n1, n2)為以 t 法併合 n1 和 n2 個物品時所需的比較 則當
Mt(n1,n2)<FJ(n)-FJ(n1)-FJ(n2)
時,此法即可勝過FJ法。
這樣的n果然找到了。設n1為一好n,則
也是一個好n,
但
則是一個壞n,這時
問題是有沒有一個方法t在合併n1和n2時所需的保證數小於 ?
在現有的合併法中,最好的一個是筆者和林甡君設計的HL法(參考4),
在合併n1和n2等於時約需
次比較。所以HL法還不能達到我們的要求。但是若能略加改進HL法, 使得它的保證數變為 ,則不管c是多小的一個正數, 當n1夠大時cn1會比 大。這是因為 其中 是一個常數,而當n1夠大時, cn1會比大很多。 因此改進HL的方法會達到我們的要求。 在合併兩個集合時,如我們把含較多物的一個集合稱為大集合,含較少物的稱為小集合, 則HL法是把小集合中的物品按照已整理好的次序一個接一個的併入大集合中。 譬如說我們選了從重到輕的次序,則小集合中最重的一個第一個要合併入大集合中,在此物的合併未完成前, 我們不考慮小集合中任何其它的物品。等最重的一物已被合併入大集合中後,則開始第二重物的合併, 如此類推。Manacher(參考6)提出的改進法,是把小集合中之物按照次序分為若干組,每組m物。 每次合併以組為單位,即一組未合併完成前,不考慮其它組,但同組中的物品可同時進行合併。 譬如X和Y兩物同一組,則我們可以第一次比較X(和大集合某物),第二次比較Y,第三次再比較X等。 注意HL法是Manacher法當m=1時的特例。Manacher算出了當m=3或4時, 即可顯著改進HL法而達到 的保證數。 Manacher法雖然贏了FJ法,但它仍不是最佳法。因此最佳法是什麼成了一個新的謎題。 在一些特定的n值上改善Manacher法並不難,但是如何能有一通盤性的改善,則尚待研究。 其中的一條路是徹底瞭解合併n物和m物時,特別是當m很小時,最小的保證數是什麼? 令fm(k)為一滿足下列條件的n值:合併fm(k)和m的保證數為k, 但合併fm(k)+1和m的保證數為k+1; 換句話說fm(k)是最大的一個n值還可以在k次比較內保證和m合併完成。 如果對每一個k, 我們都解出了fm(k)則對每一個n合併n與m的保證數也必可算出。 我們所以要定義fm(k), 是因為我們的結果以fm(k)這個函數來表示比較簡單。現在所知的fm(k)非常有限,約有以下數類:
筆者以一個未解的疑破案當作本文結尾。令 M(n,m) 代表合併 n 與 m 所需最小的保證數,且 ,試證:
筆者提供臺幣四仟元給第一個解出此題者。
|
對外搜尋關鍵字: .整理 .合併 .Steinhaus .資訊理論 .Euler |
|
(若有指正、疑問……,可以在此 留言 或 寫信 給我們。) |
EpisteMath (c) 2000 中央研究院數學所、台大數學系 各網頁文章內容之著作權為原著作人所有 |
編輯:朱安強 | 最後修改日期:4/26/2002 |