1. 簡述
簡單的說就是有很多很多數值,多到記憶體放不下,要求選取其中最大的若干個數值。
2. 原理
赤裸裸的top-k問題,比如求前100大的數值,維護乙個100大小的最小堆,首先讀100個元素,初始化這個最小堆,然後,每讀取乙個數值,根堆的數值比較一下,如果當前數值小於等於堆頂數值,那麼繼續遍歷好了,如果當前數值大於堆頂數值,那麼將對堆頂元素改為當前數值,然後更新一下堆,接著繼續遍歷就好了。另外也可以維護乙個100個元素長度的有序陣列,每次就是二分插入法。複雜度一般就是n*log100
一般就是這樣了,程式設計之美中的第五個解法也就是應用計數排序的方法,對於一般的數值型還是不錯的,可以達到o(n)的複雜度,對於int,32位,4g個可能值,即512mb。
書後面有五個擴充套件題目,現在想的不是很清楚,以後再說了。
3. **
這個就省了。給乙個更新最小堆的**。
void updateminheap(int *a, int len)}
4. 參考
程式設計之美,2.5節,尋找最大的k個數。
《程式設計之美》2 5尋找最大的K個數
問題 有很多個無序的數 假設為n個 怎麼選出其中最大的k個數?kay s word kay的理解 很多 好多好多,無法儲存,因此首先排除了對輸入數排序的解法,而採用小容量陣列整理大的輸入資料,即 開大小為k的陣列,通過遍歷n個輸入陣列,每遍歷乙個數num,檢查k陣列的最小數,如果比num小,則用nu...
程式設計之美2 5 尋找最大的K個數
問題 從一組數中選出其中最大的k個數,當這組數的個數為幾百 幾百萬 幾百億時分別適合採用哪些演算法?個數為幾百時,使用順序統計法 看演算法導論第9章 演算法思想是對輸入陣列進行遞迴劃分,一邊的資料小於選定數,另一邊的資料大於等於選定數。但和快速排序不同的是,快速排序會遞迴處理劃分的兩邊,而順序統計法...
程式設計之美 2 5 尋找最大的K個數
今天看演算法分析是,看到乙個這樣的問題,就是在一堆資料中查詢到第k個大的值。名稱是 設計一組n個數,確定其中第k個最大值,這是乙個選擇問題,當然,解決這個問題的方法很多,本人在網上搜尋了一番,查詢到以下的方式,決定很好,推薦給大家。所謂 第 前 k大數問題 指的是在長度為n n k 的亂序陣列中s找...