【数据结构】一些海量数据处理问题

半腔热情 提交于 2019-12-08 19:03:02

1. 给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址(hash文件切分)


把这个100个G的文件分成1000份左右的文件,然后把这个100个G里面相同的IP地址, 使用相同的散列

函数将所有IP地址转换为一个整数key,再利用 index=key%1000就可将相同IP分到同一个文件




2. 给定100亿个整数, 找到其中只出现一次的整数(位图变形, 用两位来表示次数).


这100亿个数据有三种状态:不存在、 存在一次、存在多次。

故此,我们需要对传统位图进行扩展,用两位来表示一个整数的状态:00表示不存在、01表示存在一次, 10表示存在多次,11表示无效状态。

3. 有两个文件, 分别有100亿个query(查询词, 字符串), 只有1G内存, 找到两个文件的交集(hash文件切分 + 布隆过滤器).


在32位操作系统下,一个整数有32个字节,所以100亿整数 = 100 * 4字节 = 40G,所以不能一次性查找


精确的算法:哈希文件切分

将两个文件中的query hash到N个小文件中,并标明query的来源,在各个小文件中找到重合的query

将找到的重合query汇总,得到交集


近似算法:使用布隆过滤器

把一个文件的内容存入布隆过滤器,然后使用另一个布隆过滤器中查找是否存在,找到交集的元素,因为

可能出现哈希冲突,所以这是一种近似的算法, 不是百分之百精确


4. 给上千个文件, 每个文件大小为1K - 100M, 设计算法找到某个词存在在哪些文件中(倒排索引).


首先,把这个词存入一个单项链表中,头结点存储这个词,链表后面存储的都是文件名,然后依次遍历每个

文件,取出文件中的每一个单词并与这个词对比,若找到,就将此文件的文件名添加到后面的链表中,遍历

完所有文件,然后就得到了这个词存在在哪些文件中


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!