Algorithm 从赢得';我记不起来了?

Algorithm 从赢得';我记不起来了?,algorithm,performance,sorting,Algorithm,Performance,Sorting,假设有一组字符串不能全部放入内存,我们希望删除所有重复的字符串 我不是在寻找代码,但希望有人能带我通过这个 如果我可以将整个数据集放入内存,我会对数据集进行排序,然后遍历并删除元素(如果当前元素与前一个元素相同) 在这个实际案例中,我考虑将数据集的每个可用“块”加载到内存中,对其进行排序,删除重复项,然后对每个块进行迭代。这似乎效率很低,只有当我能够将整个数据集放入内存中,以便在上一次迭代中删除剩余的重复数据时,它才会起作用 建议 编辑:我之前处理这个小问题的方法是在内存中维护一个哈希表,遍历可

假设有一组字符串不能全部放入内存,我们希望删除所有重复的字符串

我不是在寻找代码,但希望有人能带我通过这个

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

在这个实际案例中,我考虑将数据集的每个可用“块”加载到内存中,对其进行排序,删除重复项,然后对每个块进行迭代。这似乎效率很低,只有当我能够将整个数据集放入内存中,以便在上一次迭代中删除剩余的重复数据时,它才会起作用

建议


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

我想要的是外部排序

此外,我的问题与此重复:

我要找的是外部排序

此外,我的问题与此重复:

如果列表中出现多次的字符串数量不太多,可以尝试以下方法:

假设:
我假设列表中不同字符串的数量非常小,以至于这些字符串可以放入内存中

解决方案:

您可以迭代文件,只需将一组所有已读字符串保留在一个集合中,并跳过该集合中已读的所有字符串(因为它们是重复的)。

如果列表中出现多次的字符串数量不太多,可以尝试以下方法:

假设:
我假设列表中不同字符串的数量非常小,以至于这些字符串可以放入内存中

解决方案:


您可以迭代文件,只需在一个集合中保留一组所有已读字符串,并跳过集合中所有已读字符串(因为它们是重复的)。

我认为您可能更具体地寻找的是捆绑排序(这也是一种外部排序算法)。它非常适合重复删除。可以在此处找到一个有效的算法:。这里是为寻找特定算法的人准备的。

我认为您可能更具体地寻找的是捆绑排序(这也是一种外部排序算法)。它非常适合重复删除。可以在此处找到一个有效的算法:。这是为寻找特定算法的人准备的。

可能没有性能,但是:获取第一个字符串,搜索数据集的其余部分(分块或逐个搜索),删除重复项,移动到下一个,冲洗,重复。这当然太宽泛了,如何做到这一点取决于您实际从何处加载数据,以及性能瓶颈是什么(是否会加载?传输?排序?)。根据数据集的来源,并行化可能会有所帮助。这是我想要避免的暴力解决方案。那么,需要更多关于数据来源的详细信息:您的数据集是否已排序?原点是否可以使用索引(如数据库)对其进行排序?“数据集”太宽泛了。。。如果您的数据集是一个随机字符串流,必须按顺序读取或使用光标读取,则除了强制执行之外,没有其他方法可以删除重复项(至少如果非相等字符串的数量也无法放入内存中)。。。如果它被索引或排序,那么其他方法是可能的。不排序。除此之外,“来源”并不重要。为了简单起见,您可以假设它是从平面文件读取的。同样,如果从平面文件(或任何其他顺序光标)读取,它不会排序,并且不相等的字符串也无法放入内存,我个人认为没有比您在编辑中使用的更好的方法了,但我确实很好奇其他人可能会回答什么可能不会执行,但是:获取第一个字符串,搜索数据集的其余部分(分块或逐个搜索),删除重复项,移动到下一个,冲洗,重复。这当然太宽泛了,如何做到这一点取决于您实际从何处加载数据,以及性能瓶颈是什么(是否会加载?传输?排序?)。根据数据集的来源,并行化可能会有所帮助。这是我想要避免的暴力解决方案。那么,需要更多关于数据来源的详细信息:您的数据集是否已排序?原点是否可以使用索引(如数据库)对其进行排序?“数据集”太宽泛了。。。如果您的数据集是一个随机字符串流,必须按顺序读取或使用光标读取,则除了强制执行之外,没有其他方法可以删除重复项(至少如果非相等字符串的数量也无法放入内存中)。。。如果它被索引或排序,那么其他方法是可能的。不排序。除此之外,“来源”并不重要。为了简单起见,您可以假设它是从平面文件读取的。同样,如果从平面文件(或任何其他顺序光标)读取,它不会排序,并且不相等的字符串也无法放入内存,我个人认为没有比您在编辑中使用的更好的方法了,但是我很好奇其他人会怎么回答如果数据集可以放入内存,是的-检查数据集中是否存在字符串(而不是哈希表)。如果没有,请将其添加到地图中。如果它已经存在,请跳过它。然而,这不是问题所在。问题是关于处理无法放入内存的大型集合。@Beebunny:据我所知,所有条目(包括重复项)都不适合放入内存。这并不意味着一组没有重复项的所有条目也不适合内存