用hash_map統計出現次數最多的前N個URL
阿新 • • 發佈:2019-01-24
海量資料統計頻率最高詞彙的常規辦法之一是先通過一個hash函式處理資料然後取模N,拆分為N個小檔案,對每一個小檔案進行詞頻統計和排序處理,然後歸併N個小檔案取頻率最大的M個數。
關於hash_map和map的選擇使用有幾點注意的,hash_map是hash表的形式實現的,map是紅黑樹的結構,時間複雜度前者為N*(logN),後者為O(log2N)以內.從穩定性來說map佔優,從平均效能來看hash_map佔優,還有hash_map目前沒有納入C++標準庫,但是各個版本的STL都提供了實現。具體情況具體選擇咯。。
#include <iostream> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <hash_map.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> using namespace std; class HashFunction { public: size_t operator()(const string& s) const { unsigned long __h=0; for(size_t i=0;i<s.size();i++) __h=5*__h+s[i]; return size_t(__h); } }; class Compare { public: bool operator()(const string& str1,const string& str2)const { return str1==str2; } }; typedef hash_map<string,int,HashFunction,Compare> HashMap; int main(int argc, char* argv[]) { printf("%s","-=-=-=-=-=-=-=-=-=-=hash_map測試-=-=-=-=-=-=-=-=-=-=-=-=\n"); HashMap obj; /* obj["10010"]="聯通客服"; obj["10086"]="移動客服"; obj["1368351111"]="電話號碼"; obj["123456"]="你的密碼"; */ //構造關鍵字與次數的hash_map,即統計詞頻 int ai[]={22,41,22,46,13,13,22,44,44}; for(int i=0;i<9;i++) { char aa[12]={0}; sprintf(aa,"%d",ai[i]); obj[aa]++; cout<<aa<<" ,count="<<obj[aa]<<endl; } //將hash_map資料放入結構數組裡 struct tmp { int count; char str[12]; }; struct tmp stmp[9]; memset(stmp,0x0,sizeof(tmp)*9); hash_map<string,int,HashFunction,Compare>::iterator itor=obj.begin(); int j=0; for(;itor!=obj.end();itor++,j++) { sprintf(stmp[j].str,"%s",itor->first.c_str()); stmp[j].count=itor->second; cout<<stmp[j].str<<" "<<stmp[j].count<<endl; } //可以根據堆排序stmp[]陣列,取前N個最多出現的欄位 //省略 return 0; }