假设我们有一个字符串列表,我们无法将整个列表加载到内存中,但我们可以从文件中加载部分列表。解决这个问题的最佳方法是什么?
答案 0 :(得分:11)
一种方法是使用external sort对文件进行排序,然后在排序列表上通过单次迭代删除重复项。这种方法需要额外的空间和O(nlogn)
对磁盘的访问。
另一种方法基于散列:使用字符串的哈希码,并加载包含哈希码在特定范围内的所有字符串的子列表。保证如果加载x
并且它有重复 - 那么欺骗也将被加载到同一个桶中。
这需要O(n*#buckets)
访问磁盘,但可能需要更多内存。如果需要,您可以递归调用该过程(使用不同的散列函数)。
答案 1 :(得分:0)
我的解决方案是进行合并排序,允许外部内存使用。排序后,搜索重复项就像只比较两个元素一样简单。
示例:
0:猫 1:狗 2:鸟 3:猫 4:大象 5:猫
合并排序
0:小鸟 1:猫 2:猫 3:猫 4:狗 5:大象然后简单地比较0& 1 - >没有重复,所以继续前进。 1& 2 - >复制,删除1(这可能就像填充空字符串一样简单,以便稍后跳过) 比较2& 3 - >删除2 等
删除1& 2而不是2& 3是它允许更有效的比较 - 你不必担心跳过已删除的索引。