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

2021-06-06 04:39:49 字數 996 閱讀 3686

我們知道,在乙個容量為n的資料集合中尋找乙個最大數,不管用什麼樣的比較演算法,至少要比較n-1次,就算是用競標賽排序也得比較n-1次,否則你找到的就不能保證是最大的數。那麼,在乙個容量為n的資料集合中同時尋找最大數和最小數的最小比較次數是多少呢?

從乙個容量為n的資料集合中同時找到最大數和最小數的最優方法是:首先讓所有的元素參與兩兩比較,這樣總共比較了n/2次,最大數肯定在勝者組中,最小數肯定在敗者組中;然後從容量為n/2的勝者組中找到最大的數,最少要比較n/2 - 1次;同理,從容量為n/2的敗者組中找到最小的數,最少要比較n/2 - 1次。所以總共需要比較(3n/2) - 2 次,即1.5n-2次

。以上假設n為偶數。奇數同理。

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

(無需額外的空間存放勝者組和敗者組,上面的分析僅僅是邏輯上的分組,實際程式設計時順序遍歷即可,即n0與n1比較,大的賦值給max,小的賦值給min,然後比較n2和n3,大的(勝者)與max比較,小的(敗者)與min比較,依次下去即可)

那麼,我們要從乙個容量為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┐

次比較。這個演算法是尋找亞軍的最優演算法。

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

我們知道,在乙個容量為n的資料集合中尋找乙個最大數,不管用什麼樣的比較演算法,至少要比較n 1次,就算是用競標賽排序也得比較n 1次,否則你找到的就不能保證是最大的數。那麼,在乙個容量為n的資料集合中同時尋找最大數和最小數的最小比較次數是多少呢?從乙個容量為n的資料集合中同時找到最大數和最小數的最優...

WIKIOI 1201最小數和最大數

題目描述 description 輸入n個數,n 100,找到其中最小的數和最大的數 輸入描述 input description 第一行乙個整數n 接下來一行n個整數,每個整數不超過231 1 輸出描述 output description 最小和最大的數 樣例輸入 sample input 4 ...

CODE VS 1201 最小數和最大數

題目描述 description輸入n個數,n 100,找到其中最小的數和最大的數 輸入描述 input description第一行乙個整數n 接下來一行n個整數,每個整數不超過231 1 輸出描述 output description最小和最大的數 樣例輸入 sample input4 1 2 ...