同時尋找最大數和最小數的最優算法

     我們知道,在一個容量爲n的數據集合中尋找一個最大數,不管用什麼樣的比較算法,至少要比較n-1次,就算是用競標賽排序也得比較n-1次,否則你找到的就不能保證是最大的數。那麼,在一個容量爲n的數據集合中同時尋找最大數和最小數的最小比較次數是多少呢?
     從一個容量爲n的數據集合中同時找到最大數和最小數的最優方法是:首先讓所有的元素參與兩兩比較,這樣總共比較了n/2次,最大數肯定在勝者組中,最小數肯定在敗者組中;然後從容量爲n/2的勝者組中找到最大的數,最少要比較n/2 - 1次;同理,從容量爲n/2的敗者組中找到最小的數,最少要比較n/2 - 1次。所以總共需要比較(3n/2) - 2 次。以上假設n爲偶數。奇數同理。

這是同時尋找最大數和最小數的最優算法

 

    那麼,我們要從一個容量爲n的數據集(假設該數據集是一個集合,即沒有相同的元素)中找到第二大元素需要多少次比較呢?
    一種習慣的方法是:先找出最大的元素,這需要比較n-1次;然後從剩下的n-1個元素中找到最大的,這個元素就是我們要找的第二大元素,這需要比較n-2次。做一總共比較2n-3次。
但是,
    還有一個更優的方法:
(1) 我們考慮淘汰賽的比較法,淘汰賽結束後,找出冠軍我們需要n-1次比較;如下圖所示,找到12需要比較7次。
(2) 此時我們要考慮到,亞軍應該存在於敗給冠軍的這些選手中(否則,每個元素都至少有兩個元素比它大),由於與冠軍比過的元素個數爲┌log2n┐,從這些元素中找到最大值需要比較┌log2n┐ - 1次;如下圖所示,亞軍應該在10,11,4這三個元素中。否則,如果亞軍是5,那麼冠軍12比它大,與它比較過的10也比它大,至少兩個元素大於5,所以5肯定不是亞軍的候選者。

 


(3)從而找出亞軍要比較n-1+┌log2n┐-1 = n-2+┌log2n次比較。這個算法是尋找亞軍的最優算法

 

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