腾讯算法 题:服务器内存1G,有一个2G的文件,里面每行存着一个QQ号(5-10位数),怎么最快找出出现过最多次的QQ号。...

又见一算法题

腾讯算法 题:服务器内存1G,有一个2G的文件,里面每行存着一个QQ号(5-10位数),怎么最快找出出现过最多次的QQ号。 

看了网上的解答 千奇百怪。 我也有点自己想法不知道对不对,仅供参考:

1G = 1 * 2^10*2^10*2^10 Byte

2G = 1G * 2...

重点来了。

最坏的情况全是5位数QQ,加上一个分隔符就是6位,最多有 2^31/(5 + 1) = 2^29/1.5 个QQ号,  假设有qq数量多,超过了一半以上,就不用算了 肯定是它了。 所有

2^31/(5+1)/2 = 2^30/6 = 2^28/1.5 个重复。

也就是说用bit28[] 存放某个QQ出现的次数就可以满足了。

然后我们看1G的空间能有多少个bit28 = 2^30 * 8 /28 = 2^29/1.75

2^29/1.75 > 2^29/1.5

没有bit型数组,我们可以通过位移实现。

比如int32[]   int[0] 的低28位代表 bit28[0], int[0]的高4位 + int[1]的低23位代表bit28[1]以此类推。 

或者使用byte[] 1 byte=8bit. 

这样就是鸽巢排序 + 一趟冒泡了 时间复杂度O(N).

 

不知道是否还有更简单的方法。

 

posted on 2014-08-07 13:27 清凉tea 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/qingliangtea/p/3896936.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值