大数据问题(九章算法)

这些问题都面临着一个内存不够用的问题。 
1.给一个超过100G大小的 log file,log中存着IP地址,设计算法找出出现次数最多的IP地址? 
由于超过100G,那必须对文件进行切分。 
(1)切分,可以切成100份,每份有1G,那哈希表的大小就是100,利用字符串哈希算法将字符串IP转换成整型 
(2)过哈希切分,同一个ip就会分割到同一个文件。 
(3)是依次将这100个文件读入内存中,统计ip出现的次数,依次进行比较,找出出现次数最多的ip. 
用到哈希切分,就有可能出现冲突,若某个文件冲突太多,可以将这个文件在进行哈希切分。 
2.与上题条件相同,如何找到 top K的IP?如何直接用linux系统命令实现? 
(1)哈希切分后,同一个ip被分割到一个文件,依次统计次数。这里要求它的top k,很直接就想到用堆(key/value)来实现。 
(2)需要建一个大小为k(key/value)的小堆。建小堆。堆顶是最小的,每次取一个数与堆顶比较,比堆顶小就不交换,大交换,然后进行依次向小调整又成小堆,就这样重复。完成后,这个堆就是top k。 
3.给定100亿个整数,设计算法找到只出现一次的整数? 
一个整数表示的最大范围是大概是40亿多,算是40亿那就是40*10^8*4字节大概是4g*4=16g,100亿就是16*2.5大概是40g。 
一个整型所表示的范围是16g,这么多整数,大概也需要开辟16g吧,内存太大。 
(1)利用位图(以位为单位存储) 
100亿除以32*4除以1024除以1024除以1024大概是1g多。这是用一个一个位来表示这个数存不存在。现在要找的是出现一次的,就是有三种状态,没出现、出现一次‘出现多次,这样一个就表示不了,需要两个位来表示数的状态(00不存在、01出现一次、10出现多次)那就要开辟2G的空间。然后对应映射,置状态,最后统计出现一次的整数。 
(2)哈希切分 
只要当牵扯到内存不够的问题,我们都可以用切块的方式。 
分成100份,每份大概不到500M,依次插入到哈希表中,把每份依次加载到内存,统计次数。 
4.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集? 
(1)将每一个文件进行哈希切分,分成1000份,每个文件40M。将每个整数都出来%1000,相同的数会进入同一个文件。 
(2)编号相同的文件一定会产生交集,经A,B的第一个文件加载到内存进行比较,找出相同的保存下来,同样把后面的文件也这样比较。 
5.1个文件有100亿个int,1G内存,设计算法找到出现此数不超过2次的所有整数。 
这道题解决方法和第三道题一样,用位图解决,2个比特位来表示4种状态。00没有出现、01出现1次、10出现2次、11出现2次以上。 
6.给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件的交集,分别给出近似算法和精确算法。 
近似算法:布隆过滤器,利用哈希算法将字符串转换成整型,在利用位图实现,一个query映射3个位,当判断时,必须三个位都有效,但是每一个位都重叠映射,不存在可以准确判断,判断存在就不准确了。 
精确算法:哈希切分 
(1)100亿个query4g*2.5*32=320G,哈希切分,将每个文件切分成1000份,每份320M,每个文件相同的query会进入相同编号的文件(字符串哈希算法将每个query转换成整型,对应的下标index=query%1000) 
(2)依次将相同编号的小文件加载到内存进行比较。将一个文件的小文件放入哈希表,用另一个文件相同编号的小文件去查找是否存在,依次比较,找出交集。 
7.如何扩展BloomFilter使得它支持删除元素的操作? 
布隆过滤器一个key对应多个位,删除时不能把对应位就直接置位初始状态,可能有别的key映射同样的位。可以考虑加引用计数还支持删除,删除引用计数减1,当减到0时就可以置为初始状态。 
8..如何扩展BloomFilter使得它支持计数操作? 
用的引用计数,就不能用一个位表示表示一个key,需要一个size_t。

猜你喜欢

转载自blog.csdn.net/harrytsz/article/details/81114358