面试题之大数问题

1.亿级数据N,整数,进行排序,有内存限制xMB
分文件+归并
(1)确定需要分的文件数m,N/m*4B<=xMB
(2)对小文件中数据排序
(3)多路归并
将每个文件最开始的数读入(由于有序,为该文件最小数),存放在m个大小的data数组中;
选择data数组中最小的数min_data,及其对应的文件索引index;
将min_data写入results文件中,更新data数组(根据index读取该文件的下一个数);
全部数据读取完成后结束。

2.找出100亿个URL中重复的URL,每个URL占64B
哈希分文件
(1)用哈希函数将100亿大文件拆分成m个小文件(哈希函数保证相同的URL会分布到同一个文件中),N/m*64B<=xMB;
(2)在每个小文件中利用哈希表遍历,找出重复的URL。

3.百亿级数据搜索词汇topK问题
哈希分流+堆排+外排
(1)将百亿级数据用哈希函数分到多台机器或多个文件中;
(2)处理每个小文件时,用哈希表遍历统计词及词频。哈希记录建立完成后,遍历哈希记录,用大小为K的小根堆进行排序;
(3)将各个小文件里的top K进行外排序,最终求出整个百亿数据量的top K。
4. 只用2GB内存在20亿个整数中找到出现次数最多的数
哈希分流+哈希表统计
分析:用哈希表记录整数及频数,每条记录(key,value)占8B,假设每个数只出现一次,需要内存20亿8B=16GB。
(1)把20亿大文件用哈希函数分成m个小文件,N/m
8B<=2GB;
(2)对每个小文件用哈希表统计每个数出现的次数,得到每个文件中出现次数最多的数;
(3)选取m个中的第一名。

5.32位无符号整数范围内,找40亿个非负整数中找到没出现的数使用最多1GB的内存限制
bit map
(1)申请一个2^32大小的bitArr数组,每个bitArr上的位置只能表示0或1。8个bits为1B,所以总共占用内存500MB;
(2)遍历这40亿个无符号数,将对应的bitArr位置置1;
(3)依次遍历bitArr,哪个位置上的bitArr没被置1,哪个数就不在40亿个数中,遍历完成,所有不在范围内的数都被找出来了。

参考:《程序员代码面试指南it名企算法与数据结构题目最优解》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值