CI20 6 求前K個數

2021-06-17 00:35:59 字數 358 閱讀 7473

描述乙個演算法,在十億個(n)數中找出前一百萬(k)大的數字。假設記憶體裡可以放下十億個數。

思路:1、直接排序,然後輸出前一百萬個數,時間複雜度為o(n*logn)。

2、維護乙個大小為一百萬的大頂推,然後遍歷完十億個數,輸出大頂推的數即可,時間複雜度為o(n*logk)。該思路適合大資料,尤其是記憶體放不下所有資料的時候。

3、利用快排的思想進行劃分,一次劃分後設主元的位置為index,如果index == k,輸出前k個數;如果index > k,繼續在左半部分進行劃分尋找k;如果index < k,輸出左半部分的數,繼續在右半部分進行劃分尋找剩下的k - index個數。時間複雜度為o(n)。

類似的題有:找出n個數中第k大(小)的數。

利用堆求最大或最小的前k個數

用堆在海量資料中找出最大或最小的k個數,效率非常高。1 在一組資料中找出最小的k個數 解題思路 要找出最小的k個數,我們可以先用這組資料中的k個數構建一棵 最大堆 然後再將剩下的元素與堆頂元素相比。如果大於堆頂元素,則不做處理,繼續向下比較。如果小於堆頂元素,則將堆頂元素與這個元素交換,然後再恢復堆...

求最小的K個數

方法一 利用快排的思想,複雜度為o n class solution input low pivot return low vector getleastnumbers solution vector input,int k else vector res input.begin input.beg...

找出最大的前K個數

是程式設計之美裡的乙個問題,找出乙個列表中的最大的前k個數,最先想到,也是最簡單的思路是做乙個k長度的盒子,然後乙個乙個資料往裡放,有大的來了就把小的剔除掉。但是這樣的做法會導致盒子內部要是有序的。不然找不出誰是最小的,比較和剔除就不能做了 這個做法的複雜度是o n k 書裡面講了一種比較好的辦法,...