TOPk系列問題

2021-10-17 02:34:52 字數 801 閱讀 4953

找出陣列中最小(最大)的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的計算機而言,很顯然是不能一次將全部資料讀入記憶...