經典演算法(一) top k

2022-02-13 07:23:16 字數 1506 閱讀 1692

問題: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)

public

class

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考試常見的套路。你正緊張地坐在小隔間裡,聽著越來越近的腳步聲,內心忐忑,猶如兔脫。推門聲呷然而起,你扭頭一看,身體已不由自主起立,打量著眼前來人,心裡一陣竊喜 還好,面善。...