编程之美-寻找最大的k个数
生活随笔
收集整理的這篇文章主要介紹了
编程之美-寻找最大的k个数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【問題描述】
有很多無序的數,我們姑且假定它們各不相等,怎么選出其中最大的若干個數呢?
方法一:時間復雜度min(O(nlogn), O(nk))
idea 1:
先用快速排序或者堆排序進行排序,然后取出最大的k個數,時間復雜度為O(nlogn)+O(k)=O(nlogn)
idea 2:
進行k趟最大冒泡或者k次大頂堆的輸出,時間復雜度為O(n*k)
根據k與logn的大小比較,選取時間復雜度低的算法
方法二:時間復雜度O(nlogk)
方法三:時間復雜度為O(n*log( |Vmax - Vmin|? / delta)),數據分布均勻時,時間復雜度為O(nlogn)
尋找N個數中最大的k個數,重點在于宣召最大的k個數中最小的那個,也就是第k大的數。
方法四:用小頂堆
用容量為k的小頂堆來存儲最大k個數,從數列中取一個數X與當前的堆頂元素Y比較,若X>Y,則交換,然后調整堆,否則取下一個數進行判斷,以此判斷直到所有的數都判斷完畢。調整堆的時間復雜度為O(logk)
調整更新的偽代碼為:
方法五:
所有整數都在(0, max)區間的話,用數組count[max]存儲每個數的出現次數。只需掃描一遍即可得到count數組,然后尋找最大的k個數。
總結
以上是生活随笔為你收集整理的编程之美-寻找最大的k个数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程之美-1的数目方法整理
- 下一篇: 编程之美-最大公约数问题方法整理