从数据集中删除不适合内存的重复项?

时间:2016-05-02 06:45:27

标签: algorithm performance sorting

假设有一个字符串数据集不能全部放入内存中,我们希望删除所有重复项。

我不是在寻找代码,但希望有人能指引我完成这个。

如果我可以将整个数据集放入内存中,我会对集合进行排序,然后迭代并删除元素(如果当前元素与前一个元素相同)。

在这个实际案例中,我在考虑将数据集的每个可行的“块”加载到内存中,对其进行排序,删除欺骗,然后在每个块上迭代地执行此操作。这看起来效率很低,只有在我可以将整个数据集放入内存以删除上一次迭代中的剩余重复项时,它才有效。

建议?

编辑:我之前针对一个小问题处理这个问题的方法是在内存中维护一个哈希表,遍历可以容纳到内存中的每个数据集块,如果不是则将字符串添加到哈希表中存在,否则跳过它。我们可以做得更好吗?

3 个答案:

答案 0 :(得分:2)

我正在寻找的是外部排序。

https://en.wikipedia.org/wiki/External_sorting

另外,我的问题与此重复: Efficient Out-Of-Core Sorting

答案 1 :(得分:0)

如果列表中出现多次的字符串数量不是太大,可以试试这个:

<强>假设:
我假设列表中不同字符串的数量太小,以至于这些字符串可以适应内存。

<强>解决方案:
您可以迭代文件,只需在Set中保留一组已读取的字符串,并跳过Set中已有的所有读取字符串(因为它们是重复的)。

答案 2 :(得分:0)

我认为您可能更需要寻找的是Bundle Sorting(这也是一种外部排序算法)。非常适合重复删除。一个有效的算法可以在这里找到:Efficient Bundle Sorting。只是将其放在这里,供那些正在寻找特定算法的人使用。