雜湊分治 乙個部落格id 新浪部落格

2021-09-24 11:21:50 字數 1935 閱讀 3142

海量資料的排序問題:

1.如果資料不重複,可以使用位圖

2.海量資料,記憶體有限

歸併排序:

如 設有數列

初始狀態:6,202,100,301,38,8,1

第一次歸併後:,,,,比較次數:3;

第二次歸併後:,,比較次數:4;

第三次歸併後:,比較次數:4;

top k問題:分而治之/雜湊對映   +   雜湊統計    +    排序

對於最終要不要進行分治,是由記憶體要求決定的

1.分而治之:先將日誌中所有的ip讀取出來讀到乙個大檔案中,對應裝置ip數量巨大的檔案,記憶體可能不能一下全部裝載進去,所以先進行雜湊到1000個小檔案中:挨個讀取並進行雜湊,ip % 1000 = 對應檔案序號

2.頻率統計:通過第一步我們已經將大檔案劃分成1000個小檔案,並且保證了相同的ip一定在同乙個小檔案中(通過相同的雜湊函式);然後對1000個小檔案進行hash_map(ip,count),進行頻率統計,得到count最高的那個ip,乙個1000個ip。

3.排序:通過堆排序對這1000個ip的count進行排序,得到頻率最高的那個。也可以快速排序

二、從1000萬條查詢記錄中找到最熱門的10個查詢串。

1.根據題意判斷是否需要分治。

2.假設不需要進行分治:進行雜湊統計,hash_map(string,count)   o(n)

3.用前十個string的count建立乙個小根堆,然後開始遍歷其餘的查詢串的count,通過與堆頂元素比較,如果比堆頂元素大,就將該節點放在堆中,否則與下個節點的count做比較。遍歷完成後,就剩下熱度最高的十條查詢串。

三、有海量資料分布在100臺電腦中,統計出這批資料出現次數最多的top 10.

考慮倆種情況:

①:同乙個數字val只出現在一台電腦上,即倆個電腦上的數字不同,出現在a電腦上就不會在b電腦出現

②:同乙個數字出現在不同電腦上,數字val在a電腦出現m次,在其他某台電腦出現n次,而a電腦上的某些資料出現次數分別為lkjhg等,實際m和n都lkjhg中的所有值,遺憾的是篩選時,會將val(m)和val(n)丟掉,可實際上val(m+n)才是我們想要的top

第一種情況:

1.把每台電腦的上的資料的top 10求出來,可以使用hash_map  +  堆排序

2.將每台電腦上的top 10寫入乙個大檔案中,一共1000個資料,然後建立乙個大小為10的小根堆,遍歷剩下的990個資料,分別與堆頂元素作比較,最終留下最大的10個資料.

第二種情況:

1.可以將所以資料匯聚到乙個大檔案中,然後將各個資料進行 % 100 =電腦序號,存放在不同的電腦中

2.經過第一步,我們可以將所以相同的資料保證在同一臺電腦上,然後在執**況一的步驟即可。

四:有10個檔案,每個檔案的大小約為1gb,每個檔案的每一行存放的是使用者的查詢串,每個檔案的查詢串都可能重複,按照查詢串的頻度排序。

三種解法:

解法一:

1.將10個檔案順序讀取,將每個查詢串通過雜湊函式,放在另外10個檔案

2.然後將這10個小檔案分別進行雜湊統計在一台2g左右的電腦上,統計出每個查詢串的出現的次數,查詢串每出現一次查詢串對應的count就+1

3.將排好序的查詢串以及對應的count進行排序,排好序後將其輸入到檔案中,然後將這十個檔案進行歸併排序。

五:給定a和b倆個檔案,分別存放50億個url,然後現在需要找出ab中相同的url。

1.分治:a檔案分治為1000個檔案(a0,a1...a999),b檔案同樣分治為1000個小檔案(b0,b1...b999)

2.這樣一來,通過相同的雜湊函式得到的小檔案,中相同的url肯定在對應的相同編碼的檔案中,即a0和b0,a1和b1中才會有相同的url

3.使用hash_set,將其中乙個小檔案存放在hash_set中,然後遍歷另外乙個小檔案的url,如果某個url存在與hash_set中,說明該url重複出現,那麼就將該url儲存在檔案中。

gcc和g 區別 乙個部落格id 新浪部落格

誤區一 gcc只能編譯c g 只能編譯c 兩者都可以,但是請注意 1.字尾為.c的,gcc把它當作是c程式,而g 當作是c 程式 字尾為.cpp的,兩者都會認為是c 程式,注意,雖然c 是c的超集,但是兩者對語法的要求是有區別的。c 的語法規則更加嚴謹一些。2.編譯階段,g 會呼叫gcc,對於c 兩...

Glibc輔助執行庫 乙個部落格id 新浪部落格

程式的一些特性的操作必須在main函式之前執行,還有一些操作必須在mian函式之後執行,這裡再提一下c 因為最具代表性的就是c 的全域性物件的構造與析構函式 即c 的全域性物件建構函式在main 函式之前執行,而c 全域性物件的析構函式在main函式之後被執行。linux 系統中,一般程式的入口是 ...

作業系統程序排程演算法 乙個部落格id 新浪部落格

先來先服務 fcfs,first come first served 在所有排程演算法中,最簡單的是非搶占式的fcfs演算法。演算法原理 程序按照它們請求cpu的順序使用cpu.就像你買東西去排隊,誰第乙個排,誰就先被執行,在它執行的過程中,不會中斷它。當其他人也想進入記憶體被執行,就要排隊等著,如...