轉自作業幫https://www.zybang.com/question/a12eaf411fa8085fd93d4a3756fbee75.html
有很多算法,復雜度也不盡相同.以下簡單舉幾個例子:
1.n×m遍掃描
【算法基本描述】n×m遍掃描
【算法思想】每次都掃描一遍數組,取出最大元素,這樣掃描m遍就能得到m個最大的數
【算法復雜度】O(nm)
2.排序后取最大m個數
【算法基本描述】對n個數排序,對拍完序后的序列取m個最大的數
【算法復雜度】視排序的復雜度,一般為O(nlogn)或O(n^2)
3.最小堆
【算法基本描述】一遍掃描+最小堆
【算法偽代碼】
00-建立一個最小堆(優先隊列),最小堆的大小控制在m之內
01-for 每個數:
02-----if 這個數比最小堆的堆頂元素大:
03---------彈出最小堆的最小元素
04---------把這個數插入到最小堆
05-最小堆中的m個元素就是所要求的元素
06-其中最小堆的作用就是保持里面始終有m個最大元素,且m個元素中最小的元素在堆頂.
O(nlogm) 遍歷O(n) 最小堆O(logm)
4.
鏈接:https://www.nowcoder.com/questionTerminal/dfe1f8e38d1f47909ea48e1c8592ac75?pos=60&orderByHotValue=1
來源:牛客網
1.最簡單的方法:將n個數排序,排序后的前k個數就是最大的k個數,這種算法的復雜度是O(nlogn)
2.O(n)的方法:利用快排的patition思想,基於數組的第k個數來調整,將比第k個數小的都位於數組的左邊,比第k個數大的都調整到數組的右邊,這樣調整后,位於數組右邊的k個數最大的k個數(這k個數不一定是排好序的)
比如(3,5,8,1,6,4)
取3個最大數,那我以最后一個數4為分割,可能得到(3,1,4,5,6,8),如果4是最大三個中的一個,那么4的右邊應該有兩個數,,否則,如果大於兩個數往右區間找,小於往左區間找,這樣的結果就是,n+n/2(未必是n/2但是n/3,n/4都是可能的)+n/4.。。,最后的復雜度一定是kn+c的,(1<k<2)因此是O(n)的
看到網上有的說是最小復雜度是O(n),有的答案說是O(mlogn),
我覺得都不對,這取決於m和n之間的關系,
當m遠小於n的時候,當然是O(mlogn)更小,
但是如果m和n相差不是很大,那么明顯是O(n)更小