海量数据面试题简要分析

1. 哈希切割topK问题

给一个超过100G的文件,文件中保存的是IP地址,设计算法找到出现次数最多的IP地址,并找出前topK的IP地址。

解决方法:

(1)我们可以从文件中拿出一条IP地址,将所有IP地址遍历一遍,和其他IP地址进行比较,统计次数。

在这种方式下,时间复杂度是O(n^2); 但是由于文件太大,I/O操作过于频繁,操作效率不高。

(2)我们可以利用哈希的思想,将100G的文件先切割成110份,每份文件的大小是1G,分别编号;

        将文件中的IP地址按照某种方式转化为整型,再设置哈希函数,将IP地址放入不同的文件编号中。

        则同一个文件编号存放的IP地址要么相同要么不同。

        我们要找出现次数最多的IP地址,可以将IP地址和出现的次数作为键值对封装在unordered_map中。

        要找出前topK 的IP地址,我们可以采用堆排,首先取出10个IP地址建立小堆,然后每次取出一个IP地址和堆顶元素比较,如果比堆顶元素大,就交换,依次进行,知道全比较结束。

2. 位图

给定100亿个数据,找到只出现一次的整数

解决方法:(1)将100亿个数字遍历一遍,比较并统计出现的次数。

                 (2)利用哈希切割,将100亿个数据分成小份,利用unordered_map将数据保存起来。

                 (3)将数据按照比特位进行划分,第一次按照最高位分为两组,再按照次高位将刚分好的两组分为四组,最后再按照最低位将四组分为八组。然后看每组中的元素的个数,如果只有一个元素,说明这个元素只出现了一次,如果有多个元素,则说明这个元素出现了多次。

                 (4)利用位图,所谓的位图,是利用一个bit 位来保存一个数据的状态,该数据在,则用1表示,不在,则用0表示。这里有100亿个数据,如果按照一个比特位来保存数据的话,需要512M空间的大小。而这里要统计数据出现的次数,我们知道,数据可能出现0次,可能出现1次,也可能出现多次,那么我们可以用两个比特位来表示数据存储的次数,即00表示0次,01表示出现1次,10表示数据出现多次,11则不表示任何状态,也就需要1G大小的内存空间,刚好够使用。这样我们利用位图就可以找到出现一次的整数。时间复杂度为O(n),空间复杂度为O(1);

3. 布隆过滤器

有一份黑名单,为了降低冲突的可能性,我们需要看某个记录是否在黑名单中。

解决方法:

首先布隆过滤器底层搭载的是位图,但是有不同的哈希函数。

先将记录转化为整型数字,假设有5种不同的方式,即用5个比特位来表示是否有这个人,此时冲突的概率会大大降低。若5个bit为全为1,则这个人有可能在黑名单中,若有一个为0,则这个人一定不在黑名单中。

布隆过滤器判断不存在一定是准确的,但是判断存在可能不准确。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值