文章目录
-
海量日志数据,提取出某日访问百度次数最多的那个IP
-
寻找热门查询,300万个查询字符串中统计最热门的10个查询
-
有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。
-
有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。
-
给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
-
2.5亿个整数中找出不重复的整数,内存空间不足以容纳这2.5亿个整数。
-
给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
-
已知某个文件内包含一些电话号码,每个号码为 8 位数字,统计不同号码的个数。
-
5亿个int找它们的中位数
海量数据相关的面试题主要是考察数据量比较大,内存不足时数据的处理方式,规律性还是很强的,其实简单来说就是分治,将大的数据分成多个小的数据,分别进行处理。
需要先掌握的一些基本概念
-
常用的排序算法(堆排序)
-
HashMap,用于统计频率,遍历字符串,若不在 map 中,直接存入 map,key为字符串,value 记为 1;若在 map 中,则把字符串对应的 value 加 1
-
Hash映射,用于分治
-
BitMap,用于判断某个数据是否存在
-
前缀树
-
topK问题
海量日志数据,提取出某日访问百度次数最多的那个IP
题目的隐藏含义就是海量日志数据不能一次读取到内存中,否则直接用HashMap统计IP出现的频率(IP为key,频率为Value),然后按照频率排序就好了。
这道题的做法是先对文件遍历一遍,将一天访问百度的IP记录到一个单独的文件,如果这个文件还是很大,可以对IP进行hash取余,将IP映射到多个文件中,然后利用HashMap统计每个文件中IP的频率,分别找到每个文件中频率最高的IP,再从这些IP中找到整体频率最高的IP。
如果是频率最高的前N个怎么办?这时可以在利用HashMap统计每个文件中IP的频率后,维护一个小顶堆,找到TopN。具体方法是:依次遍历每个小文件,构建一个小顶堆,堆大小为 N。如果遍历到的IP的出现次数大于堆顶IP的出现次数,则用新IP替换堆顶的IP,然后重新调整为小顶堆,遍历结束后,小顶堆上的词就是出现频数最高的 N 个IP。
注:TopN问题在手写代码也是高频题,需要重点掌握,比如力扣215题:https://leetcode.cn/problems/kth-largest-element-in-an-array/comments/
寻找热门查询,300万个查询字符串中统计最热门的10个查询
题目详细描述:搜索引擎会通过日志文件把用户每次检索使用的所有查询串都记录下来,每个查询床的长度不超过 255 字节。假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门),请你统计最热门的10个查询串,要求使用的内存不能超过1G。
这也就是热榜的简单实现,当然实际的热榜会复杂很多,毕竟还要考虑一部分人要撤热搜或降热度等需求。
方法一:分治+HashMap
还是前面的老方法,先用Hash映射将查询字符串映射到多个小文件中,然后用HashMap统计每个小文件中查询字符串出现的频率(key为热门字符串,value为频率),找到每个小文件中的频率最高的top10,最后通过一个小顶堆统计所有小文件中的top10。
方法二:直接用HashMap