程序员面试笔试宝典学习记录(七)(海量数据相关知识)

    针对海量数据,可以使用的方法非常多,常见的方法有:Hash法,Bit-map法,Bloom filter法,数据库优化法,倒排索引法,外排序法,Trie树,堆,双层桶排序法(simhash法和多层划分法,实际上都是多机器分而治之的思想)以及mapreduce法。

    Hash主要是用来进行”快速存取“,在O(1)时间复杂度里就可以查找到目标元素,或者判断是否存在。Hash数据结构里的数据对外是杂乱无序的,无法得知其具体存储位置,也不知道各个存储位置之间的相互关系,但是却可以在常数时间里判断元素位置及存在与否。在海量数据处理中,使用Hash方法一般可以快速存取,统计某些数据,将大量数据进行分类。例如,提取某日访问网站次数最多的IP地址等。

   

    Bit-map(位图)法的基本原理是使用位数组来表示某些元素是否存在,如8位电话号码中查重复号码,它适用于海量数据的快速查找,判重,删除等。位图法作用巨大,除了判断数据是否重复以外,也经常使用位图法判断集合中的某个数据是否存在。

   

    Bloom filter是一个海量数据滤重器,空间效率和时间效率都很好的随机数据结构,它用来检测一个元素是否属于一个集合。但它引入了程序设计的另外一个考虑,正确率,它牺牲了正确率来换取时间和空间的效率。它判断某个元素不属于这个集合时,该元素一定不属于这个集合;当它判断某个元素属于这个集合时,该元素不一定属于这个集合。适用于对于低错误率可以容忍的场合。

    基本原理是位数组和Hash函数的联合使用。首先,Bloom filter是一个包含了m位的位数组,数组的每一位初始化为0,然后定义k个不同的Hash函数,每个函数都可以将集合中的元素映射到位数组的某一位,当向集合中插入一个元素时,根据k个Hash函数可以得到位数组中的k个位,将这些位设置为1。如果查询某个元素是否属于集合,那么根据k个Hash函数可以得到位数组中的k个位,查看k个位置的值,如果有的不为1,那么该元素不在此集合中,如果k个位全部为1,那么该元素可能在此集合中。

    

    使用Bloom filter的难点在于如何根据输入元素的个数n,确定位数组m的大小以及Hash函数。

    Hash函数个数:k = (ln2)*(m/n)时错误率最小,约等于(m/n)的0.7倍。

    m的取值应该保证位数至少一半为0,则m>=nlg(1/E)*lge 约等于 nlg(1/E)的1.44倍。

    CBF与SBF是BF的扩展,CBF将位数组中的每一位扩展为一个counter,支持元素删除。SBF将其与集合元素的出现次数关联,SBF采用counter中的最小值近似表示元素的出现频率。

 

    互联网上的数据一般都被存储在数据库中,数据库管理软件选择是否合理、表结构设计是否规范、索引创建是否恰当都是影响数据库性能的重要因素。所以,对数据库进行优化,实现海量数据高效处理的有效方法之一,常见的优化数据库的思路:

    (a)优秀的数据库管理工具,

    (b)数据分区,

    (c)索引,

    (d)缓存机制,

    (e)加大虚存,

    (f)分批处理,

    (g)使用临时表和中间表,

    (h)优化查询语句,

    (i)使用视图,

    (j)使用存储过程,

    (k)用排序来取代非排序存取,

    (l)使用采样数据进行数据挖掘。

 

    倒排索引是目前搜索引擎公司对搜索引擎最常用的存储方式,也是搜索引擎的核心内容。在搜索引擎实际的引用之中,有时需要按照关键字的某些值查找记录,所以是按照关键字建立索引,这个索引就被称为倒排索引。

    这里可以了解一下搜索引擎公司的数据流是如何进行的?

 

    外排序的适用范围是大数据的排序以及去重复,外排序存在很大的缺陷,消耗大量IO,效率不高。K路归并排序需要借助最小堆~

 

    Trie树,又称为字典树,哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。优点:利用字符串的公共前缀减少查询时间,最大限度的减少无谓的字符串比较,查询效率比哈希表高。

    三个基本性质:根节点不包含字符串,除根节点外每个节点都只包含一个字符;

                       从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串;

                       每个节点的所有子节点包含的字符串都不相同。

    这个数据结构的使用还是自己coding一下比较合适。

 

    海量数据中堆的作用,另外堆也用于K路归并等多个数字比较求最小的场景中。

    

    桶排序一般适用于寻找第k大的数,寻找中位数,寻找不重复或重复的数字等情况。

 

    MapReduce方法,云计算的核心技术之一,是一种简化并行计算的分布式编程模型。它为并行系统的数据处理提供了一个简单,高效的解决方案。主要目的为了大型集群的系统能在大数据集上进行并行工作,并用于大规模数据的并行运算。

    在架构中,MapReduce API提供Map和Reduce处理,GFS分布式文件系统和BigTable分布式数据库提供数据存取。

    这里有一篇关于海量数据处理的好文章。另外更多的海量数据面试知识july博客讲解也非常详细,自己需要去参考一番。

    

    TOP k问题有很多应用场景,尤其程序员面试笔试中有很多实例:

    (a)有10,000,000个记录,这些查询串重复度比较高,如果除去重复后,不超过3,000,000个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门,请统计最热门的10个查询串,要求使用的内存不超过1GB。

    (b)有10个文件,每个文件1GB,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。按照query的频度排序。

    (c)有一个1GB大小的文件,里面的每一行是一个词,词的大小不超过16个字节,内存限制大小是1MB。返回频数最高的100个词。

    (d)提取某日访问网站次数最多的那个IP。

    (e)10亿个整数找出重复次数最多的100个整数。

    (f)搜索的输入信息是一个字符串,统计300万条输入信息中最热门的前10条,每次输入一个字符串为不超过255B,内存使用只有1GB。

    (g)有1000万个身份证号以及他们对应的数据,身份证号可能重复,找出出现次数最多的身份证号。

    重复问题相似的题目:

    (a)10亿个正整数,只有1个数重复出现过,要求在O(n)的时间内找出这个数字。

    (b)给定a,b两个文件,各存放50亿个url,每个url各占用64B,要求在O(n)的时间内找出a,b文件共同的url。

    (c)给40亿个不重复的unsigned int的整数,没有排序,然后在给一个数,如何快速判断这个数是否在那40亿个数当中。

    排序问题相似的海量数据题目:

    (a)一年的全国高考考生人数为500万,分数使用标准分,最低100分,最高900分,不存在成绩为小数的情况,把这500万考生的分数排序。

    (b)一个包含n个正整数的文件,每个正整数小于n,n等于1000万,并且文件内的正整数没有重复和关联数据,输出整数的升序序列。

 

posted @ 2014-08-14 16:07  weixliu  阅读(...)  评论(...编辑  收藏