我们得到了一些大小约为50GB的数据文件,其中包含16字节代码,我想找到任何发生1/2%或更多次的代码。有没有办法在对数据进行单个遍历时做到这一点?
编辑:有大量的代码-每个代码都可能不同。
结语:我选择了Darius Bacon作为最佳答案,因为我认为最好的算法是他链接的majority element的修改版。主要算法应该可以修改为仅使用极少量的内存-例如201个代码以获取1/2%。基本上,您只需要遍历数据并计数至201个不同的代码。一旦您找到201个不同的代码,您就会删除每个代码中的一个(从计数器中减去1,忘记任何变为0的计数器)。最后,您最多会删除N / 201次,因此任何出现次数超过该值的代码必须仍然存在。
但这是一个两遍算法,而不是一个。您需要第二次遍历来统计候选人的计数。实际上很容易看出,解决此问题的任何解决方案都必须至少使用2遍(您加载的第一批元素都可能不同,其中一个代码可能最终正好为1/2%)。
感谢您的帮助!
编辑:有大量的代码-每个代码都可能不同。
结语:我选择了Darius Bacon作为最佳答案,因为我认为最好的算法是他链接的majority element的修改版。主要算法应该可以修改为仅使用极少量的内存-例如201个代码以获取1/2%。基本上,您只需要遍历数据并计数至201个不同的代码。一旦您找到201个不同的代码,您就会删除每个代码中的一个(从计数器中减去1,忘记任何变为0的计数器)。最后,您最多会删除N / 201次,因此任何出现次数超过该值的代码必须仍然存在。
但这是一个两遍算法,而不是一个。您需要第二次遍历来统计候选人的计数。实际上很容易看出,解决此问题的任何解决方案都必须至少使用2遍(您加载的第一批元素都可能不同,其中一个代码可能最终正好为1/2%)。
感谢您的帮助!