大資料處理之(top k)

2021-08-10 14:43:11 字數 2164 閱讀 2849

top k 簡介:在大量資料中找出重複次數最多的前k個。

問題分析

聽起來這個問題十分簡單,只需對這些資料進行一次排序即可得到前k個。如果這樣的話,首先得定義乙個資料結構來儲存這些資料,大量的資料會消耗過大的程序資源,甚至「耗盡」程序的資源。還有乙個問題是排序的時間複雜度是非常高的,一般來說,較快的排序演算法時間複雜度是o(n*log2n)。倘若資料過大,也就是n過大,時間複雜度也會是非常高的。為了提高程式執行效率,我們應該盡快的優化程式,使程式在個個情況下的複雜度達到理想化。

解決辦法:1.資料量過大,導致程序資源被耗盡的問題:將大量資料平均寫到多個檔案當中,再找出每個檔案中的top k並記錄,再找出記錄下來的前top k。則最終找到的就為整個大資料中的top k。

2.時間消耗過大:我們可以先將每個檔案中的資料存入到map表中去。first:資料,second:重複的次數。再利用小根堆,先將前10個資料新增到map表中,然後依次比較剩下的資料的second如果大於map表中top的second,則將他更新到map表中。最終只需列印出小根堆所對應的前10個元素即可。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

struct value

bool

operator>(const value &src)const

//凡是不修改物件的,一律寫成常方法

int _key;

int _count;

};int main()

fclose(pf);

const

int file_num = 200;

file* pfiles[file_num];

for(int i=0; ichar buffer[50] = "data.txt";

char index[10] = ;

itoa(i, index, 10);

strcat(buffer, index);

pfiles[i] = fopen(buffer,"w");

}pf = fopen("data.txt", "r");

while(!feof(pf))

for(int i=0;ifor(int i=0; ichar buffer[50] = "data.txt";

char index[10] = ;

itoa(i, index, 10);

strcat(buffer, index);

pfiles[i] = fopen(buffer,"r");

}vector

last;//儲存最終200個檔案中的分別的重複最多的前10個元素

for(int i=0;ivector

array;

while(!feof(pfiles[i]))

hash_map map2;

while(!array.empty())

else

array.pop_back();

}priority_queuevector

,greater> que;

hash_map::iterator it2 = map2.begin();

for(int i=0;it2 != map2.end();++it2,++i)

else}}

while(!que.empty())

}hash_map map3;

priority_queuevector

,greater> que1;

int flag = 0;

while(!last.empty())

else

last.pop_back();

}hash_map::iterator it = map3.begin();

for(int i=0;it!=map3.end();it++,i++)

else}}

while(!que1.empty())

海量資料處理 top K

區域性淘汰法 用乙個容器儲存前 10000個數,然後將剩餘的所有數字一一與容器內的最小數字相比,如果所有後續的元素都比容器內的 1000個數還小,那麼容器內的這 10000個數就是最大的 10000個數。如果某一後續元素比容器內的最小數字大,則刪掉容器內最小元素,並將該元素插入容器,最後遍歷完這1億...

海量資料處理 (top K問題)

前兩天面試3面學長問我的這個問題 想說teg的3個面試學長都是好和藹,希望能完成最後一面,各方面原因造成我無比想去鵝場的心已經按捺不住了 這個問題還是建立最小堆比較好一些。先拿10000個數建堆,然後一次新增剩餘元素,如果大於堆頂的數 10000中最小的 將這個數替換堆頂,並調整結構使之仍然是乙個最...

大資料處理

大資料處理的流程主要包括以下四個環節 採集 匯入 預處理 統計 分析 挖掘,下面針對這四環節進行簡單闡述。大資料處理之一 採集 在大資料的採集過程中,其主要特點和挑戰是併發數高,因為同時有可能會有成千上萬的使用者來進行訪問和操作,比如火車票售票 和 它們併發的訪問量在峰值時達到上百萬,所以需要在採集...