10.鞏固學習PriorityQueue類------海量資料處理的 Top K演算法(問題) 小頂堆實現

網際網路資深架構師發表於2020-12-19

海量資料處理的 Top K演算法(問題) 小頂堆實現

問題描述:有N(N>>10000)個整數,求出其中的前K個最大的數。(稱作Top k)   
問題分析:由於(1)輸入的大量資料;(2)只要前K個。那麼對整個輸入資料的儲存和排序是非常耗時耗記憶體且沒必要的。

可以利用資料結構的最小堆來處理該問題。

最小堆如圖所示,對於每個非葉子節點的數值,一定不大於孩子節點的數值。這樣可用含有K個節點的最小堆來儲存K個目前的最大值(當然根節點是其中的最小數值)。

每次有資料輸入的時候可以先與根節點比較。若不大於根節點,則捨棄;否則用新數值替換根節點數值。並進行最小堆的調整。

Java實現如下:

int[] topK(int nums[],int k){
    PriorityQueue<Integer> priorityQueue = new PriorityQueue<Integer>();
    for (int v:nums) {
        if (priorityQueue.size() < k)
            priorityQueue.add(v);
        else if (priorityQueue.peek() < v) {
            priorityQueue.poll();
            priorityQueue.add(v);
        }
    }
    int[] result = new int[k];
    for (int i = k - 1; i >= 0; i --)
        result[i] = priorityQueue.poll();
    return result;
}

相關文章