哈希切割topK问题
给一个超过100G大小的logfile,log中存着ip地址,设计算法找到出现次数最多的ip地址,与上题条件相同,如何找到topK的ip?如何直接用Linux系统命令实现?
(1)topK的ip
思路:使用堆
(2)寻找次数最多
思路:分割成多个文件,分别多每个文件进行统计,统计方式用hash,ip为key,次数为value,然后就可以统计出每个ip出现的次数,然后再比较出出现次数最大的。
如果是找前k个出现次数最多的ip,就把出现的次数作为堆用来比较的的key,ip地址作为value,把刚刚用哈希统计好的次数,建立存储数据一定的小堆(用其中一个文件先建立一个topK堆,然后再用其他文件中的数据替换插入),出现次数多的都在堆里,然后根据次数对应的找到ip。
位图的应用
给定100亿个整数,设计算法找到只出现一次的整数
思路:
分割为多个文件,两个为比特位表示出现的次数
给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集
分割多个文件,编号相同的文件比较,一个比特位表示是否出现
位图变形
1一个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数
位图(两个比特位表示一个数据)
布隆过滤器
给两个文件,分别有100亿个query(字符串),我们只有1G内存,如何找到两个文件交集?分别给出精确算法
思路:思路的第一步都是先把两个文件分割成很多文件,然后每个编号相同的文件比较。
为什么使用布隆过滤器:字符串转化整形数字,两个字符串可能都转化为了同一个整形数据,这样单纯的位图就无法解决
近似算法:布隆过滤器,用不同的计算方法,让query映射多个位图(对应多个比特位),让多个位图中对应的位置都置1,找的时候通过query再次去找所有位图对应的位置是否全为1,如果都是1就可能存在,如果有一个不为1,就说明一定不在。(缺点:不能作删除操作)
精确算法:使用哈希(闭散列法和开链法):转化的整数为key,query为value,寻找的时候有两个比对条件,这样就比较精确了。
思考:
如何扩展BloomFilter使得它支持删除元素的操作?
思路:把每个位被映射的次数用一个变量记录起来,删除的时候就减一即可。(不过这样做还是在增加了不少内存,感觉不太实用)
如何扩展BloomFilter使得它支持计数操作?
思路:弄一个变量计数呗,这变量放哪呢
倒排索引
给上千个文件,每个文件大小为1K-100M,给n个词,设计算法对每个词找到所有包含它的文件
思路:
精确方法:在hash表中加载每个文件吧,hash的key用词转化的整形,然后用整形映射词的位置,如果有哈希冲突就用方法解决,然后在用n词去匹配是文件中否存在这个词。