最近老师给了五道大数据的题,题不是很难,但是第一次做,想着记录一下,增强记忆,同时方便之后的复习。
① 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。
这一题是要给出方案并分析一下时间复杂度,单词(字符串)的查重用Trie树相对较快一点,加入一个count来做计数,Trie统计的话时间复杂度是O(n*le)(le表示单词的平均长度)。再使用堆来排序,维护一个10的小顶堆(每一个新的数和堆顶比较,比堆顶小,不作处理;比堆顶大,则替换堆顶,然后其余9个数依次下沉到适当的位置,最后一个数移除堆)时间复杂度度是O(n*log10),O(n*le)+ O(n*log10),那么总的就是它俩中大的那个。
② 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中。
40亿个无符号整型数,直接放入内存显然是不现实的,unsigned int一共有2^32次方个大概43亿,申请2^32b(512M)的内存,读入40亿个数,设置相应的bit位为1,读入要查询的数,看是否为1。
用二分思想,将所有数二进制表示,然后每一位依次对比分类,0,1个放入一个小文件,比如先比较最高位,0和1各放一个文件夹,对比被查询数的最高位进入该文件,再用次高位0,1分两个文件,在对比次高位进入对应文件,依次进行。
③ 在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。
采用2-bitmap法,(每个数分2bit,00表示不存在,01表示有一个,10表示有重复,11表示无意义),申请2^32*2bit内存,1GB,然后扫码这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,如果是01变10,如果是10不变,全部扫完后,查看bitmap,把对应10的全部整数输出即可。
④ 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url。
50亿个url,每个64B 则 5000,000,000 * 64B ≈ 5GB * 64 = 320G 直接放入4g内存显然是不可能的,采用分而治之的方法,通读a文件,对每一个url求hash(url)%1000,然后会得到从0-999的1000种分类,放入1000个小文件中(a0-a999),然后每个文件大概300M。对b文件做同样的处理得到(b0-b999)文件 ,这样相同的URL一定在对应的小文件中,然后对应的处理 a0,b0;一直到a999,b999文件查找相同的url,可以把a或者b的小文件中的url存在hash_set中,然后遍历对应的(ai对bi)另一个小文件中的每一个url,检查是否在hash_set集合中,相同的存在单独文件中即可。
⑤ 海量日志数据,提取出某日访问百度次数最多的那个IP。
将这一天中访问百度的ip全部取出来,逐个写入一个大文件中,ip是32位的,ip所有的可能就是2^32个,采用hash取模的方式,将大文件分成数个小文件(分多少个就取多少的模)如1000个就hash(ip)%1000,然后再使用hash_map进行频率统计,找出来每一个小文件中的频率最高的那个IP,最后再比较所有小文件中找到的文件,找到频率最大的就是。