求第二小元素演算法

2021-10-05 06:53:40 字數 1169 閱讀 8667

求第二小元素的時間複雜度是θ(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標籤通常成對出現,比如和。一對標籤的前面乙個是開始標籤,第二個是結束標籤,在...