算法導論 — 思考題8-4 水壺

水壺)假設給了你nn個紅色的水壺和nn個藍色的水壺。它們的形狀和尺寸都各不相同。所有紅色水壺的容量都不一樣多,藍色水壺也是如此。而且,對於每一個紅色水壺來說,都有一個對應的藍色水壺,兩者容量相等;反之亦然。
  你的任務是找出所有的容量相等的紅色水壺和藍色水壺,並將它們配成一對。爲此,可以執行如下操作:挑出一對水壺,其中一個是紅色的,另一個是藍色的,將紅色水壺中倒滿水,再將水倒入藍色水壺中。通過這一操作,可以判斷出這個紅色水壺的容量是否比藍色水壺的容量更多,或是兩者一樣多的。假設這樣的比較需要花費一個單位時間。你的目標是找出一個算法,它能夠用最少的比較次數來確定所有水壺的配對。注意,你不能直接比較兩個紅色或兩個藍色的水壺。
  a. 設計一個確定性算法,它能夠用Θ(n2)Θ(n^2)次比較來完成所有水壺的配對。
  b. 證明:解決該問題算法的比較次數下界爲Ω(nlgn)Ω(n{\rm lg}n)
  c. 設計一個隨機算法,其期望的比較次數爲O(nlgn)O(n{\rm lg}n),並證明這個界是正確的。對你的算法來說,最壞情況下的比較次數是多少?
  
  
  a.
  依次選取紅色水壺,將當前的紅色水壺與所有的藍色水壺進行比較,從中挑出與當前紅色水壺容量一樣的藍色水壺。下面給出該算法的僞代碼。
  在這裏插入圖片描述
  顯然,輸出數組MM<1,2,,n><1, 2, …, n>的一個排列。M[i]M[i]表示第ii個紅色水壺與第幾個藍色水壺配對。從僞代碼可以看出,M[i]M[i]也表示第ii個紅色水壺參與比較的次數,因爲第M[i]M[i]個藍色水壺是與第ii個紅色水壺比較的最後一個藍色水壺。因此,總的比較次數爲
    i=1nM[i]=i=1ni=n(n+1)2\sum_{i=1}^{n}{M[i]} = \sum_{i=1}^{n}{i} = \frac{n(n+1)}{2}
  因此,這一算法需要進行Θ(n2)Θ(n^2)次比較。
  
  b.
  用決策樹模型來證明。考慮一個簡單的例子,33個紅色水壺爲<a,b,c><a, b, c>33個藍色水壺爲<d,e,f><d, e, f>,決策樹如下所示。
  在這裏插入圖片描述
  在決策樹中,每個葉結點都是可能的配對情況,每個非葉結點表示一次比較。如果紅藍水壺各有nn個,那麼根據排列組合原理,可能的配對情況一共有n!n!種,也就是說決策樹一共有n!n!個葉結點。假設該決策樹的高度爲hh,那麼它最多包含2h2^h個葉結點。於是有
    n!2hn!≤2^h
  對該不等式兩邊取對數,得到hlg(n!)=Ω(nlgn)h≥{\rm lg}(n!)=Ω(n{\rm lg}n)。所以,解決水壺配對問題的算法的比較次數的下界爲Ω(nlgn)Ω(n{\rm lg}n)
  
  c.
  按照題目意思,每一個紅色水壺都有一個藍色水壺與之容量相等。比較簡單的一個想法是,將所有紅色水壺按照容量由小到大進行排序,再將所有藍色水壺按照容量由小到大進行排序,排序後處於相同位置的紅色水壺和藍色水壺一定是容量相等的。排序可以採用隨機化的快速排序,期望時間複雜度爲O(nlgn)O(n{\rm lg}n)。然而,這個想法違反了題目要求。因爲題目只允許紅色水壺與藍色水壺進行比較,而不允許相同顏色的水壺進行比較。
  爲了滿足題目要求,可以考慮對快速排序做出修改,詳見下面的僞代碼BOTTLEMATCH2{\rm BOTTLE-MATCH-2}。每次調用BOTTLEMATCH2{\rm BOTTLE-MATCH-2},從紅色水壺RR中隨機選出一個rr,將rr與所有藍色水壺BB比較,從而將藍色水壺分爲33類:容量小於rr的藍色水壺BlessB_{less},容量大於rr的藍色水壺BmoreB_{more},容量等於rr的藍色水壺bb。類似地,用藍色水壺bb將紅色水壺也分爲33類:容量小於bb的藍色水壺RlessR_{less},容量大於bb的藍色水壺RmoreR_{more},容量等於bb的藍色水壺rr。紅色水壺rr與藍色水壺bb的容量相等,二者配成一對。再遞歸的調用BOTTLEMATCH2(Rless,Bless){\rm BOTTLE-MATCH-2}(R_{less}, B_{less})BOTTLEMATCH2(Rmore,Bmore){\rm BOTTLE-MATCH-2}(R_{more}, B_{more})
  在這裏插入圖片描述
  該算法實際上是對兩個數組進行快速排序,根據第7章對快速排序的分析,期望的比較次數爲O(nlgn)O(n{\rm lg}n)。在最壞情況下,比較次數爲O(n2)O(n^2)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章