对于SQL / Db解决方案给出+1,简单易懂 - 将使您能够专注于手头的真正任务。
但仅供学术用途,我想要添加我的2美分。
对于哈希表给出-1(我还不能投票)。因为它们使用桶来实现,存储成本在许多实际实现中可能会很大。此外,我同意Eric J的观点,碰撞的机会将削弱时间效率的优势。
Lee,构建trie或DAWG也需要占用空间以及额外的时间(初始化延迟)。如果这不是问题(当您将来可能需要对字符串集执行搜索等操作,并且可用内存充足时),则尝试trie可能是一个不错的选择。
由于数据集巨大,Radix sort或类似实现的空间将是问题(如KirarinSnow所提到的)。
以下是我为一次重复计数限制了可以使用多少空间的解决方案。
如果我们的内存有足够的空间来容纳10亿个元素,我们可以使用
堆排序在Θ(n log n)时间内进行原地排序,然后只需在O(n)时间内遍历集合一次并执行以下操作:
if (a[i] == a[i+1])
dupCount++;
如果我们没有足够的内存可用,我们可以将磁盘上的输入文件分成较小的文件(直到大小足够小以容纳在内存中的集合);然后使用上述技术对每个这样的小文件进行排序;然后将它们合并在一起。这需要对主输入文件进行多次处理。
我想避免使用快速排序,因为数据集非常庞大。如果我能为第二种情况挤出一些内存,我会更愿意用它来减少通行证数量,而不是浪费在归并排序/快速排序中(实际上,这严重取决于我们手头的输入类型)。
编辑:仅当您需要长时间存储此数据时,SQl/DB解决方案才是好的。