有10個文件,每個文件1G,每個文件的每一行存放的都是用戶的query,每個文件的query都可能重復。要求你按照query的頻度排序?
方案1:
hash映射: 順序讀取10個文件,按照hash(query)%10的結果將query寫入到另外10個文件(記為a0,a1,..a9)中。這樣新生成的文件每個的大小大約也1G(假設hash函數是隨機的)。
hash_map統計: 找一臺內存在2G左右的機器,依次對用hash_map(query, query_count)來統計每個query出現的次數。注: hash_map(query,query_count)是用來統計每個query的出現次數,不是存儲他們的值,出現一次,則count+1。
堆/快速/歸并排序: 利用快速/堆/歸并排序按照出現次數進行排序,將排序好的query和對應的query_cout輸出到文件中,這樣得到了10個排好序的文件(記為)。最后,對這10個文件進行歸并排序(內排序與外排序相結合)。
方案2:
一般query的總量是有限的,只是重復的次數比較多而已,可能對于所有的query,一次性就可以加入到內存了。這樣,我們就可以采用trie樹/hash_map等直接來統計每個query出現的次數,然后按出現次數做快速/堆/歸并排序就可以了。
方案3:
與方案1類似,但在做完hash,分成多個文件后,可以交給多個文件來處理,采用分布式的架構來處理(比如MapReduce),最后再進行合并。 ¶ 給定a、b兩個文件,各存放50億個u