1. 程式人生 > >用hash_map統計出現次數最多的前N個URL

用hash_map統計出現次數最多的前N個URL

海量資料統計頻率最高詞彙的常規辦法之一是先通過一個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;
}