一、哈希切割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)最后统计出每一个关键词所对应的链表里的文件地址,即可找到所有包含它的文件。
来源:CSDN
作者:X_Perseverance
链接:https://blog.csdn.net/X_Perseverance/article/details/80373249