找到n個元素中的第二小元素
阿新 • • 發佈:2019-02-20
演算法導論中的一道習題:
證明: 在最壞情況下,找到n個元素中的第二小的元素需要n+ceil(lgn)-2次比較。(提示:可以同時找到最小元素,ceil表示向上取整)
思路:
找到最小元素需要n-1次比較。採用兩兩結合比較的方法。如果n為奇數,則取第一個元素為臨時最小元素min,其它兩兩結合比較,形成一個類似樹的比較過程。如果n為偶數,則直接進行兩兩結合比較,根節點即為最小元素。
接下來查詢第二小元素,需要ceil(lgn)-1次比較。考慮:第二小元素一定和第一小元素進行了比較,所以可以直接在比較樹的根節點到葉節點中的元素中去尋找,當n為2^n到2^(n+1)-1時,樹高為ceil(lgn), 需要比較次數ceil(lgn)-1(減去跟節點的那一層)
舉個例子:
0
/ \
1 0
/ / \
1 2 0
/ \ / \ / \
1 3 4 2 0 7
假設有一批數1,3,4,2,0,7 。有n個數,他所產生的比較樹樹高為ceil(lgn),在樹高為ceil(lgn)的比較樹中,最多有ceil(lgn)-1個與之比較過,根節點那層減去,故為ceil(lgn) -1.(這裡感謝 @doodlesomething同學的解釋~)
那麼,我們發散一下思維,最壞情況下是上面的結果,那麼最好情況下呢?
思路:
“設定兩個儲存單元:N1,N2,N1中儲存最小的兩個中較大的一個,N2中儲存最小的一個。
假設前兩個數是最小的,比較這兩個數,將小的放在N2中,大的放在N1中。
從第三個開始迴圈與N1比較,如果當前比較的值大於N1的值,則繼續迴圈直到最後。如果當前比較的值小於N1的值,則與N2做比較,如果大於N2則用當前值替換N1的值,如果小於N2,則用N2的值替換N1的值,當前值替換N2的值。
這樣做法應該是比較最少的了,最少比較:N-1次,最多比較:2N-3次。”
思路有限,如果你有好的想法,請指教!謝謝~