如何在1T(即10 ^ 12)个数字中找到最常用的数字(int类型)?
我的前提是:
编辑于:2013.04.22 17:08 谢谢你的评论: 加: - 外部存储不受限制。
答案 0 :(得分:3)
首先请注意,问题至少与element distinctness problem一样难。
因此,解决方案应遵循相同的方法:
另一种更具可扩展性的方法可能是使用map-reduce,使用简单的map-reduce步骤来计算每个数字的出现次数,然后找到最大值:
map(number):
emit(number,'1')
reduce(number,list):
emit (number, size(list))
剩下的就是找到具有最高值的数字 - 这可以在线性扫描中完成。
答案 1 :(得分:1)
使用文件系统存储数字计数器是什么意思?
例如,如果您的数字是uint32,则可以创建65536个目录,每个目录中包含65536个文件。 目录名称将是一个数字的两个高字节,文件名 - 低两个字节。当你遇到数字X,你将它分成两部分并获取文件名,打开该文件并在其中增加计数器(或写入1,如果文件不存在)。
填写该文件结构后,您可以递归扫描具有最大值的树查找文件。
这将非常缓慢,但几乎不会吃任何RAM。
答案 2 :(得分:0)
使用哈希表,键是数字,值是计数。 O(n)将所有数字插入哈希表O(唯一数字)以找到最常见的数字。
答案 3 :(得分:0)