解决大数据相关问题

在学习生活过程中,我们往往会遇到一些大数据方面的问题,那么遇到这些看似比较简单但数据量又非常庞大的题目时我们又该如何解决问题呢?

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

100G的文件中存放着IP地址,我们如何来找到出现次数最多的IP地址呢?普通的遍历方法肯定是不行的,这时候我们便需要解决大数据问题最常规的方法——文件分割。文件分割确实可以解决这种大数据方面的问题,但是如何进行分割却又成为了新的问题,我们为了提高切分的效率便选择了哈希切分

解决方案:采用哈希切分我们会将所有的IP地址经过同一个散列函数进行处理,那么相同的IP便会进入同一个文件当中,然后再统计每个文件中出现最多的IP的出现次数,那么便会知道出现次数最多的IP。

采用这个方法还有一个问题就是当我们把所有的IP都经过同一个散列函数分割到一个文件中,这个文件还是太大了,那么便将这个文件分成多份再使用哈希表,再汇总其相同IP的次数。

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

解决方案:这个问题的解法和上一个问题的解法基本上是相同的,我们还是要进行哈希切分,找出每个文件中IP出现的次数,然后再建一个k大小的最小堆找出每个文件中出现次数最多的前k个IP,然后汇总这时候堆里面出现次数最多的前k个IP,就是要找的 top k 的IP。

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

解决方案:

(1)方案一:哈希切分

我们可以将这个文件进行哈希切分,将这些数据大概分到100个文件中去,这样每个文件的大小就大概是400MB,这时我们可以将这些数据加载到哈希表中去,然后就会知道哪个数据是只出现一次的数据。

(2)方案二:位图

在位图中用0表示一个数不存在,用1表示这个数是存在的。在这里需要对位图做一个扩展就可以了,我们用两个为,00表示不存在,01表示出现一次,10和11表示这个数出现一次以上。这样就可以通过位图来解决这个只出现一次的问题,而且只需要1G空间就能放下这些数据。

(3)方案三:

整数有32个位,按最高为0和最高位1将这些数分成两部分,继续每一位都这样进行分,直到最后一位,查找哪个文件中只有一个数,这样就会找到。

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

100亿个整数大概占用40G空间。

方法1:

将一个文件分成100份,然后把这100份文件都加载到内存中去,用第二份文件中的数据到每一份文件中进行查找,这样能找到两个文件的交集,不过时间复杂度为O(n^2).

方法2:

使用哈希切分的方法,将一个文件数据使用一个哈希函数进行切分,这样相同的的数一定会进入同一个文件当中,然后进行编号,对另外一个文件也是用相同的哈希函数进行切分,这样我们只需要将相同编号里的文件进行比较,这样时间复杂度为O(n).

方法3:

将一个文件中的数据全部映射到位图中去,大概只要500MB的空间,再用第二个文件中的数据到第一个映射的位图中进行对比,相同的数字就会存在交集,这种方法的时间复杂度为O(n).

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

这道题其实是位图的变形,解法与第三道类似,可以参考第三题。

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

精确算法:哈希切分

如果我们找到精确的两个文件的交集,我们使用哈希切分来完成。在进行哈希切分之前,要将query类型先经过相同的散列函数(BKDR散列函数)处理这些数据先转化为整型数据,再用散列函数进行切分这样相同的数一定会进入同一个文件当中去,然后进行编号。对另外一个文件也进行相同的哈希函数进行切分,这样我们只需要将相同编号里的文件进行比较,时间复杂度为O(n).

近似算法:布隆过滤器

用近似算法找到这两个文件的交集可以使用布隆过滤器,先将query类型通过相同的散列函数处理使这些数据先转化为整形数据,将一个文件中的数据映射到位图上去(大约为512MB),再将第二个文件中的数据去这个位图中进行查找,找到的便是交集。

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

首先说一下布隆过滤器的基本性质,布隆过滤器是由布隆提出来的一种基于二进制向量和一系列随机函数的数据结构,但是有一点就是该数据结构是有误判的,所以不支持删除操作。当两个字符串经过同一个映射函数投影到同一个位置的时候,我们便将这个位置置为1,查询的时候当这个位置为1,我们只能说有一个字符串是存在的,但是却不能说两个字符串都存在,当表示0的时候,就可以说这个字符串一定不存在,即就是“存在是不准确的,不存在是准确的”。

所以布隆过滤器是不允许删除的,每一位可能是多个字符串的投影,我们就不能把某一位置为0表示将其删除,所以我们可以用引用计数来实现。

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

对于这个问题还得用到布隆过滤器来进行操作,有上千份文件就要有上千个布隆过滤器,并将这上千个布隆过滤器存到一个文件中去,将内存分为两部分,一部分用来进行读取一个布隆过滤器,还有一部分用来读取文件,对每个读进去的单词判断是否包含这个单词,如果不包含就读取下一个文件,如果包含的话就这个词和这个词对应的文件信息存到一个专门的文件中去,直到所有的词已经读完。

9.有一个词典,包含N个英文单词,现在给任意一个字符串,设计算法找出包含每个字符串的所有英文单词?

解决方法:字典树

我们对于解决这种问题可以用字典树来进行解决,字典树又称“单词查找树”,这种树形结构是哈希树的一种变种。典型应用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

首先要把这N个单词建立一颗字典树,再用给定单词去这棵树中查找,找到就记录此单词,没有找到的话就表示这棵树中不包含这个单词,在这棵树比较深的情况下,就会比较浪费内存,可以用哈希表把这棵树n层以后的数据存放到哈希表中,这样就会节省内存空间。




猜你喜欢

转载自blog.csdn.net/ypt523/article/details/79688555
今日推荐