是程式設計之美裡的乙個問題,
找出乙個列表中的最大的前k個數,最先想到,
也是最簡單的思路是做乙個k長度的盒子,然後乙個乙個資料往裡放,有大的來了就把小的剔除掉。
但是這樣的做法會導致盒子內部要是有序的。(不然找不出誰是最小的,比較和剔除就不能做了)
這個做法的複雜度是o(n*k)
書裡面講了一種比較好的辦法,就是類似於快速排序,做乙個切割,看夠不夠。然後遞迴出結果。
這樣的複雜度就是o(n*logk)了
接下去的乙個思路是來自堆排序,看一下把乙個陣列整理成大頂堆的**
所以說,如果我們定義乙個長度是k的小頂堆,讓他盛滿。
來乙個數,比較頂和數字的大小,如果大於頂,就把頂剔除,放入新數字後整理堆。
直到整個陣列被遍歷一遍。這樣的好處是整個陣列只要遍歷一次。
如果說對於乙個gb的資料找出前20個,這是比較好的辦法。
但是貌似在陣列裡實現堆要判斷好多越界的情況,於是有了下面一堆**……
寫完這個程式的時候,我發現heap建立的時候,可以從下到上建立,就是下標,除以二直到0.
而追加乙個資料到頂以後就要從上往下走了。
所以上面有兩段不同的**。iniheap和rtidyheap
N個數中找出最大的K個數
題目描述 有很多個 n個 無序的數,我們姑且假定它們各不相等,怎麼選出其中最大的若干個 k個 數呢?1.n 100,k 10的時候怎麼處理?2.n 1000,k 100呢?3.n 1億億個,k 100呢?如果這些數是整數的話,怎麼處理?如果是浮點數呢?如果這些數是整數,並且存在上界呢?如果將題目中的...
N個數裡面找出最大的k個數
出處 題目 給出n個無序的數,然後找出其中最大的k個數 解題思路 首先測試資料有可能會有一億個數,資料量特別的大,資料庫不可能儲存這麼多的資料。如果直接sort排序,nlogn時間複雜度實在是太高,大於10 9。我們可以考慮對資料進行分塊讀取,每次讀取的資料塊大小應大於k。不如先假設第一次讀取的資料...
100w個數中找出最大的k個數
1.思路1 我們應該首先想到是先將100w個數排序,暫且不考慮效率問題,可是記憶體中能放得下嗎?2.思路2 堆排序,先從中去k個數進行堆排,然後乙個乙個數進行比較替換,每替換一次都得將堆下調一次,去保證堆得特性 函式findmaxknum 倆件事 一 取k個數進行建堆 二 進行資料替換,替換完一次下...