海量数据面试题
程序员文章站
2024-03-15 21:52:00
...
哈希切割
- 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 如何找到top K的IP?如何直接用Linux系统命令实现?
- 采用hash的方式,ip%m,将大文件分成 m 个小文件。
- 对每个小文件,用hash表统计ip出现的次数。找出这个小文件出现次数最多的 ip
- 在这m个ip中,比较得到出现次数最多的ip。
- 如果是top k的话,就维护一个长度为k的最小堆。
位图引用
- 给定100亿个整数,设计算法找到只出现一次的整数?
- 使用两个位图的对应位表示一个整数的状态。也就是说用两个比特位来表示一个整数的状态。
00 表示没出现过
01 表示出现过一次
10 表示出现一次以上
- 因为整个的最大范围也就是 42 亿多,所以创建两个 500M 的数组来作为存储所有整数状态的位图。
- 将所有整数表示到位图中,状态为 01 的比特位经过计算就可以得到只出现一次的整数。
- 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
- 创建两个大小为 500M 的整形数组分别作为两个文件的位图。
- 将两个文件的所有数字分别表示到这两个位图中。
- 对两个位图进行与运算,就可以找到交集啦。
- 位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数
- 这个思路的话和第二个题目差不多呢,用两个比特位来表示,
- 我们可以这样表示,00表示没有出现,01表示出现一次,10表示出现二次,11表示出现三次
- 那么我们只需要统计一下出现三次的整数,那么出现次数不超过2次的整数就可以统计出来了。
- 也是使用位图的思路,只不过这次我们需要两个位。
- 而且 int 类型的话,也就是42亿,用两个位表示的话大概需要 2 G 的内存吧。
- 但是题目条件只有1G,因此我们将正数和负数分开,大概正数不到1G,负数不到1G吧。就很完美的解决这个问题。
布隆过滤器
- 给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法
- 近似算法:先将一个文件的所有 query 放进一个布隆过滤器中,然后用第二个文件对这个已经填充好第一个文件的布隆过滤器进行查找。
- 精确算法:利用哈希切割的方法对两个大文件进行切割,将相同的 query 放进相同编号的小文件里,然后打开一个小文件的同时也打开另一个相同编号的小文件,就可以查看是否存在。
- 如何扩展BloomFilter使得它支持删除元素的操作
- 原本布隆过滤器的底层封装着位图,如果要支持删除操作,就需要将原本的位图换成数组采用引用计数的方式,每次删除引用计数减一。
- 但是这个做法会大大的违背布隆过滤器节约空间的初衷。
倒排索引
- 给上千个文件,每个文件大小为1K—100M。给n个词,设计算法对每个词找到所有包含它的文件,你只有100K内存
- 对文件进行哈希切割,然后用单词名((文件里的单词)作为 map 的 key,value是一个链表,链表保存文件名。然后对文件进行遍历,将文件里的单词进行插入,最后插完之后所有的单词以及每个单词对应的文件名就保存在了map里。
- 然后给一个单词,现在 map 里找到对应单词,然后就可以得到包含该单词所有的文件名。
- 正排索引:给定编号,就能获取到文档内容
- 倒排索引:给定一个词,就能够获取到这个词和那些文档编号有关。
上一篇: TOP-K问题