比方说,我在一个文件中存储了100亿个数字。我如何找到之前已经出现过一次的数字?
我不能在数组中一次填充数十亿个数字,然后保持一个简单的嵌套循环来检查这个数字以前是否出现过。
你将如何处理这个问题?
提前感谢:)
发布于 2010-08-03 00:53:50
重要的问题是,你是否想要高效地解决这个问题,或者你是否想要。
如果你真的有100亿个数字,并且只有一个重复,那么你就处于“大海捞针”类型的情况下。直观地说,如果没有非常肮脏和不稳定的解决方案,如果不存储大量的数字,就没有希望解决这个问题。
相反,转向概率解决方案,它已经在这个问题的几乎所有实际应用中使用(在网络分析中,您试图做的是寻找鼠标,即在大型数据集中很少出现的元素)。
一种可能的解决方案,可以找到准确的结果:使用足够高分辨率的Bloom filter。要么使用过滤器来确定元素是否已经被看到,或者,如果你想要完美的准确性,可以使用(正如kbrimington建议的那样使用标准哈希表)过滤器来过滤掉你不可能看到的元素,然后在第二次遍历时,确定你实际看到的元素两次。
如果你的问题稍有不同-例如,你知道你至少有0.001%的元素重复了两次,你想要找出大约有多少,或者你想从这些元素中随机抽样-那么在Flajolet & Martin,Alon等人的脉络中,存在着一大堆概率流算法,它们非常有趣(更不用说效率很高了)。
https://stackoverflow.com/questions/3388600
复制相似问题