机器学习面试—海量数据处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZK_J1994/article/details/81386706

海量数据处理的常用方法

  • 分治法(通常是hash映射,如可以使用Python中的hash()函数,数据量大到无法加载,通常可以像简单的哈希算法那样,求余数映射;可能出现数据不平衡,hash后切分的文件仍然较大,这是可换一种hash算法,继续切分)

 

  • 哈希统计(粗暴高效,但是需要将数据全部载入到内存)

 

  • BitMap(可进行数据的快速查找,判重,删除)

 

  • 堆(处理TopN问题,N不能太大)

  • 桶排序(排序,找第K大的数)

  • 双层桶划分(找第K大的数,中位数,重复或不重复的数字)

海量数据处理:分治/哈希映射 + wordCount/hashMap/hashSet + topN/堆

  • 现有海量日志数据,要提取出某日访问百度次数最多的那个IP,但内存空间有限,不能全部加载(对常用的IPV4来说,一个IP就是32位二进制表示;第一步:划分数据,对IP进行哈希映射,如IP%1024,则将所有IP划分到1024个文件中,且相同IP必定会划分到同一个文件;第二步:使用哈希表统计每个小文件中每个IP出现的次数;保留每个小文件出现次数最多的;第三步:Top1问题,这里不用排序,直接遍历1024个结果)

 

  • 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词(这个题与上面是一致的,不同的是需要对字符串哈希,即将一个字符串映射为一个整数,该整数表示唯一的字符串;其次第三步:Top100问题,可以使用大顶堆)

 

  •  给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url(全部加载所需要的内存50*10^8*64*10^-9*2 = 640G;第一步:hash映射划分数据, 对所有url;将a,b文件分别划分成1000个小文件;第二步:加载两个a,b小文件,使用两个hashSet进行存储url,统计hashSet中共同的url;第三步:把小的结果统计到一起)

  • 现在 有10亿个int型的数字,以及一台可用内存为1GB的机器,如何找出这10亿个数字的中位数(第一步:如果直接排序,计算所需要的内存4*10*10^8*10^-9 = 4GB,因此无法直接将数据读到内存,基本思路就是对数据按照大小进行分块,在每一个块里面排序,这里是找中位数有更好的办法;第二步:int数字都是32位二进制,首先按照最高位是0或1进行二分,比如数据块0里面有6亿个数字,数据块1里面有4亿个数字,则中位数应该在6亿数据块里面;第三步:在6亿数据块内再次二分...)

海量数据处理:分布式数据

  • 海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10(每台电脑上求top10,归并)

  • 100w个数中找出最大的100个数(逐步淘汰:拼多多2018校招,求数组中三个数相乘的最大乘积,O(n * k);堆:O(n * logk))

bitMap缓解内存压力

  • 给40亿个不重复的unsigned int的整数数组num,没排过序的,然后再给一个数,如何快速判断这个数a是否在那40亿个数当中(建设这些数字中最大的数为N,则建立一个长度为N+1的1-bitmap,遍历40亿个整数,BitSet.set(num[i], true), 最后判断BitMap.get(a)为true还是false)

桶排序

  • 一年的全国高考考生人数为500 万,分数使用标准分,最低100 ,最高900 ,没有小数,要求对这500 万元素的数组进行排序,并找出第100大的分数(801个桶,把分数丢进桶里面,桶排序的原则就是基数要较小

参考文献

海量数据处理的10个例题与10个方法

猜你喜欢

转载自blog.csdn.net/ZK_J1994/article/details/81386706