大数据问题面试题

来源:互联网 发布:怎样评价魔兽世界 知乎 编辑:程序博客网 时间:2024/05/15 19:47

1、给一个超过100G大小的 log file,log中存着IP地址,设计算法找出出现次数最多的IP地址?
由于超过100G,那必须对文件进行切分。
(1)切分,可以切成100份,每份有1G,那哈希表的大小就是100,利用字符串哈希算法将字符串IP转换成整型
(2)过哈希切分,同一个ip就会分割到同一个文件。
(3)是依次将这100个文件读入内存中,统计ip出现的次数,依次进行比较,找出出现次数最多的ip.
用到哈希切分,就有可能出现冲突,若某个文件冲突太多,可以将这个文件在进行哈希切分。

2、与上题条件相同,如何找到 top K的IP?如何直接用linux系统命令实现?
(1)哈希切分后,同一个ip被分割到一个文件,依次统计次数。这里要求它的top k,很直接就想到用堆(key/value)来实现。
(2)需要建一个大小为k(key/value)的小堆。建小堆。堆顶是最小的,每次取一个数与堆顶比较,比堆顶小就不交换,大交换,然后进行依次向小调整又成小堆,就这样重复。完成后,这个堆就是top k。

3、给两个文件,分别有100亿个query,我们只有1G内 存,如何找到两个文件交集?分别给出精确算法和近似算法。
答:
100亿*4字节 = 400亿字节 = 40G
精确算法:哈希切分
对两个文件分别进行哈希切分,使用相同的散列函数将所有query转换为一个整数key ,再利用 index=key%1000就可将相同query分到同一 个文件。(index为文件下标)将两个文件中下标相同的小文件进行对比,找出其交 集。将100个文件的交集汇总起来即为所给文件的文件交集 。此种算法时间复杂度为O(N)。

近似算法:布隆过滤器
首先使用相同的散列函数将所有 query转换为一个整数key,又因为布隆过滤器中的每 一位就可代表一个整数的存在 与否,而16G的整数用 位图512M即可表示,将第一个文件中的整数映射到位图中去,拿第二个文件中的数字到第一个文件映射的位图中去对比,相同数字存在即为交集。此种算法时间复杂度为O(N)。
注意:布隆过滤器判断不存在是确定的,而存存在在可能导致误判,所以称近似算法。

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

5、有一个词典,包含N个英文单词,现在任意给一个字符串,设计算法找出包含这个字符串的所有英文单词。
答:对于这道题目,我们要用到一种特殊的数据结构—-字典树来解决它,所谓字典树,又称单词查找树(或Trie树),是一种哈希树的变种。

典型应用:用于统计、排序和保存大量的字符串,经常被搜索引擎系统用于文本词频统计。

优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率高于哈希表 。

基本性质:根节点不包含字符,除根节点外每个节点都只包含一个字符,从根节点到某一节点,路径上所有经过的字符连接起来,为该节点对应的字符串;每个节点的所有子节点包含的字符都不相同 。

应用:串的快速检索、串排序、最长公共前缀

解:
用给出的N个单词建立一棵与上述字典树不同的字典树 ,用任意字符串与字典树中的每个节点中的单词进行比较,在每层中查找与任意字符串首字母一样的,找到则遍历其下面的子树,找第二个字母,以此类推,如果与任意字符串的字符全部相同,则算找到。