找出陣列中最小(最大)的k個數。以任意順序返回這k個數。
1.若該陣列的陣列長度很小,則可運用簡單方法查詢即可。
2.若該陣列陣列長度很大,超過了記憶體能儲存的範圍。那麼,顯而易見,傳統的查詢方法已經失去的查詢的能力。
a.最大前k個數,建小堆
b.最小前k個數建大堆
示例:建小堆
//向下調整演算法
void
adjustdown
(int
* a,
int n,
int root)
if(a[child]
>a[parent]
)else
}
在堆頂前k個數建立k數大堆,依次比較,若陣列arr[k+1]小於k數對頂數retarr[0],則進行大堆調整,儲存小的數,遍歷完整個陣列,即可找出前k個最小的數,儲存在k數堆內。
int
*smallestk
(int
* arr,
int arrsize,
int k,
int* returnsize)
//建k個數的大堆
for(
int i=
(k-1-1
)/2;i>=0;
--i)
for(
int j=k;j++j)
}return retarr;
}
建立k數堆來對陣列進行查詢,時間複雜度為o(n*logn),解決了因為陣列n很大,無法內排序的問題。 Top K系列問題之二 常見問題
或者如下闡述 演算法思想 分而治之 hash 1.ip位址最多有2 32 4g種取值情況,所以不能完全載入到記憶體中處理 2.可以考慮採用 分而治之 的思想,按照ip位址的hash ip 1024值,把海量ip日誌分別儲存到1024個小檔案中。這樣,每個小檔案最多包含4mb個ip位址 3.對於每乙個...
TopK問題詳解
1.基本topk問題描述 從1百萬個數中找出最大 或最小 的5個數 看到這個問題,很多同學的第一反應會是 排序。那麼,選擇哪種排序方法呢,有同學說 快排,將所有數排序後,再選出最大的5個。雖然快排確實能解決這個問題,但是需要對1百萬個數排序,但我們僅僅需要其中的5個。那麼,有更好的方法嗎?還記得我們...
Top K問題詳解
最容易想到的方法是將資料全部排序,然後在排序後的集合中進行查詢,最快的排序演算法的時間複雜度一般為o nlogn 如快速排序。但是在32位的機器上,每個float型別佔4個位元組,1億個浮點數就要占用400mb的儲存空間,對於一些可用記憶體小於400m的計算機而言,很顯然是不能一次將全部資料讀入記憶...