1. 海量日志数据,提取出某日访问百度次数最多的那个IP。
方法:1>.分而治之, 2>.采用Hash_Map来记录每个IP出现的次数。由于要获取访问次数最多的那个IP,因此在分治后的每个文件中记录当前出现最多的IP。
2. 找出最热门的10个查询串。
3.一个1G大小文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。
方法:1>.分而治之,2>.采用Hash_Map来统计每个词出现的次数。由于压迫获取频数最高的100个词,因此在分治后的每个文件中记录频数最多的100个词,然后每个文件中的100个词进行归并再从中选100个最多的。
获取最多的100个,应该建一个大小为100的最小堆,或者是大小为100的set,其中元素为pair<word, frequency>,依靠frequency来排大小。
一段先用Hash_Map统计次数,然后用Set来返回最大的N个程序:
#include <ext/hash_map>
#include <set>
using namespace std;
typedef __gnu_cxx::hash_map<const char*, int, __gnu_cxx::hash<const char*>, eqstr> HashMapType;
typedef set< pair<const char*, int>, pairComp> PairSet;
void searchTwoHot(vector<char*> &searchLog)
{
HashMapType searchHashMap;
vector<char*>::iterator iter = searchLog.begin();
for(; iter != searchLog.end(); ++iter){
HashMapType::iterator resultIter = searchHashMap.find(*iter);
if(resultIter != searchHashMap.end()){
(resultIter->second)++;
}else{
searchHashMap.insert(make_pair(*iter, 1));
}
}
unsigned int hotNum = 2;
PairSet pairSet;
HashMapType::iterator iter1 = searchHashMap.begin();
for(; iter1 != searchHashMap.end(); ++iter1){
if(pairSet.size() < hotNum)
pairSet.insert(*iter1);
else{
PairSet::iterator iterGreatest = pairSet.begin();
cout<<"the greatest in set is"<<iterGreatest->first<<endl;
cout<<"the current in hash_map is"<<iter1->first<<endl;
if(iterGreatest->second < iter1->second){
pairSet.erase(iterGreatest);
pairSet.insert(*iter1);
}
}
}
/*
iter1 = searchHashMap.begin();
for(; iter1 != searchHashMap.end(); ++iter1){
cout<<iter1->first<<":"<<iter1->second<<endl;
}
*/
PairSet::iterator iter2 = pairSet.begin();
for(; iter2 != pairSet.end(); ++iter2)
{
cout<<iter2->first<<":"<<iter2->second<<endl;
}
}
int main() {
std::vector<char*> searchLog;
searchLog.push_back("fengjie");
searchLog.push_back("fengjie");
searchLog.push_back("fengjie");
searchLog.push_back("baidu");
searchLog.push_back("baidu");
searchLog.push_back("baidu");
searchLog.push_back("baidu");
searchLog.push_back("google");
searchLog.push_back("ali");
searchLog.push_back("ali");
searchTwoHot(searchLog);
}