解題思路:
step1:查詢統計
第一種就是進行排序了,可排序的方法有很多種,最簡單的就是直接排序。可是如果單純使用內排序將行不通,因為255b*1千萬=2.3...g,所以如果一次性的將所有資料讀入直接進行排序時行不通的。所以我們要借助內排序和外排序的結合對其進行排序。
知識補充:何為內排序和外排序。
我們一般提到排序都是指內排序,比如快速排序,堆排序,歸併排序等,所謂內排序就是可以在記憶體中完成的排序。ram的訪問速度大約是磁碟的25萬倍,我們當然希望如果可以的話都是內排來完成。但對於大資料集來說,記憶體是遠遠不夠的,這時候就涉及到外排序的知識了。
外部排序指的是大檔案的排序,即待排序的記錄儲存在外儲存器上,待排序的檔案無法一次裝入記憶體,需要在記憶體和外部儲存器之間進行多次資料交換,以達到排序整個檔案的目的。外部排序最常用的演算法是多路歸併排序,即將原檔案分解成多個能夠一次性裝人記憶體的部分,分別把每一部分調入記憶體完成排序。然後,對已經排序的子檔案進行歸併排序。
一般來說外排序分為兩個步驟:預處理和合併排序。即首先根據記憶體的大小,將有n個記錄的磁碟檔案分批讀入記憶體,採用有效的記憶體排序方法進行排序,將其預處理為若干個有序的子檔案,這些有序子檔案就是初始順串,然後採用合併的方法將這些初始順串逐趟合併成乙個有序檔案。
預處理階段最重要的事情就是選擇初始順串(就是如何對分割出來的各個小檔案進行排序啦)。通常使用的方法為置換選擇排序,它是堆排序的一種變形步驟如下:
1.初始化堆
(1)從磁碟讀入m個記錄放到陣列組ram中
(2)設定堆末尾標準last=m-1
(3)建立最小值堆
2.重複以下步驟直到堆為空
(1)把具有最小關鍵碼值的記錄min也就是根節點送到輸出緩衝區
(2)設r是輸入緩衝區中的下一條記錄,如果r的關鍵碼大於剛剛輸出的關鍵碼值min,則把r放到根節點,否則使用陣列中last位置的記錄代替根節點,並將剛才的r放入到last所在位置,last=last-1;
(3)重新排列堆,篩出根節點
以上排序方法的時間複雜度是o(nlgn)。但是我們可以有更好的方法。那就是利用hash表。我們設定使用者輸入的索引串為key,而索引串出現的次數為value。每次讀入乙個索引串,如果在雜湊表中不存在該索引串則插入,並修改value,如果索引串已經存在於雜湊表中,則增加value的值。而這個操作只需o(n)時間內就可以完成。
step2: 統計top-k
比如說我們要排名在前10 的索引串,那麼我們可以對300萬個資料進行排序,然後取出前十名。但是這樣做的時間複雜度非常高:o(nlgn)。其中n為300萬。因為我們只需要前十名的索引串,所以可以建立乙個節點為11的最大堆。首先讀入10個資料,並調整堆,使之成為最小堆,然後依次讀入剩下的資料。每讀入乙個資料調整最小堆(時間複雜度是lg11),然後去掉根節點。當遍歷完所有的索引串後,最小堆中去掉根節點後剩下的10個節點就是我們所要求的top10索引。總的時間複雜度是o(nlg10)。以上是利用了堆排序的思路進行top-k的統計。
所以解決top-k的總體思路是:首先建立雜湊表,將索引串對映到雜湊表中,此時統計出了索引串的出現次數,然後利用堆排序的思想求前k個索引串。
TopK問題 百度面試
題目描述 easy 找到最大的十個數 and 如果檔案很大,不能一次讀入 演算法分析 1.快排的partition函式,以第k個數作為key時,大於k的右邊的數即為所求 2.構建小頂堆 partition實現 class solution else if loc k return vector in...
Top K演算法詳細解析 百度面試
搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1 255位元組。假設目前有一千萬個記錄,這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。請你統計最熱門的10個查詢串,要求...
Top K演算法詳細解析 百度面試
搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1 255位元組。假設目前有一千萬個記錄,這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。請你統計最熱門的10個查詢串,要求...