一.给一个超过100G大小的log file,log中存着IP地址,设计算法找到出现次数最多的IP地址
1.切分文件:因为ip地址是32位的(ipv4)的字符串,当100G放不下,我们要对其进行切分,切分成1000个小文件,再对每个文件编号。
2.计算文件的位置:将每个文件ip,映射到哈希表中,但是要注意到一点是,利用哈希函数将ip转化成整数,用函数表示:pos=hash(ip)%1000;
3.统计每个文件的ip次数:用一个map去统计,map< string,int> MaxXCountIp, 用这个map去读取单个文件,保存下单个文件的最大出现次数。
4.一直遍历完剩下的文件,就可以知道出现次数最多的ip
二.
给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的前K个IP地址?
如何直接用Linux系统命令实现?
这个题是第一个题的变形:如果要统计次数出现最多的前K个IP地址,可看作为TopK问题,具体做法为:
1.统计出1000份文件中每个文件里出现次数最多的IP
2.选取K个IP建立小堆,在依次取K之后的每一个IP与堆顶元素比较,如果大于堆顶元素,则覆盖堆顶数据,并进行向下调整,反之继续遍历源程序;
3.最后堆里的元素为出现次数最多的前K个IP
Linux系统命令实现:
sort logfile | uniq -c | sort -nr | head -K
sort 默认是用字符串的比较方法比较大小的,俩个字符串比较大小的时候,遇见第一个不同字符,第一个不同字符,谁的ASCII码大,就是那个字符串大。
sort -n 选项 : 按照数字大小比较
sort -r : 本来sort 从小到大输出,现在逆置从大到小输出。
head -K : K是一个具体的数字,输出最大的K个。
uniq -c : uniq 是把相邻的去重,加C是并显示出出现次数。
总结上面这个命令: 先把所有字符串重复的放一起,然后去重统计次数,最后按出现的次数大小排序,最后输出前K个
三.给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确
算法和近似算法!
精确算法:可以用位图,用两个位图刚好1G。求文件交集,只需要将文件1,2,分别建立在位图1,2中,然后对两个位图进行与运算,得到的便是交集。
近似算法:用布隆过滤器,开2的32次方-1个大小的位(最大个数的位),对第一个大数据文件的数据进行- 射,然后再读取第二个大数据文件,每读一个query 就find 下,让布隆过滤器判断是否在里面,如果在布隆中就是交集中的元素。
因为布隆存在误判,存在不是准确的,不存在一定是准确的。
四.给上千个文件,每个文件大小为1K—100M。给n个词,设计算法对每个词找到所有包含它的文件,你只有100K内存!
1.将你所要搜索的词进行分组,也就是获取到关键字,获取到关键字后去上千个文件中查找
2.对于每个文件,我们可以建立布隆,并在这些建好的布隆当中查看是否有我们已经获取好的关键字
3.进行布隆过滤后,我们考虑建立哈希表(拉链法),此时哈希表的存放的不是链表的地址,而是文件的地址,如果某一文件中含有关键字,就将其文件的地址存放在哈希表Key(关键字)对应位置
4.关键字在哈希表中映射的位置所保存的文件就是包含这个关键字的文件
五.有一个词典,包
含N个英文单词,现在任意给一个字符串,设计算法找出包含这个字符串的所有英文单词!
给输入字符串,利⽤用字母建立倒排索引,索引中存储该字母 出现在哪个单词以及在单词中位置;
查询时,利用倒排找到所有的单词,并求交集并且位置要连续