清凉世界

喜欢喜欢我的...

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

又见一算法题

腾讯算法 题:服务器内存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  阅读(1368)  评论(0编辑  收藏  举报