尋找第2小元素

2021-09-01 15:12:54 字數 1447 閱讀 8145

分析: 看見題目中有lg(n) 項,首先應該想到的是分治法,演算法的思路如下:(為簡單起見,不考慮取整的問題)

將 n 個元素分成 n/2 對.每一對之間互相比較.這樣一共比較了 n/2 次.然後將每一對的較小元素放在 s[1...n/2] 陣列中,較大的元素對應的放在 b[1...n/2]中.顯然最小的元素肯定在陣列s中,那麼第2小的元素(設代號為x)  是否也在 s 中呢?

首先,假設第2小元素x在陣列s 中,因為最小的元素也在陣列s中,所以x在s中同樣也肯定是第2小元素.這樣我們可以遞迴的在s中繼續尋找第2小元素,並將搜尋的範圍縮小了一半.

如果第2小元素x不在陣列s中,(即在陣列b中),由上面的分割槽演算法知,在b中的元素必然大於相應位置上s中的元素.在這裡x是第2小元素,它僅大於最小元素.所以它在b中的位置與最小元素在s中的位置相同.

綜上可知:第2小元素x要麼是s中的第2小元素,要麼是b中位置與最小元素在s中的位置相同的元素.

這樣演算法就很明了了: 將 n 個元素分成 n/2 對比較,較大者放入b,較小者放入s,若b和s的大小為1,則b[1]作為第2小元素返回,s[1]作為最小元素返回(主要是想得到最小元素在s中的位置),若b和s的大小大於1,則遞迴的在s中尋找最小元素和第2小元素,並將s中得到的第2小元素與b中位置與最小元素在s中的位置相同的元素相比較(有點拗口),其中較小者便是真正的第2小元素.

舉個例子吧,如:   在序列 3,2,5,8,6,4,9,7 中尋找第2小元素.

過程:首先分在[3,2] [5,8] [6,4] [9,7] 四組,經比較後得到 s1=2,5,4,7    b1=3,8,9,7.

再將 s1分割槽,得到  s2=2,4   b2=5,7 .

s2中最小值是2,第2小元素是4. b2中與s2中最小值對應的是5,因4小於5.所以得到s1的最小值是2,第2小元素是4, 在b1中與s1中最小值2對應的是3,因4>3,所以得到 整個序列的第2小元素為 3.完成.

演算法分析: t(n)=n/2+t(n/2)+1   //其中的n/2是分割槽時比較的次數,1 是遞迴時s中得到的第2小元素與b中位置與最小元素在s中的位置相同的元素相比較的消耗.

t(2)=1.

解遞迴式即可:t(n)=n+lg(n)-2 .

另解:

step1:對所有元素,兩個一組比較大小,小的乙個進入下一輪比較。一直到比較出最小的元素。此時所有比較結果構成一棵二叉樹。比較次數為n-1。

step2:沿著樹從樹根向下到葉子,找出第二小的元素,比較次數是ceil[lgn]-1。令m2[p]表示以p為根的樹中的第二小元素。對於當前處理結點為p,key[p] = min。假設key[p] =  key[left[p]],則m2[p] = min

jQuery2元素操作

1.對元素內容的操作 文字內容 text 設定內容 即使包含html 也將被認為是普通 text 獲取內容 html內容 html 設定內容 html 獲取內容 2.對值的操作 val 設定值 val 獲取值 對於radio按鈕 val 0,1,0 認為第二個被選中 對於select option ...

selenium 2 元素定位

selenium通過find element by find element by.elements mark 方法定位頁面元素。如果元素被定位到,返回webelement例項,否則丟擲異常nosuchelementexception.元素定位方法 描述引數 find element by id 通...

求第二小元素演算法

求第二小元素的時間複雜度是 n 使用暴力求解和該演算法的時間複雜度都是 n 該演算法只是把最壞情況比較次數從2n 32n 3 2n 3 次降低到n lgn 2n lceil lgn rceil 2 n lgn 2。取兩個數作為最小元素和第二小元素,然後依次取剩下的元素和現有的最小元素 第二小元素作比...