从海量数据中找出中位数

题目和基本思路都来源网上,本人加以整理。

题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。

关于中位数:数据排序后,位置在最中间的数值。即将数据分成两部分,一部分大于该数值,一部分小于该数值。中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了)。

分析:明显是一道工程性很强的题目,和一般的查找中位数的题目有几点不同。
1. 原数据不能读进内存,不然可以用快速选择,如果数的范围合适的话还可以考虑桶排序或者计数排序,但这里假设是32位整数,仍有4G种取值,需要一个16G大小的数组来计数。

2. 若看成从N个数中找出第K大的数,如果K个数可以读进内存,可以利用最小或最大堆,但这里K=N/2,有5G个数,仍然不能读进内存。

3. 接上,对于N个数和K个数都不能一次读进内存的情况,《编程之美》里给出一个方案:设k<K,且k个数可以完全读进内存,那么先构建k个数的堆,先找出第0到k大的数,再扫描一遍数组找出第k+1到2k的数,再扫描直到找出第K个数。虽然每次时间大约是nlog(k),但需要扫描ceil(K/k)次,这里要扫描5次。

解法:首先假设是32位无符号整数。
1. 读一遍10G个整数,把整数映射到256M个区段中,用一个64位无符号整数给每个相应区段记数。
说明:整数范围是0 - 2^32 - 1,一共有4G种取值,映射到256M个区段,则每个区段有16(4G/256M = 16)种值,每16个值算一段, 0~15是第1段,16~31是第2段,……2^32-16 ~2^32-1是第256M段。一个64位无符号整数最大值是0~8G-1,这里先不考虑溢出的情况。总共占用内存256M×8B=2GB。

2. 从前到后对每一段的计数累加,当累加的和超过5G时停止,找出这个区段(即累加停止时达到的区段,也是中位数所在的区段)的数值范围,设为[a,a+15],同时记录累加到前一个区段的总数,设为m。然后,释放除这个区段占用的内存。

3. 再读一遍10G个整数,把在[a,a+15]内的每个值计数,即有16个计数。

4. 对新的计数依次累加,每次的和设为n,当m+n的值超过5G时停止,此时的这个计数所对应的数就是中位数。

总结:
1.以上方法只要读两遍整数,对每个整数也只是常数时间的操作,总体来说是线性时间。

2. 考虑其他情况。
若是有符号的整数,只需改变映射即可。若是64为整数,则增加每个区段的范围,那么在第二次读数时,要考虑更多的计数。若过某个计数溢出,那么可认定所在的区段或代表整数为所求,这里只需做好相应的处理。噢,忘了还要找第5G+1大的数了,相信有了以上的成果,找到这个数也不难了吧。

3. 时空权衡。
花费256个区段也许只是恰好配合2GB的内存(其实也不是,呵呵)。可以增大区段范围,减少区段数目,节省一些内存,虽然增加第二部分的对单个数值的计数,但第一部分对每个区段的计数加快了(总体改变??待测)。

4. 映射时尽量用位操作,由于每个区段的起点都是2的整数幂,映射起来也很方便。

然后线面帖的是拎一个人的,原文地址:

http://hi.baidu.com/taney/blog/item/3afd11dde5391bd38c102936.html

有12个小球,外形相同,其中一个小球的质量与其他11个不同 
给一个天平,问如何用3次把这个小球找出来 
并且求出这个小球是比其他的轻还是重解答:哈哈,据说这是微软前几年的一个面试题。很经典滴啊!三次一定能求出来,而且能确定是重还是轻。 
数据结构的知识还没怎么学透,不过这个题我到是自己研究过,可以分析下。 
将12个球分别编号为a1,a2,a3.......a10,a11,a12. 
第一步:将12球分开3拨,每拨4个,a1~a4第一拨,记为b1, a5~a6第2拨,记为b2,其余第3拨,记为b3; 
第二步:将b1和b2放到天平两盘上,记左盘为c1,右为c2;这时候分两中情况: 

1.c1和c2平衡,此时可以确定从a1到a8都是常球;然后把c2拿空,并从c1上拿下a4,从a9到a12四球里随便取三球,假设为a9到a11,放到c2上。此时c1上是a1到a3,c2上是a9到a11。从这里又分三种情况: 
      A:天平平衡,很简单,说明没有放上去的a12就是异球,而到此步一共称了两次,所以将a12随便跟11个常球再称一次,也就是第三次,马上就可以确定a12是重还是轻; 
      B: 若c1上升,则这次称说明异球为a9到a11三球中的一个,而且是比常球重。取下c1所有的球,并将a8放到c1上,将a9取下,比较a8和a11(第三 次称),如果平衡则说明从c2上取下的a9是偏重异球,如果不平衡,则偏向哪盘则哪盘里放的就是偏重异球; 
      C:若c1下降,说明a9到a11里有一个是偏轻异球。次种情况和B类似,所以接下来的步骤照搬B就是; 

2.c1和c2不平衡,这时候又分两种情况,c1上升和c1下降,但是不管哪种情况都能说明a9到a12是常球。这步是解题的关键。也是这个题最妙的地方。 
      A:c1上升,此时不能判断异球在哪盘也不能判断是轻还是重。取下c1中的a2到a4三球放一边,将c2中的a5和a6放到c1上,然后将常球a9放到c2上。至此,c1上是a1,a5和a6,c2上是a7,a8和a9。此时又分三中情况: 
          1) 如果平衡,说明天平上所有的球都是常球,异球在从c1上取下a2到a4中。而且可以断定异球轻重。因为a5到a8都是常球,而第2次称的时候c1是上升 的,所以a2到a4里必然有一个轻球。那么第三次称就用来从a2到a4中找到轻球。这很简单,随便拿两球放到c1和c2,平衡则剩余的为要找球,不平衡则 哪边低则哪个为要找球; 
          2)c1仍然保持上升,则说明要么a1是要找的轻球, 要么a7和a8两球中有一个是重球(这步懂吧?好好想想,很简单的。因为a9是常球,而取下的a2到a4肯定也是常球,还可以推出换盘放置的a5和a6也 是常球。所以要么a1轻,要么a7或a8重)。至此,还剩一次称的机会。只需把a7和a8放上两盘,平衡则说明a1是要找的偏轻异球,如果不平衡,则哪边 高说明哪个是偏重异球; 
          3)如果换球称第2次后天平平衡打破,并且c1降低了,这说明异球肯定在换过来的a5和a6两求中,并且异球偏重,否则天平要么平衡要么保持c1上升。确定要找球是偏重之后,将a5和a6放到两盘上称第3次根据哪边高可以判定a5和a6哪个是重球; 
      B: 第1次称后c1是下降的,此时可以将c1看成c2,其实以后的步骤都同A,所以就不必要再重复叙述了。至此,不管情况如何,用且只用三次就能称出12个外 观手感一模一样的小球中有质量不同于其他11球的偏常的球。而且在称的过程中可以判定其是偏轻还是偏重。
给一个奇数阶N幻方,填入数字1,2,3...N*N,使得横竖斜方向上的和都相同答案:#include<iostream>#include<iomanip>#include<cmath>usingnamespace std;int main(){int n; cin>>n;int i;int **Matr=newint*[n];//动态分配二维数组for(i=0;i<n;++i)      Matr[ i ]=newint[n];//动态分配二维数组 //j=n/2代表首行中间数作为起点,即1所在位置int j=n/2,num=1;//初始值 i=0;while(num!=n*n+1) {//往右上角延升,若超出则用%转移到左下角      Matr[(i%n+n)%n][(j%n+n)%n]=num;    //斜行的长度和n是相等的,超出则转至下一斜行    if(num%n==0)          i++;   else      {          i--;          j++;     }      num++; }for(i=0;i<n;i++) {      for(j=0;j<n;++j)         cout<<setw((int)log10(n*n)+4)<<Matr[ i][ j ];//格式控制      cout<<endl<<endl;//格式控制 }for(i=0;i<n;++i)      delete [ ]Matr[ i ];return1;}腾讯的一道面试题:(与百度相似,可惜昨天百度死在这方面了)在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可。答案:1, 把整数分成256M段,每段可以用64位整数保存该段数据个数,256M*8 = 2G内存,先清0 
2,读10G整数,把整数映射到256M段中,增加相应段的记数 
3,扫描256M段的记数,找到中位数的段和中位数的段前面所有段的记数,可以把其他段的内存释放 
4,因中位数段的可能整数取值已经比较小(如果是32bit整数,当然如果是64bit整数的话,可以再次分段),对每个整数做一个记数,再读一次10G整数,只读取中位数段对应的整数,并设置记数。 
5,对新的记数扫描一次,即可找到中位数。 
如果是32bit整数,读10G整数2次,扫描256M记数一次,后一次记数因数量很小,可以忽略不记(设是32bit整数,按无符号整数处理 
整数分成256M段? 整数范围是0 - 2^32 - 1 一共有4G种取值,4G/256M = 16,每16个数算一段 0-15是1段,16-31是一段,... 
整数映射到256M段中? 如果整数是0-15,则增加第一段记数,如果整数是16-31,则增加第二段记数,... 

其实可以不用分256M段,可以分的段数少一写,这样在扫描记数段时会快一些,还能节省一些内存)

腾讯题二:一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数答:方法一: 4个字节表示的整数,总共只有2^32约等于4G个可能。 
为了简单起见,可以假设都是无符号整数。 
分配500MB内存,每一bit代表一个整数,刚好可以表示完4个字节的整数,初始值为0。基本思想每读入一个数,就把它对应的bit位置为1,处理完40G个数后,对500M的内存遍历,找出一个bit为0的位,输出对应的整数就是未出现的。 
算法流程: 
1)分配500MB内存buf,初始化为0 
2)unsigned int x=0x1; 
    for each int j in file 
    buf=buf |x < <j; 
    end 
(3) for(unsigned int i=0; i <= 0xffffffff; i++) 
        if (!(buf & x < <i)) 
        { 
            output(i); 
            break; 
        } 
以上只是针对无符号的,有符号的整数可以依此类推。方法二:文件可以分段读啊,这个是O(2n)算法,应该是很快的了,而且空间也允许的。 
不过还可以构造更快的方法的,更快的方法主要是针对定位输出的整数优化算法。 
思路大概是这样的,把值空间等分成若干个值段,比如值为无符号数,则 
00000000H-00000FFFH 
00001000H-00001FFFH 
...... 
0000F000H-0000FFFFH 
..... 
FFFFF000H-FFFFFFFFH 
这样可以订立一个规则,在一个值段范围内的数第一次出现时,对应值段指示值Xn=Xn+1,如果该值段的所有整数都出现过,则Xn=1000H,这样后面输出定位时就可以直接跳过这个值段了,因为题目仅仅要求输出一个,这样可以大大减少后面对标志数值的遍历步骤。 
理论上值段的划分有一定的算法可以快速的实现,比如利用位运算直接定位值段对应值进行计算。腾讯面试题:有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数。(不准用位图!!)位图解决:位图的方法如下 
假设待处理数组为A[10w-2] 
定义一个数组B[10w],这里假设B中每个元素占用1比特,并初始化为全0 
for(i=0;i <10w-2;i++) 

B[ A[i] ]=1 

那么B中不为零的元素即为缺少的数据 
这种方法的效率非常高,是计算机中最常用的算法之一其它方法:    求和以及平方和可以得到结果,不过可能求平方和运算量比较大(用64位int不会溢出)腾讯面试题:腾讯服务器每秒有2w个QQ号同时上线,找出5min内重新登入的qq号并打印出来。解答: 第二题如果空间足够大,可以定义一个大的数组 
a[qq号],初始为零,然后这个qq号登陆了就a[qq号]++ 
最后统计大于等于2的QQ号 
这个用空间来代替时间第二个题目,有不成熟的想法。 
2w x 300s 
所以用 6,000,000 个桶。删除超时的算法后面说,所以平均桶的大小是 1 。 
假设 qq 号码一共有 10^10 个,所以每个桶装的 q 号码是 10^10 / (6 * 10^6) 个,这个是插入时候的最坏效率(插入同一个桶的时候是顺序查找插入位置的)。 
qq的节点结构和上面大家讨论的基本一样,增加一个指针指向输出列表,后面说。 
struct QQstruct { 
   num_type    qqnum; 
   timestamp   last_logon_time; 
   QQstruct    *pre; 
   QQstruct    *next; 
   OutPutList *out;     // 用于 free 节点的时候,顺便更新一下输出列表。 


另外增加两个指针列表。 
第一个大小 300 的循环链表,自带一个指向 QQStruct 的域,循环存 300 秒内的qq指针。时间一过 
就 free 掉, 所以保证所有桶占用的空间在 2w X 300 以内。 
第二个是 输出列表, 就是存放题目需要输出的节点。 
如果登陆的用户,5分钟内完全没有重复的话,每秒 free 掉 2w 个节点。 
不过在 free 的时候,要判断一下时间是不是真的超时,因为把节点入桶的时候,遇到重复的,会更 
新一下最后登陆的时间。当然啦,这个时候,要把这个 qq 号码放到需要输出的列表里面

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
⼏道⼤数据⾯试题 ⼏道⼤数据⾯试题 ⾸先处理⼤数据的⾯试题,有些基本概念要清楚: (1)1Gb = 109bytes(1Gb = 10亿字节):1Gb = 1024Mb,1Mb = 1024Kb,1Kb = 1024bytes; (2)基本流程是,分解⼤问题,解决⼩问题,从局部最优选择全局最优;(当然,如果直接放内存⾥就能解决的话,那就直接想办法解,不需要分解 了。) (3)分解过程常⽤⽅法:hash(x)%m。其x为字符串/url/ip,m为⼩问题的数⽬,⽐如把⼀个⼤⽂件分解为1000份,m=1000; (4)解决问题辅助数据结构:hash_map,Trie树,bit map,⼆叉排序树(AVL,SBT,红⿊树); (5)top K问题:最⼤K个⽤最⼩堆,最⼩K个⽤最⼤堆。(⾄于为什么?⾃⼰在纸上写个⼩栗⼦,试⼀下就知道了。) (6)处理⼤数据常⽤排序:快速排序/堆排序/归并排序/桶排序 下⾯是⼏个例题(每个题的解法都不唯⼀,下⾯只列出了众多解法的⼀种): 1. 给定a、b两个⽂件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b⽂件共同的url? 每个url⼤⼩为64bytes,那么可以估计每个⽂件的⼤⼩为5G×64=320G,远远⼤于内存限制的4G,所以不可能将其完全加载到内存处理,可以采⽤分治的思 想来解决。 Step1:遍历⽂件a,对每个url取hash(url)%1000,然后根据所取得的值将url分别存储到1000个⼩⽂件(记为a0 ,a1 ,...,a999 ,每个⼩⽂件约300M); Step2: 遍历⽂件b,采取和a相同的⽅式将url分别存储到1000个⼩⽂件(记为b0 ,b1 ,...,b999); 巧妙之处:这样处理后,所有可能相同的url都被保存在对应的⼩⽂件(a0 vs b0 , a1 vs b1 ,...,a999 vs b999),不对应的⼩⽂件不可能有相同的url。然后我们 只要出这个1000对⼩⽂件相同的url即可。 Step3:每对⼩⽂件ai和bi相同的url时,可以把ai的url存储到hash_set/hash_map。然后遍历bi的每个url,看其是否在刚才构建的hash_set,如果是, 那么就是共同的url,存到⽂件⾥⾯就可以了。 草图如下(左边分解A,右边分解B,解相同url): 2. 有⼀个1G⼤⼩的⼀个⽂件,⾥⾯每⼀⾏是⼀个词,词的⼤⼩不超过16字节,内存限制⼤⼩是1M,要返回频数最⾼的100个词。 Step1:顺序读⽂件,对于每个词x,取hash(x)%5000,然后按照该值存到5000个⼩⽂件(记为f0 ,f1 ,... ,f4999),这样每个⽂件⼤概是200k左右,如果其 的有的⽂件超过了1M⼤⼩,还可以按照类似的⽅法继续往下分,直到分解得到的⼩⽂件的⼤⼩都不超过1M; Step2:对每个⼩⽂件,统计每个⽂件出现的词以及相应的频率(可以采⽤trie树/hash_map等),并取出出现频率最⼤的100个词(可以⽤含100个结点的 最⼩堆),并把100词及相应的频率存⼊⽂件,这样⼜得到了5000个⽂件; Step3:把这5000个⽂件进⾏归并(类似与归并排序); 草图如下(分割⼤问题,解⼩问题,归并): 3. 现有海量⽇志数据保存在⼀个超级⼤的⽂件,该⽂件⽆法直接读⼊内存,要提取某天出访问百度次数最多的那个IP。 Step1:从这⼀天的⽇志数据把访问百度的IP取出来,逐个写⼊到⼀个⼤⽂件; Step2:注意到IP是32位的,最多有2^32个IP。同样可以采⽤映射的⽅法,⽐如模1000,把整个⼤⽂件映射为1000个⼩⽂件; Step3:找出每个⼩⽂出现频率最⼤的IP(可以采⽤hash_map进⾏频率统计,然后再找出频率最⼤的⼏个)及相应的频率; Step4:在这1000个最⼤的IP找出那个频率最⼤的IP,即为所。 草图如下:
JAVA⼤数据处理题 ⼤数据处理题 1. 给定a、b两个⽂件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b⽂件共同的url? ⽅案1:可以估计每个⽂件安的⼤⼩为50G×64=320G,远远⼤于内存限制的4G。所以不可能将其完全加载到内存处理。考虑采取分⽽治 之的⽅法。 s 遍历⽂件a,对每个url取 ,然后根据所取得的值将url分别存储到1000个⼩⽂件(记为 )。这样每个⼩⽂件的⼤约为300M。 s 遍历⽂件b,采取和a相同的⽅式将url分别存储到1000各⼩⽂件(记为 )。这样处理后,所有可能相同的url都在对应的⼩⽂件( ),不 对应的⼩⽂件不可能有相同的url。然后我们只要出1000对⼩⽂件相同的url即可。 s 每对⼩⽂件相同的url时,可以把其⼀个⼩⽂件的url存储到hash_set。然后遍历另⼀个⼩⽂件的每个url,看其是否在刚才构建的 hash_set,如果是,那么就是共同的url,存到⽂件⾥⾯就可以了。 ⽅案2:如果允许有⼀定的错误率,可以使⽤Bloom filter,4G内存⼤概可以表⽰340亿bit。将其⼀个⽂件的url使⽤Bloom filter映射为这 340亿bit,然后挨个读取另外⼀个⽂件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有⼀定的错误率)。 2. 有10个⽂件,每个⽂件1G,每个⽂件的每⼀⾏存放的都是⽤户的query,每个⽂件的query都可能重复。要你按照query的频度排序。 ⽅案1: s 顺序读取10个⽂件,按照hash(query)%10的结果将query写⼊到另外10个⽂件(记为 )。这样新⽣成的⽂件每个的⼤⼩⼤约也1G(假 设hash函数是随机的)。 s 找⼀台内存在2G左右的机器,依次对 ⽤hash_map(query, query_count)来统计每个query出现的次数。利⽤快速/堆/归并排序按照出现次数 进⾏排序。将排序好的query和对应的query_cout输出到⽂件。这样得到了10个排好序的⽂件(记为 )。 s 对 这10个⽂件进⾏归并排序(内排序与外排序相结合)。 ⽅案2: ⼀般query的总量是有限的,只是重复的次数⽐较多⽽已,可能对于所有的query,⼀次性就可以加⼊到内存了。这样,我们就可以采⽤trie 树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。 ⽅案3: 与⽅案1类似,但在做完hash,分成多个⽂件后,可以交给多个⽂件来处理,采⽤分布式的架构来处理(⽐如MapReduce),最后再进⾏合 并。 3. 有⼀个1G⼤⼩的⼀个⽂件,⾥⾯每⼀⾏是⼀个词,词的⼤⼩不超过16字节,内存限制⼤⼩是1M。返回频数最⾼的100个词。 ⽅案1:顺序读⽂件,对于每个词x,取 ,然后按照该值存到5000个⼩⽂件(记为 ) 。这样每个⽂件⼤概是200k左右。如果其的有的 ⽂件超过了1M⼤⼩,还可以按照类似的⽅法继续往下分,知道分解得到的⼩⽂件的⼤⼩都不超过1M。对 每个⼩⽂件,统计每个⽂件出现 的词以及相应的频率(可以采⽤trie树/hash_map等),并取出出现频率最⼤的100个词(可以⽤含100个结点 的最⼩堆),并把100词及相 应的频率存⼊⽂件,这样⼜得到了5000个⽂件。下⼀步就是把这5000个⽂件进⾏归并(类似与归并排序)的过程了。 4. 海量⽇志数据,提取出某⽇访问百度次数最多的那个IP。 ⽅案1:⾸先是这⼀天,并且是访问百度的⽇志的IP取出来,逐个写⼊到⼀个⼤⽂件。注意到IP是32位的,最多有 个 IP。同样可以采⽤ 映射的⽅法,⽐如模1000,把整个⼤⽂件映射为1000个⼩⽂件,再找出每个⼩⽂出现频率最⼤的IP(可以采⽤hash_map进 ⾏频率统 计,然后再找出频率最⼤的⼏个)及相应的频率。然后再在这1000个最⼤的IP找出那个频率最⼤的IP,即为所。 5. 在2.5亿个整数找出不重复的整数,内存不⾜以容纳这2.5亿个整数。 ⽅案1:采⽤2-Bitmap(每个数分配2bit,00表⽰不存在,01表⽰出现⼀次,10表⽰多次,11⽆意义)进⾏,共需内存 内存,还可以接受。 然后扫描这2.5亿个整数,查看Bitmap相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数 输出即可。 ⽅案2:也可采⽤上题类似的⽅法,进⾏划分⼩⽂件的⽅法。然后在⼩⽂件找出不重复的整数,并排序。然后再进⾏归并,注意去除重复 的元素。 6. 海量数据分布在100台电脑,想个办法⾼校统计出这批数据的TOP10。 ⽅案1: s 在每台电脑上
数据的⼀些⾯试题 ⼤数据的⼀些⾯试题 五、双层桶划分—-其实本质上就是【分⽽治之】的思想,重在"分"的技巧上! 适⽤范围:第k⼤,中位数,不重复或重复的数字 基本原理及要点:因为元素范围很⼤,不能利⽤直接寻址表,所以通过多次划分,逐步确定范围,然后最后在⼀个可以接受的范围内进⾏。 可以通过多次缩⼩,双层只是⼀个例⼦。 扩展: 问题实例: 1).2.5亿个整数找出不重复的整数的个数,内存空间不⾜以容纳这2.5亿个整数。 有点像鸽巢原理,整数个数为2^32,也就是,我们可以将这2^32个数,划分为2^8个区域(⽐如⽤单个⽂件代表⼀个区域),然后将数据分离到 不同的区域,然后不同的区域在利⽤bitmap就可以直接解决了。也就是说只要有⾜够的磁盘空间,就可以很⽅便的解决。 2).5亿个int找它们的中位数。 这个例⼦⽐上⾯那个更明显。⾸先我们 将int划分为2^16个区域,然后读取数据统计落到各个区域⾥的数的个数,之后我们根据统计结果就 可以判断中位数落到那个区域,同时知道这个区域的第 ⼏⼤数刚好是中位数。然后第⼆次扫描我们只统计落在这个区域的那些数就可以 了。 实际上,如果不是int是int64,我们可以经过3次这样的划分即可降低到可以接受 的程度。即可以先将int64分成2^24个区域,然后确定区域 的第⼏⼤数,在将该区域分成2^20个⼦区域,然后确定是⼦区域的第⼏⼤数,然后⼦区域⾥ 的数的个数只有2^20,就可以直接利⽤direct addr table进⾏统计了。 六、数据库索引 适⽤范围:⼤数据量的增删改查 基本原理及要点:利⽤数据的设计实现⽅法,对海量数据的增删改查进⾏处理。 七、倒排索引(Inverted index) 适⽤范围:搜索引擎,关键字查询 基本原理及要点:为何叫倒排索引?⼀种索引⽅法,被⽤来存储在全⽂搜索下某个单词在⼀个⽂档或者⼀组⽂档的存储位置的映射。 以英⽂为例,下⾯是要被索引的⽂本: T0 = "it is what it is" T1 = "what is it" T2 = "it is a banana" 我们就能得到下⾯的反向⽂件索引: "a": {2} "banana": {2} "is": {0, 1, 2} "it": {0, 1, 2} "what": {0, 1} 检索的条件"what","is"和"it"将对应集合的交集。 正向索引开发出来⽤来存储每个⽂档的单词的列表。正向索引的查询往往满⾜每个⽂档有序 频繁的全⽂查询和每个单词在校验⽂档的验证 这样的查询。在正向索引,⽂档占据了⼼的位置,每个⽂档指向了⼀个它所包含的索引项的序列。也就是说⽂档 指向了它包含的那些单 词,⽽反向索引则是单词指向了包含它的⽂档,很容易看到这个反向的关系。 扩展: 问题实例:⽂档检索系统,查询那些⽂件包含了某单词,⽐如常见的学术论⽂的关键字搜索。 ⼋、外排序 适⽤范围:⼤数据的排序,去重 基本原理及要点:外排序的归并⽅法,置换选择败者树原理,最优归并树 扩展: 问题实例: 1).有⼀个1G⼤⼩的⼀个⽂件,⾥⾯每⼀⾏是⼀个词,词的⼤⼩不超过16个字节,内存限制⼤⼩是1M。返回频数最⾼的100个词。 这个数据具有很明显的特点,词的⼤⼩为16个字节,但是内存只有1m做hash有些不够,所以可以⽤来排序。内存可以当输⼊缓冲区使⽤。 九、trie树 适⽤范围:数据量⼤,重复多,但是数据种类⼩可以放⼊内存 基本原理及要点:实现⽅式,节点孩⼦的表⽰⽅式 扩展:压缩实现。 问题实例: 1).有10个⽂件,每个⽂件1G,每个⽂件的每⼀⾏都存放的是⽤户的query,每个⽂件的query都可能重复。要你按照query的频度排序。 2).1000万字符串,其有些是相同的(重复),需要把重复的全部去掉,保留没有重复的字符串。请问怎么设计和实现? 3).寻找热门查询:查询串的重复度⽐较⾼,虽然总数是1千万,但如果除去重复后,不超过3百万个,每个不超过255字节。 ⼗、分布式处理 mapreduce 适⽤范围:数据量⼤,但是数据种类⼩可以放⼊内存 基本原理及要点:将数据交给不同的机器去处理,数据划分,结果归约。 扩展: 问题实例: 1).The canonical example application of MapReduce is a process to count the appearances of each different word in a set of documents: 2).海量数据分布在100台电脑,想个办法⾼效统计出这批数据的TOP10。 3).⼀共有N个机器,每个机器上有N个数。每个机器最多存O(N)个数并对它们操作。如何找到N^2个数的数(median)? 经典问题分析 上千万or亿
技术成就梦想 @ DataGuru 专业数据分析社区 网址:edu.dataguru.cn 1 大数据的统计学基础 近年来, 存储设备的单位成本以惊人的速度下降,我们可以轻而易举地积累起大 量的数据。电信 运营商,可以记录用户通话、短消息、无线上网产生的每一条 信令, 省级运营商一小时写入存储设备的数据量可以达到几百 G。 电子商务网站, 可以记录用户的每一 次交易,甚至每一次点击,可以复原用户的完整访问路径 找出用户的兴趣点。城市监控体系,在各个重要路口,高速公路上的摄像头,每 秒钟都在产生海量的视频数 据。在生命科学领域,对人体的 DNA 分析,一个个 体就能产生几个 G 数据, 可以想象如果一个生物信息数据库里包含了成千万的个 体数据,信息量将会是怎样一个 规模,如此等等,不胜枚举。我们毫无疑问, 正处于一个信息爆炸的时代。 不幸的是, 我们得到的这些数据的绝大部分,在它的生命周期里基本上都被闲 置着, 从来没有考虑过产生任何的价值, 唯一的用途就是"保存备查"。 尽管"啤 酒与尿布"的故事,已经写入教科书有 10 多年了,几乎每一个接受过专业教育 的同仁都知道数据挖掘能产生的价值,但是直到今天,我们对数据的处理依然很 低。造成这种情况的原因有很多。其之一是,在各公司里保管数据的大多是 IT 人员,他们通常都缺乏必要的数学素质和知识基础去进行建模和深入的分析 工作,即使是业务人员也鲜有对数据有深入认识者。我们推出大数据系列(包括 Hadoop,NoSQL,Mahout 等)和数据分析系列(包括 R,SAS 等)课程后,观察 学员(特别是 IT 工作者和业务人员)的学习状况,发现他们的大多数严重缺 乏进一步挖掘数据价值所需的数学素养。 本门课程的目标, 正是要打破这种鸿沟, 为大家巩固基础,为进一步在数据领域前进提供更强动力。统计学,被誉为是数 据金字塔的"基础之基础",统计学知识扎实,无论学习 R,SAS,机器学习, 数据挖掘,大数据分析等领域知识都会得心应手,省去回头补课的麻烦。 课程内容: 第 1 课 面向小白的统计学:描述性统计(均值,中位数,众数,方差,标准差, 与常见的统计图表) 第 2 课 赌博设计:概率的基本概念,古典概型 第 3 课 每人脑袋里有个贝叶斯:条件概率与贝叶斯公式,独立性 第 4 课 啊!微积分:随机变量及其分布(二项分布,均匀分布,正态分布) 第 5 课 万事皆由分布掌握:多维随机变量及其分布 第 5 课 砖家的统计学:随机变量的期望,方差与协方差 第 6 课 上帝之手,统计学的哲学基础:大数定律、心极限定理与抽样分布 第 8 课 点数成金,从抽样推测规律之一:参数估计之点估计 第 9 课 点数成金,从抽样推测规律之二:参数估计之区间估计 第 10 课 对或错?告别拍脑袋决策:基于正态总体的假设检验 第 11 课 扔掉正态分布:秩和检验 第 12 课 预测未来的技术:回归分析 第 13 课 抓住表象背后那只手:方差分析 第 14 课 沿着时间轴前进,预测电子商务业绩:时间序列分析简介 技术成就梦想 @ DataGuru 专业数据分析社区 网址:edu.dataguru.cn 2 第 15 课 PageRank 的背后:随机过程与马尔科夫链简介 授课对象: 这是一门数学课程,适合有志于转往大数据分析领域的非数学专业人士(例如 IT 人,业务人员等)补强数学基础,以更好地学习更高级的数据分析,数据挖 掘,机器学习课程 授课讲师: 黄志洪(tigerfish),ITPUB 创始人,炼数成金创始人。山大学海量数据与 云计算 研究心主任。数据库专家,数据分析专家,有丰富的 IT 领域、数学领 域的知识经验。曾经讲授炼数成金上《数据分析、展现与 R 语言》、《数据分析 与 SAS》、《Hadoop 数据分析平台》等多门受欢迎课程。他将带领他的数据分 析团队完成整个授课工作。 何翠仪,山大学统计学专业毕业,炼数成金专职讲师,在过去曾负责多门炼数 成金数据分析课程的助教工作,目前正在主持建设炼数成金的认证题库系统。
数据时代,几个例子告诉你什么是大数据数据时代-几个例子告诉你什么叫大数据全文共2页,当前为第1页。工具类厂商蓄意炒作大数据,以达到售卖产品的目的,但导致的结果是很多人对大数据这一概念云里雾里。实际上,大数据就发生在你我身边,虽然你看不到它,但它却时时影响着我们的生活。   现阶段,和大数据相关的企业有三种。一种是工具类公司,他们宣传得最卖力,并且把大数据吹出了泡沫,原因是它们希望把自己的产品卖给企业;一种是依托于大数据从事咨询服务类的企业;还有一种就是实实在拥有大数据的公司,它们和我们休戚相关,也就是下面的小故事所要阐述的内容。   第一个故事,百货公司知道女孩怀孕   美国的Target百货公司上线了一套客户分析工具,可以对顾客的购买记录进行分析,并向顾客进行产品推荐。一次,他们根据一个女孩在Target连锁店的购物记录,推断出这一女孩怀孕,然后开始通过购物手册的形式向女孩推荐一系列孕妇产品。这一作法让女孩的家长勃然大怒,事实真相是女孩隐瞒了怀孕消息。   点评:看似杂乱无章的购买清单,经过对比发现其的规律和不符合常规的数据,往往能够得出一些真实的结论。这就是大数据的应用。   第二个故事,搜狗热词里的商机   王建锋是某综合类网站的编辑,基于访问量的考核是这个编辑每天都要面对的事情。但在每年的评比,他都号称是PV王。原来他的秘密就是只做热点新闻。王建锋养成了看百度搜索风云榜和搜狗热搜榜的习惯,所以,他会优先挑选热情榜上的新闻事件来编辑整理,关注的人自然多。   点评:搜狗拥有输入法,搜索引擎,那些在输入法和搜索引擎上反复出现的热词,就是搜狗热搜榜的来源。通过对海量词汇的对比,找出哪些是网民关注的。这就是大数据的应用。   第三个故事,阿里云知道谁需要贷款   这是阿里人讲述的一个故事。每天,海量的交易和数据在阿里的平台上跑着,阿里通过对商户最近100天的数据分析,就能知道哪些商户可能存在资金问题,此时的阿里贷款平台就有可能出马,同潜在的贷款对象进行沟通。   点评:通常来说,数据比文字更真实,更能反映一个公司的正常运营情况。通过海量的分析得出企业的经营情况,这就是大数据的应用。   第四个故事,移动挽留流失客户   iPhone进入国后,铁杆的移动用户王永铭加入了联通合约机大军。由于合约机承担了大量通话内容,王永铭将全球通换成了动感地带。三个月之后,王永铭接到了国移动的10086电话,向他介绍移动的优惠资费活动。一位移动的工作人员称,运营商会保管用户数据,如果话费锐减,基本上就是流失先兆。   点评:给数亿用户建立一个数据库,通过跟踪用户的话费消耗情况,运营商就能知道哪些用户在流失。这就是大数据的应用。   第五个故事:工薪阶层如何省小钱   上汽通用五菱股份有限公司的肖伟,是个不折不扣的网购专家。区别于菜市场的费力砍价,肖伟的作法简单多了,登陆各种比价网站,然后选择最便宜的正规店下单。   点评:比价网站通过海量的产品信息抓取,比如抓京东、天猫、易购的数据,然后将价格由低到高进行排列,这也是大数据的应用。   第六个故事:公关公司的舆情监督   这是一个离职公关人的故事。她参与和间接参与了很多危机公关事件,比如雷士照明的创始人股东之争,比如罗永浩砸西门子冰箱事件。她说,她每天的事情都是上网搜索事件的热度,然后决定下一步的动作。   点评:实际上你的每一下搜索,都是基于海量数据进行的,这实际上也是大数据的一种应用。   第七个故事:商用社交开始决定百事可乐的营销计划   这年头,广告主越来越精,他们希望花的每一分钱都有所回报。面对五花八门的营销活动,到底哪一种才是最合适的呢?百事可乐的作法很简单,它们购买了社交信息优化推广公司SocialFlow的服务,对数据进行分析,从而知道何种营销活动的传播效果更好   点评:广告主越来越喜欢为类似Social Flow的服务付费,基于海量数据分析然后得出结论的企业营销行为,也是大数据应用。   第8个故事:每天,我们借助大数据完成微信上的互动   田宇是一个85后小姑娘,每天她用微信来记录心情,并且和网友分享图片,此外还有各种语音聊天。全国有数亿像田宇一样的人在使用微信,每天都有大数据在微信这个平台上跑着。   点评:可能你不知道,但你每天都在使用和大数据相关的工具。   第九个故事:大数据解救了每一个"地理白痴"   李小茗是个"地理白痴",所以他下载了一个高德地图。没有安装导航的原因,是因为这一产品付费,且占据了超过3G的内存。只要花一点流量,李小茗就能在地图上查看自己所处的位置,以及周围的建筑。   点评:虽然李小茗不知道什么是大数据,但每个在他地图屏幕上跳出来的坐标,实际上都是由大大数据时代-几个例子告诉你什么叫大数据全文共2页,当前为第2页。数据堆成的。
数据面试题(2) 大数据面试题(2)全文共26页,当前为第1页。大数据面试题(2)全文共26页,当前为第1页。1、给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存处理。考虑采取分而治之的方法。 s 遍历文件a,对每个url取,然后根据所取得的值将url分别存储到1000个小文件(记为)。这样每个小文件的大约为300M。 s 遍历文件b,采取和a相同的方式将url分别存储到1000个小文件(记为)。这样处理后,所有可能相同的url都在对应的小文件(),不对应的小文件不可能有相同的url。然后我们只要出1000对小文件相同的url即可。 s 每对小文件相同的url时,可以把其一个小文件的url存储到hash_set。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set,如果是,那么就是共同的url,存到文件里面就可以了。 方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其一个文件的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。 2、有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要你按照query的频度排序。 方案1: s、顺序读取10个文件,按照hash(query)的结果将query写入到另外10个文件(记为)。这样新生成的文件每个的大小大约也1G(假设hash函数是随机的)。 s、找一台内存在2G左右的机器,依次对用hash_map(query, query_count)大数据面试题(2)全文共26页,当前为第2页。大数据面试题(2)全文共26页,当前为第2页。来统计每个query出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的query和对应的query_cout输出到文件。这样得到了10个排好序的文件(记为)。 s、对这10个文件进行归并排序(内排序与外排序相结合)。 方案2: 一般query的总量是有限的,只是重复的次数比较多而已,可能对于所有的query,一次性就可以加入到内存了。这样,我们就可以采用trie树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。 方案3: 与方案1类似,但在做完hash,分成多个文件后,可以交给多个文件来处理,采用分布式的架构来处理(比如MapReduce),最后再进行合并。 3、有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。 方案1:顺序读文件,对于每个词x,取,然后按照该值存到5000个小文件(记为)。这样每个文件大概是200k左右。如果其的有的文件超过了1M大小,还可以按照类似的方法继续往下分,知道分解得到的小文件的大小都不超过1M。对每个小文件,统计每个文件出现的词以及相应的频率(可以采用trie树/hash_map等),并取出出现频率最大的100个词(可以用含100个结点的最小堆),并把100词及相应的频率存入文件,这样又得到了5000个文件。下一步就是把这5000个文件进行归并(类似与归并排序)的过程了。 4、海量日志数据,提取出某日访问百度次数最多的那个IP。 方案1:首先是这一天,并且是访问百度的日志的IP取出来,逐个写入到一个大文件。大数据面试题(2)全文共26页,当前为第3页。大数据面试题(2)全文共26页,当前为第3页。注意到IP是32位的,最多有个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP找出那个频率最大的IP,即为所。 5、在2.5亿个整数找出不重复的整数,内存不足以容纳这2.5亿个整数。 方案1:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。 方案2:也可采用上题类似的方法,进行划分小文件的方法。然后
数据处理的基本流程:数据抽取与集成+数据分析+数据解释 ⼤数据时代的到来改变了⼈们的⽣活⽅式、思维模式和研究范式,我们可以总结出 10 个重⼤变化,如图 1 所⽰。 图 1 ⼤数据时代的 10 个重⼤变化 对研究范式的新认识:从第三范式到第四范式 对研究范式的新认识:从第三范式到第四范式 2007 年 1 ⽉,图灵奖得主、关系型数据库⿐祖 JimGray 发表演讲,他凭着⾃⼰对于⼈类科学发展特征的深刻洞察,敏锐地指出科学的发 展正在进⼊"数据密集型科学发现范式"——科学史上的"第四范式"。 在他看来,⼈类科学研究活动已经历过三种不同范式的演变过程。 "第⼀范式"是指原始社会的"实验科学范式"。18 世纪以前的科学进步均属于此列,其核⼼特征是对有限的客观对象进⾏观察、总结、 提炼,⽤归纳法找出的科学规律,如伽利略提出的物理学定律。 "第⼆范式"是指 19 世纪以来的理论科学阶段,以模型和归纳为特征的"理论科学范式"。其核⼼特征是以演绎法为主,凭借科学家的智 慧构建理论⼤厦,如爱因斯坦提出的相对论、麦克斯⽅程组、量⼦理论和概率论等。 "第三范式"是指 20 世纪期以来的计算科学阶段的"计算科学范式"。⾯对⼤量过于复杂的现象,归纳法和演绎法都难以满⾜科学研究 的需,⼈类开始借助计算机的⾼级运算能⼒对复杂现象进⾏建模和预测,如天⽓、地震、核试验、原⼦的运动等。 然⽽,随着近年来⼈类采集数据量的爆炸性增长,传统的计算科学范式已经越来越⽆⼒驾驭海量的科研数据了。例如,欧洲的⼤型粒⼦对撞 机、天⽂领域的 Pan-STARRS 望远镜每天产⽣的数据多达⼏千万亿字节(PB)。很明显,这些数据已经突破了"第三范式"的处理极 限,⽆法被科学家有效利⽤。 正因为如此,⽬前正在从"计算科学范式"转向"数据密集型科学发现范式"。 "第四范式"的主要特点是科学研究⼈员只需要从⼤数据查找和挖掘所需要的信息和知识,⽆须直接⾯对所研究的物理对象。例如,在⼤ 数据时代,天⽂学家的研究⽅式发⽣了新的变化,其主要研究任务变为从海量数据发现所需的物体或现象的照⽚,⽽不再需要亲⾃进⾏ 太空拍照。 对数据重要性的新认识:从数据资源到数据资产 对数据重要性的新认识:从数据资源到数据资产 在⼤数据时代,数据不仅是⼀种"资源",更是⼀种重要的"资产"。因此,数据科学应把数据当作⼀种"资产"来管理,⽽不能仅仅当 作"资源"来对待。也就是说,与其他类型的资产相似,数据也具有财务价值,且需要作为独⽴实体进⾏组织与管理。 ⼤数据时代的到来,让"数据即资产"成为最核⼼的产业趋势。在这个"数据为王"的时代,回⾸信息产业发展的起起伏伏,我们发现产业 兴衰的决定性因素,已不是⼟地、⼈⼒、技术、资本这些传统意义上的⽣产要素,⽽是曾经被⼀度忽视的"数据资产"。 世界经济论坛报告曾经预测称,"未来的⼤数据将成为新的财富⾼地,其价值可能会堪⽐⽯油",⽽⼤数据之⽗维克托也乐观地表⽰,"数 据列⼊企业资产负债表只是时间问题"。 "数据成为资产"是互联⽹泛在化的⼀种资本体现,它让互联⽹不仅具有应⽤和服务本⾝的价值,⽽且具有了内在的"⾦融"价值。数据不 再只是体现于"使⽤价值"⽅⾯的产品,⽽成为实实在在的"价值"。 ⽬前,作为数据资产先⾏者的 IT 企业,如苹果、⾕歌、IBM、阿⾥、腾讯、百度等,⽆不想尽各种⽅式,挖掘多种形态的设备及软件功 能,收集各种类型的数据,发挥⼤数据的商业价值,将传统意义上的 IT 企业,打造成为"终端+应⽤+平台+数据"四位⼀体的泛互联⽹化 企业,以期在⼤数据时代获取更⼤的收益。 ⼤数据资产的价值的衡量尺度主要有以下 3 个⽅⾯的标准。 1)独⽴拥有及控制数据资产 ⽬前,数据的所有权问题在业界还⽐较模糊。从拥有和控制的⾓度来看,数据可以分为 型数据、 型数据和 型数据。 型数据主要是指数据的⽣产者⾃⼰⽣产出来的各种数据,例如,百度对使⽤其搜索引擎的⽤户的各种⾏为进⾏收集、整理和分析,这类 数据虽然由⽤户产⽣,但产权却属于⽣产者,并最⼤限度地发挥其商业价值。 型数据⼜称为⼊⼝数据,例如,各种电⼦商务营销公司通过将⾃⾝的⼯具或插件植⼊电商平台,来为其提供统计分析服务,并从获取 各类经营数据。虽然这些数据的所有权并不属于这些公司,在使⽤时也有⼀些规则限制,但是它们却有着对数据实际的控制权。 相⽐于前两类数据, 型数据的产权情况⽐较复杂,它们主要依靠⽹络爬⾍,如果你对⼤数据开发感兴趣,想系统学习⼤数据的话,可以 加⼊⼤数据技术学习交流扣群:458数字345数字782获取学习资源,甚⾄是⿊客⼿段获取数据。与 型和 型数据不同的是,这些公 司流出的内部数据放在⽹上供⼈付费下载。这种数据在当前阶段,还不能和资产完全画等号。 2)计量规则与货币资本类似 ⼤数据要实现真正的资产化,⽤

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值