1. 给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址(hash文件切分)
参考哈希表知识:>哈希表(开散列)<
>哈希表(闭散列)<
解:显然我们是不可能将这100G内存直接加载到内存中去处理的,所以我们可以对大文件进行划分,将相同的IP地址会被划分在一块。假定将这个文件分为1000份,那么一个文件的大小大概为100M,然后利用哈希函数(key%1000),将同一个IP地址放入同一个文件中。然后对每个文件进行处理,将他们的IP作为Key,value作为每个IP出现的次数,最后利用排序算法对value进行排序,找到每个小文件中出现次数最多的IP。
2. 给定100亿个整数, 找到其中只出现一次的整数(位图变形, 用两位来表示次数)
参考位图知识:>位图<
解:整数大概有42亿个,所以100亿里肯定有重复的数字。我们可以试着用位图解决这个问题,但是位图只能表示一个数是否存在,但不能表示是否存在一次或多次,所以我们需要用两个位来表示一个数。我们可以用00来表示不存在,用01表示存在一次,用10表示存在多次。1G=2^30B,1B=8bit,所以1G大概可以表示40多亿数。
3. 有两个文件, 分别有100亿个query(查询词, 字符串), 只有1G内存, 找到两个文件的交集(hash文件切分 + 布隆过滤器).
参考布隆过滤器知识:>布隆过滤器<
解:对文件A进行哈希切分,读取每一个query,计算hash值.例如我们要切分成100份,就可以让hash值模上100,如果模的值为0,就把这个query放到布隆过滤器中,这样我们就得到了0号集合;然后遍历文件B,对其中的query进行hash值,模上100,如果模的值为0,就在布隆过滤器中查找。
依次处理1号集合(hash值模100等于1),2号集合(hash值模100等于2),3号集合……….
备注:布隆的不一定是准确的,可能出现哈希冲突,所以这是一种近似的算法, 不是百分之百精确。
4. 给上千个文件, 每个文件大小为1K - 100M, 设计算法找到某个词存在在哪些文件中(倒排索引)
正排:通过文件id,找到包含哪些词
倒排:通过词,找到对应的文件id
本文探讨了在有限内存条件下处理大规模数据集的有效方法,包括使用哈希表处理巨型文件中的IP地址,利用位图寻找重复整数,借助布隆过滤器发现两个大文件的交集,以及建立倒排索引来高效检索特定词汇。

1479

被折叠的 条评论
为什么被折叠?



