問題:1億資料中,找出最大的k個數,要求使用記憶體不超過1m
(延伸問題:1億資料中,找出重複出現次數最多的k個,要求使用記憶體不超過1m 等)
分析:1億數字(int)佔記憶體:100000000 * 4byte / 1024 / 1024 =381m
其中 int=4byte,1m=1024kb,1kb=1024b
實現:維護乙個k大小的陣列有序陣列。每次加進來新的,都要判斷是不是 換掉 該陣列中最小的元素,如果需要,則刪除最小元素,放入新元素,並重新排序。
基於小頂堆的實現:
建立乙個k大小的堆。top k堆只用維護固定數量的元素,每次加進來新的,都要判斷是否替換掉堆頂元素,如果需要,則刪除堆頂元素,放入新元素,並重新構造堆
時間複雜度o(nlnk)
publicclass
topk_byheapsort
//調整堆
public
static
void adjustheap(int arr, int i, int
length)
if (arr[k] < temp)
else
}arr[i] = temp;//
將temp值放到最終的位置
}
//構建小頂堆
public
static
void createminheap(int
arr)
}//交換元素
public
static
void swap(int arr, int a, int
b)
//將小頂堆 轉化為 有序陣列
public
static
int minheaptosortarr(int
arr)
return
arr;
}public
static
void print(int
n) system.out.println();
}//使用堆排序實現topk
public
static
int gettopkbyheap(int input, int
k)
//將小頂堆轉化為有序陣列
minheaptosortarr(result);
return
result;
}public
static
void
main(string args) ;
int k=6;
print(gettopkbyheap(input, k));
}}
延伸問題:1億資料中,找出重複出現次數最多的k個,要求使用記憶體不超過1m
1億資料佔記憶體381m,可分成400批load到記憶體
1億/400=25w
通過hash,大頂堆 分別計算每25w資料中重複次數最多的k個元素,然後合併這400個大頂堆
Top K 演算法詳解
假設目前有一千萬個記錄 這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。請你統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。問題解析 要統計最熱門查詢,首先就是要統計每個query出現的次數,然後根據...
top K 演算法總結
問題描述 有 n n 1000000 個數,求出其中的前k個最小的數 又被稱作topk問題 將n個數進行完全排序,從中選出排在前k的元素即為所求。有了這個思路,我們可以選擇相應的排序演算法進行處理,目前來看快速排序,堆排序和歸併排序都能達到 o nlogn 的時間複雜度。可以採用資料池的思想,選擇其...
面試 演算法 Top K
top k問題是面試時手寫 的常考題,某些場景下的解法與堆排和快排的關係緊密,所以把它放在堆排後面講。下面先來還原一下top k考試常見的套路。你正緊張地坐在小隔間裡,聽著越來越近的腳步聲,內心忐忑,猶如兔脫。推門聲呷然而起,你扭頭一看,身體已不由自主起立,打量著眼前來人,心裡一陣竊喜 還好,面善。...