利用STL的最大堆獲取TOPN

2021-05-23 00:50:14 字數 662 閱讀 3881

最近在看看演算法,對一道曾經見過好幾次的問題忽感興趣。

就是如何從乙個大集合中,選出其中的topn,舉個例子: 從100 0000個int中,選出最大的100個。

其實,解決辦法應該有很多,這裡選擇的是一種利用最大堆來解決這個問題的辦法,這種辦法效率還是比較高的。

基本原理就是:建立100個元素的最大堆,然後在堆中找出最小元素,如果此元素小於後面即將參與比較的元素,則刪除最小元素,將新元素插入後,重新構建最大堆,以此類推,直至處理完100 0000個數字,堆中存在的元素,即為top100。

我在這裡給出乙個stl的實現:

我們可以發現,在stl中,利用heap的相關演算法,還是很容易實現我們的功能的,我們並不需要自己從頭造輪子,stl的東西還是相當豐富的。

其後我還做了乙個小測試:

首先,利用python生成測試資料:

兩端程式生成結果為heapsort.exe和inputset.txt

利用 heapsort.exe < inputset.txt命令測試一下結果:runtime: 0.015

可以發現,效率還是很高的。

鑑於對比,我重新寫了乙個bubblesort的**:

測試結果是:暫時沒有結果。

在有限的時間內(<=10秒),我沒有看到結果的輸出,可以看到差距是非常大的(而且,這裡還省去了io的輸入)

STL原始碼 heap最大堆,最小堆

最大堆和最小堆都是一棵完全二叉樹。最大堆 是指根節點的關鍵字值是堆中的最大關鍵字值,且每個節點若有兒子節點,其關鍵字值都不小於其兒子節點的關鍵字值。最小堆 是指根節點的關鍵字值是堆中的最小關鍵字值,且每個節點若有兒子節點,其關鍵字值都不大於其兒子節點的關鍵字值。步驟 把當前節點數i設定為已知堆的節點...

獲取應用能使用的最大堆記憶體

android每乙個應用的堆記憶體大小有限 1 通常的情況為16m 48m 2 通過activitymanager的getmemoryclass 來查詢可用堆記憶體限制 3 3.0 honeycomb 以上的版本可以通過largeheap true 來申請更多的堆記憶體 nexus s 4.2.1 ...

最大堆的刪除

include include typedef struct heapstruct maxheap maxheap create int maxsize 堆的插入 void insert maxheap h,elementtype item i h size for h elements i 2 h...