海量日志数据,提取出某日访问百度次数最多的那个IP。
首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。
算法思想:分而治之+哈希
1、IP地址最多有2^32=4G种取值情况,所以不能一次性直接都完全加载到内存中。
2、考虑分而治之的思想,将IP地址进行hash(IP)%1024,把海量的数据分别存储到1024个文件中,这样,每个文件最有就含有4MB个IP地址。
3、对于每一个小文件,可以进行构造一个key value的hash map,将IP作为key值,出现的次数作为value值,同时记录下当前出现次数最多的那个IP地址。
4、可以得到1024个文件📃中出现次数最多的IP,再根据常规的排序算法得到总体上的出现次数最多的IP。
搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节
假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。
算法思想:经典的topK问题。
1、先对这批海量数据进行预处理,在O(n)的时间之内用hash表完成统计。
2、借助堆这个数据结构,找出topk,时间复杂度为nlogK。借助堆这个数据结构,我们可以在log量级的时间内查找和调整移动。我们可以维护一个大顶堆,然后遍历这300万左右的数据,分别和根元素进行比对,最后得出前十个热门的查询串。
有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词
算法思想:分而治之+hash
1、顺序读取文件,对于读取的每一个值,可以使用hash(x)%5000,将读取的词存储到5000个文件中,每个文件大概200k,如果还是有文件大于1m,可以按照这个方法继续往下分,直到可以直接放入内存中为止。
2、对于每一个小文件,统计每个文件节点中出现的词以及相应的一个频率(tries树🌲或者hashMap都可以)。取出出现频率最大的一百个词(可以采用含有100个节点的最小堆),这样又可以得到5000个文件。最后一步,可以将这5000个文件进行归并过程了(类似于归并排序)。
在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数。
方案1:可以采用2-bitmap进行,共需要内存
海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。
腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
使用bitmap,或者布隆过滤器。
10亿个域名如何判断,新来一个域名,如何判断在还是不在
可以使用布隆过滤器,判断不在就一定不在,判断在的话可能不在。