求第二小元素的時間複雜度是θ(n),使用暴力求解和該演算法的時間複雜度都是θ(n),該演算法只是把最壞情況比較次數從2n−
32n-3
2n−3
次降低到n+⌈
lgn⌉
−2n+\lceil lgn\rceil-2
n+⌈lgn
⌉−2。
取兩個數作為最小元素和第二小元素,然後依次取剩下的元素和現有的最小元素、第二小元素作比較,最後獲得所有元素中的最小元素和第二小元素。
理想情況比較n−1
n-1n−
1次,最壞情況比較2n−
32n-3
2n−3
次。該演算法的核心思想是:第二小元素只可能被最小元素「乾掉」,所以我們只需要找出所有和最小元素比較過的元素,從中找最小元素即是所有元素的第二小元素。
那麼如何減少和最小元素比較過的元素個數呢(目標是最壞情況下盡可能少)?可以想到使用二叉樹。
如下圖,建立一棵有n
nn個葉子節點的完全二叉樹,每個元素作為乙個葉子節點,從下向上兩兩比較,最後根節點就是最小元素。
然後退回去找出所有和最小元素比較過的元素(藍色圓圈的元素),從這些元素中逐個比較找其中的最小元素即可。
完全二叉樹的方法是可以直接實現的,只要每個非葉子節點同時保留 以自己為根的子樹的最小元素 和 被「乾掉」的元素是左孩子還是右孩子 即可實現所說演算法。
但是使用完全二叉樹過於浪費空間了,為了優化演算法,我們使用鍊錶的方式來實現。
鍊錶方式的實現:
每個元素都有乙個鏈用來保留和自己比較過的元素(以下將該鏈稱為「擊殺名單」)。
兩兩分組進行比較,比較後,失敗者(較大元素)清空自己的擊殺名單,然後把自己放入勝利者(較小元素)的擊殺名單中。
重複上一步直到只剩乙個勝利者(最小值)。
掃瞄一次最終勝利者的「擊殺名單」,找到其中的最小值,即為所有元素的第二小元素。
當然,為了用鍊錶實現,所有未被擊殺的元素也要形成乙個鏈。
舉例:如下圖,h為頭結點,共有7個元素,紅圈表示進行比較,黃色區域表示「未被擊殺元素」,黃色區域以外是「擊殺名單」。
其實該演算法的使用價值不大,因為對時間優化不大,反而需要開闢不少儲存空間儲存指標。但是我認為該演算法很有意思,所以就整理了出來。
尋找第2小元素
分析 看見題目中有lg n 項,首先應該想到的是分治法,演算法的思路如下 為簡單起見,不考慮取整的問題 將 n 個元素分成 n 2 對.每一對之間互相比較.這樣一共比較了 n 2 次.然後將每一對的較小元素放在 s 1.n 2 陣列中,較大的元素對應的放在 b 1.n 2 中.顯然最小的元素肯定在陣...
HTML系列之二 元素
html元素 html文件是由html元素組成的文字檔案。html元素是預定義的正在使用的html標籤。html標籤 html標籤用來組成html元素。html標籤兩端有兩個包括字元 和 這兩個包括字元被稱為角括號。html標籤通常成對出現,比如和。一對標籤的前面乙個是開始標籤,第二個是結束標籤,在...
HTML系列之二 元素
html元素 html文件是由html元素組成的文字檔案。html元素是預定義的正在使用的html標籤。html標籤 html標籤用來組成html元素。html標籤兩端有兩個包括字元 和 這兩個包括字元被稱為角括號。html標籤通常成對出現,比如和。一對標籤的前面乙個是開始標籤,第二個是結束標籤,在...