又见一算法题
腾讯算法 题:服务器内存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).
不知道是否还有更简单的方法。