大数据问题

来源:互联网 发布:日常工作安排软件 编辑:程序博客网 时间:2024/05/16 10:06

一般解决大数据问题有两个思路:

1)先将与这道题相关的所有的数据结构进行使用一遍,如果有合适的就直接进行使用

2)如果不能直接使用,一般就要进行哈希切分,然后再使用合适的数据结构进行问题的解决

哈希切分:
1)先估算出要切分的大小

2)然后使用哈希的除留余数法进行各个数据的映

问题:

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

思路分析:

1)要进行哈希切分编号,log file可以看做是字符串,利用哈希字符串转换算法进行转换,转换成整型后,利用哈希函数进行映射,同一IP地址肯定映射到同一编号中,

2)这里我们使用效率很快的哈希表,进行此数的统计,就可以找出出现此数最多的IP地址

2、与上题条件相同,如何找到topK的IP地址

思路分析:

1)要找到topK的IP地址,我们如果直接进行排序的话,那么有两个问题,第一就是内存放不下,第二就是效率太慢

2)所以这我们可以建一个K大小的堆,那么建什么堆呢,这里建小堆比较好,因为来一个数和进行堆顶的元素进行比较,然后进行向下调整,大的就下去了,因此最终统计的就是topK
3、给定100亿个整数,设计算法找到只出现一次的整数

思路分析:

1)100亿个数,无符号整型最多才42亿多,因此我们首先要明白,这里有很多重复的数,所以我们在进行空间的建立时,只用分析42亿多的就可以了,那么就是16G,这道题没有规定要使用多大的内存,但是如果我们直接建16G的,那也不可能,所以我们就利用位图来进行解决,那么整型是需要32位的,就需要大约500M的内存就可以了

2)然后我们就可以进行遍历只出现一次的整数
4、给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件的交集

思路分析:

1)文件进行比较,用位图显然不能解决

2)肯定要进行哈希切分,我们将两个文件分别切分为1000个文件,先对文件A分的1000个文件里的整数进行哈希分配,即取出来整数模除1000,使相同的整出进入相同的文件,文件B切分的1000个文件进行同样的处理,然后分别拿A哈希切分好的第一个文件和B哈希切分好的第一个文件对比,找出交集存到一个新文件中,依次类推,直到2000个文件互相比较完。

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

思路分析:

1)这里类似于第三题

2)但是要找出现次数不超过2次的整数,我们可以将状态位图的位用两位,因为我们就表示三种状态,在,不在,重复。
6、给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件的交集?分别给出精确算法和近似算法

@精确算法:

思路分析:

1)我们首先来看,100亿个query(一般query就当做字符串),如果我们假定这里的一个字符串大小是50,那么我们就需要500G大的内存,显然放不下,所以我们就要进行哈希切分

2)这里我将它切分成1000份,那么每份的大小就是500M,

3)然后我们使用什么方法来进行这道题的具体解决呢,我来用图示说明下:


@近似算法:

利用布隆过滤器:

经过哈希切分后,将其中一个放到哈希表中然后让B来进行比对

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

思路分析:

1)首先我们知道

      *布隆过滤对于不存在的数是能进行准确判断的,但是对于存在的数是不一定,因为会出现误判的情况

      *由于布隆的特点,因此它在实现的时候,是有多个置位的,因此不同的数(或者是其它的类型)会出现置位的冲突,所以如果直接进行删除的话,就会影响其它的数


2)因此,这里我们可以想到一种解决办法就是利用引用计数
8、如何扩展BlooFilter使得它支持计数操作?

思路分析:

1)上题中我们知道引用计数可以使得布隆过滤器实现删除操作,但是有问题,如果我们使用引用计数的话,至少得4个字节,而我们知道布隆过滤器的优点有节省空间,这样的话,就有点违背了,所以我们就放弃位图,所以这里我们呢就要考虑使用样的什么数据结构

2)(以字符串来为例)这里我们依然用vector来存储引用计数,然后进行哈希字符串转换算法进行转换,让转换后对应的整型数作为下标自增,这里很明显就不用位图了,利用引用计数已经完成了它的功能。

3)所以我们进行删除的时候,就将计数中大于等于1的进行减减复位
9、给上千个文件,每个文件大小为1K-100M。给n个词,设计算法对每个词找到所有包含它的文件,你只有100K内存

思路分析:

1)注:文件不能进行切分

2)//给定的内存很小,我们将比如说90K大小的直接利用哈希表进行做,

   * 用一个文件info 准备用来保存n个词和包含其的文件信息。
   * 首先把n个词分成x份。对每一份用生成一个布隆过滤器(因为对n个词只生成一个布隆过滤器,内存可能不够用)。把生成的所有布隆过滤器存入外存的一个文件Filter中。
   *将内存分为两块缓冲区,一块用于每次读入一个布隆过滤器,一个用于读文件(读文件这个缓冲区使用相当于有界生产者消费者问题模型来实现同步),大文件可以分为更小的文件,但需要存储大文件的标示信息(如这个小文件是哪个大文件的)。
   *对读入的每一个单词用内存中的布隆过滤器来判断是否包含这个值,如果不包含,从Filter文件中读取下一个布隆过滤器到内存,直到包含或遍历完所有布隆过滤器。如果包含,更新info 文件。直到处理完所有数据。删除Filter文件。

备注:
1:关于布隆过滤器:其实就是一张用来存储字符串hash值的BitMap.
2:可能还有一些细节问题,如重复的字符串导致的重复计算等要考虑一下。
10、有一个字典,包含N个英文单词,现在任意给一个字符串,设计算法找到包含这个字符串的所有英文单词。

思路分析:

1)这里可以用kmp算法或者字典树