海量数据处理
程序员文章站
2024-03-15 21:51:42
...
1.给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?!
思路:要进行哈希切分编号,将100G 文件分成100份,将每个IP映射到相应的文件中,再用map统计每个文件中出现次数最多的IP,再讲这100份出现次数最多的IP放到hashtable中进行比较找出最大值。
2.与上题条件相同,如何找到top K的IP?如何直接用Linux系统命令实现?!
Linux命令,假设top 10:sort log_file | uniq -c | sort -nr k1,1 | head -10
3.给定100亿个整数,设计算法找到只出现一次的整数!
使用hash将所有整数映射到1000个文件中,在每个文件中使用 bitmap,用两个bit表示出现次数,00表示没出现过,01表示出现过1次,10表示出现过多次,11舍弃,最后归并每个文件中出现只有1次的数即为所求。
4.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集!
使用hash函数将第一个文件的所有整数映射到1000个文件中,每个文件有1000万个整数,大约40M内存, 内存可以放下,把1000个文件记为 a1,a2,a3.....a1000,用同样的hash函数映射第二个文件到1000个文件中,这1000个文件记为b1,b2,b3......b1000,由于使用的是相同的hash函数,所以两个文件中一样的数字会被分配到文件下标一致的文件中,分别对a1和b1求交集,a2和b2求交集,ai和bi求交集,最后将结果汇总,即为两个文件的交集
5.1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数!
先用hash函数将这个文件所有的整数映射到1000个文件中,每个文件大概40MB,内存可以放得下,在对每个文件使用Bitmap,Bitmap扩展:用2个bit表示状态,00未出现过,01出现过1次,10出现了2次,11表示出现两次以上,最后统计1000个文件中出现不超过两次的所有整数。
6.给两个文件,分别有100亿个url,我们只有1G内存,如何找到两个文件交集?分别给出精确
算法和近似算法!
精确算法:利用hash映射将两个文件分别映射到各1000个小文件中,每个文件大概40MB,如:第一个文件a0,a1,a2,a3……a999,第二个文件b0,b1,b2,b3……b999由于使用的是相同的hash函数映射的所以相同的url对应的文件下标是一样的,所以分别对(a0,b0)(a1,b1)(a2,b2)……(a999,b999)求交集,最后统计1000个文件的交集即可
近似算法:先将query类型通过相同的散列函数(BKDR散列函数)处理是这些数据先转化为整形数据,将第一个文件中的数据映射到这个位图中去(大概要512mb)再让第二个文件中的数据去这个位图中进行查找,找到的便是交集。
7.如何扩展BloomFilter使得它支持删除元素的操作?如何扩展BloomFilter使得它支持计数操作?!
布隆过滤器是不允许删除的,每一位可能是多个字符的投影,我们就不能把某一位置为0表示将其删除。如果要实现布隆过滤器的删除操作我们可以用引用计数来进行实现。
Bloom filter将集合中的元素映射到位数组中,用k(k为哈希函数个数)个映射位是否全1表示元素在不在这个集合中。Counting bloom filter(CBF)将位数组中的每一位扩展为一个counter,从而支持了元素的删除操作。Spectral Bloom Filter(SBF)将其与集合元素的出现次数关联。SBF采用counter中的最小值来近似表示元素的出现频率。
8.给上千个文件,每个文件大小为1K—100M。给n个词,设计算法对每个词找到所有包含它文 件,你只有100K内存!
对于这个问题还得要用到布隆过滤器来进行操作,有上千份文件就要有上千个布隆过滤器,并将这上千个布隆过滤器存到一个文件中去。将内存分为两部分,一部分用来进行读取一个布隆过滤器,还有一部分用来读取文件。对每个读进去的单词判断是否包含这个单词。如果不包含就读取下一个文件,如果包含的话就把这个词和这个词对应的文件信息存到一个专门的文件中去。直到所有的词已经读完。
9.有一个词典,包含N个英文单词,现在任意给一个字符串,设计算法找出包含这个字符串的所 有英文单词!
我们对于这种问题可以用字典树来进行解决。字典树又称:单词查找树,这种树形结构是哈希树的一种变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。
首先要把这N个单词建立一颗字典树,再用给定的单词去这棵树中进行查找,找到就记录想用的英语单词,没有找到的话那么这棵树中就不包含这个单词。在这颗树比较深的情况下,就会比较浪费内存,可以用哈希表把这棵树n层以后的数据存放到哈希表中去,这样就会节省内存空间。
上一篇: 【面试题】海量数据处理常见方法总结
下一篇: TOP-K问题