海量数据处理:十道面试题与诗歌海量数据处理方法我自己的总结

32 篇文章 0 订阅

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);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值