海量数据处理方法及应用

[亡魂溺海] 提交于 2019-12-08 18:22:06

一、哈希切割top K问题

1. 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?

(1)首先使用散列函数HashFunc(ip)将每一个IP地址转化为整型,再通过HashFunc(ip)%1000使得每一个IP各自进入到所切分的1000个小文件中,余数是多少就映射到多少号文件中,这样做能保证相同IP进入到同一文件中;
(2)接着在每一个小文件中建立Key-Value模型的哈希表,各自统计出Value(出现次数)最大的IP;
(3)最后依次比较这1000个小文件中出现次数最多的IP,找到最终出现次数最多的IP地址。

2. 与上题条件相同,如何找到top K的IP?

     先对第一个小文件的数据建立小堆(大小为K),存入出现次数最多的前K个IP,再依次读入每一个文件,将每一个IP的出现次数与堆中IP次数比较,如果大于堆顶的IP,则替换堆顶,并更新堆,依次执行下去,直到1000个文件全部读完,整个堆的数据即为出现次数最多的前K个IP。

二、位图应用

1. 给定100亿个整数,设计算法找到只出现一次的整数

     所有整数的范围是从0到42亿9千万,每个整型占用4字节,这样存放这些整数至少需要16G的内存空间,太耗费空间了,如果用位图的思想来解决这个问题,就可以大幅度节省空间。
     在该题中需要注意的是要统计次数,而原本的位图用1个bit位只能表示一个数是否存在,所以要将原本的位图进行一次变形,用2个bit位表示一个数(00表示没有出现,01表示出现一次,10或11表示出现多次),最后统计每两位为01的数据即为只出现一次的整数,此时存放这些整数占用空间大小约为1G。

2. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集

     将每个文件中的数据都映射到一个位图中去,每个文件的数据大约占用500M的内存空间,刚好满足要求,之后让两个位图进行位操作与(&)得到一个新的位图,在新的位图中统计所有bit位为1的数据即为两个文件的交集。

3. 1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数

     这个问题和第一个问题类似,同样利用位图的思想,用2个bit位表示一个数(00表示没有出现,01表示出现一次,10表示出现两次,11表示出现多次),最后统计每两位为01或10的数据即为出现次数不超过2次的整数,此时存放这些整数占用空间大小约为1G。

三、布隆过滤器+哈希切分

1. 给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法

(1)精确算法:利用哈希切分
这里写图片描述
     假设每个query占用字节大小为50,那么每个文件就需要大约500G的内存空间,这显然满足不了,这时我们就需要利用哈希切分将每个文件切分成1000份小文件,那么每个小文件的占用空间就只有500M左右。
     两个文件分别使用相同的散列函数HashFunc(query)将每一个query转化为整型,再通过HashFunc(ip)%1000使得各自的每一个query进入到所切分的1000个小文件中,余数是多少就映射到多少号小文件中,这样做能保证相同query进入到同一文件中,最后再依次比较编号相同的小文件就可以找到两个文件的交集。
(2)近似算法:利用布隆过滤器
     将其中一个文件的内容利用布隆过滤器映射到一个位图中,再用另一个文件的内容依次在该位图上查找,若存在则为两个文件的交集(这种算法可能会出现误判的问题)

2. 如何扩展BloomFilter使得它支持删除元素的操作

     对于布隆过滤器来说,当我们要删除某一个关键字时,该关键字对应的位可能会牵动到其他的关键字,所以一个简单的改进就是将位数组中的每一位扩展为一个counter,从而支持了元素的删除操作。要注意的一点是:当计数减到0时,就保持0不变,表示该地址处没有映射。

3.如何扩展BloomFilter使得它支持计数操作

     要使BloomFilter支持技术操作,每一位至少是一个int类型,一旦位扩展成了counter,每一个counter就不仅能表示这一地址有无映射,还能表示映射的个数。

四、倒排索引

给上千个文件,每个文件大小为1K—100M。给n个词,设计算法对每个词找到所有包含它的文件,只有100K内存

这里写图片描述
(1)首先对于每一个文件,建立一个布隆过滤器,以方便查找所给的n的关键词;
(2)接着建立一个哈希桶(顺序表+链表),顺序表里依次存放每一个关键词,每一个关键词所对应的链表里存放有该关键词出现的文件的地址(也可以加上在某一个文件中出现的次数);
(3)最后统计出每一个关键词所对应的链表里的文件地址,即可找到所有包含它的文件。

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