基于哈希的海量数据处理

基于哈希表给出以下问题的解决方案:


1. 给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址(hash文件切分)
解:用哈希文件切分的方法将该文件切分为1000份。再进行处理。将该文件先分1000次访问,每次访问时依次将所访问的IP地址用哈希函数进行计算其哈希值,因为再次要将其切分为1000份,所以用计算得到的哈希值对1000进行取模,取模得到0的放的0号哈希表中,取模得到1的放到1号哈希表中,从而依次将100G的文件进行切分为1000份,因为相同的IP得到的相同的哈希值,所以相同的IP一定都在同一个哈希表中,再依次对切分后的1000个哈希表进行访问,例如,先对0号哈希表进行找,找到0号哈希表中出现次数最多的IP,并将其出现次数保存下来,再对1号哈希表进行查找,找到1号哈希表中出现此时最多的IP,将其出现的次数与0号哈希表查找结果进行比较,保较大的那一个,遍历完所有哈希表后,就找到了出现次数最多的IP地址。


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

解:之前的位图都是用 1 位来表示存在与否,因为要找到其中只出现一次的整数,我们用两位来表示这个数的存在与否即是否存在一次,例如,当我们在设置位图时,将其
大小设为设表示数据量的 2 倍,每次设置 index位时,用两位来表示,00表示不存在,10表示为存在1 ,当超过 1 次时用 11 表示,当我们在查找一次数是否存在时,就在位图中找所对应的两位是不是 10 ,是就表示这个数存在一次,否则就不是。

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

; 分别对两个文件进行哈希文件切分,例如切分为 1 亿份,读取每一个 query, 计算哈希值,模上 1 亿,例如得到 1 ,放到布隆过滤器中,具体切分方法如问题 1 中,就得到 1 亿个布隆过滤器,再遍历文件 B query, 计算哈希值,然后在对应的布隆过滤器中找,找到相同的就保存下来,遍历完文件 B 后,保存下来的字符串就是两个文件的交集。


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

平时我们是按照文件的地址来找到里面的内容,这是属于正排索引 正向索引开发出来用来存储每个文档的单词的列表。正向索引的查询往往满足每个文档有序频繁的全文查询和每个单词在校验文档中的验证查询。在正向索引中,文档占据了中心的位置,每个文档指向了一个它所包含的索引项的序列。也就是说,文档指向了它包含的那些单词而反向索引则是单词指向了包含它的文档,很容易看到这个反向的关系。而与正向索引相比,倒排索引的优点是在处理复杂的多关键字查询时,可在倒排表中先完成查询的并、交等逻辑运算,得到结果后再对记录进行存取,这样不必对每个记录随机存取,把对记录的查询转换为地址集合的运算,从而提高查找速度。所以,倒排索引一般被应用于文档检索系统,查询哪些文件包含了某个单词,比如常见的学术论文的关键字搜索

 

猜你喜欢

转载自blog.csdn.net/misszhoudandan/article/details/79636456