繁体   English   中英

删除重复项的好程序

[英]Good Procedure to remove duplicates

我有一个带有SPACE分隔符的巨大字符串(1GB),我将其转换为Array []。 我的字符串包含很多重复项。 我必须对字符串进行排序并删除重复项。 我已经完成了2个过程,但无法在这两个过程中决定一个。

程序1

我认为排序字符串是一个昂贵的过程,我想使用HashSet删除重复项,然后进行排序。

程序2

我对数组进行排序,并使用将已排序的数组及其上一个值与下一个值进行比较的正式程序来删除重复项,并删除重复项。

从我的角度来看,第一步程序似乎不错。 但是我不知道是否遇到任何错误。 哪个会好..?

假设内存不是问题,从性能角度来看,最有效的方法可能是:

String s = someOneGbString();
String[] words = s.split("\\s+");
Set<String> noDupes = new HashSet<>();
Collections.addAll(noDupes, words);

如果您需要对它进行排序:

Set<String> sorted = new TreeSet<> (noDupes);

或使用Java 8:

Set<String> sorted = Arrays.stream(s.split("\\s+"))
                           .sorted()
                           .collect(toSet());

情况1:内存<〜1GB

您可以使用外部合并排序。 http://en.wikipedia.org/wiki/External_sorting#External_merge_sort

情况2:内存>〜1GB

读取整个字符串。 将其拆分为一个数组( String[] )。 使用就地快速排序。 遍历数组,并检查顺序相邻的字符串是否相同。 由于子字符串不是原始String的副本,而是仅引用String池中的内存位置,因此这将节省空间。

时间复杂度:O(nlogn)

情况3:内存>>〜1GB

按照别人的建议去做。 使用TreeSet或HashSet。 对于TreeSet,每个插入将为O(logn),所以总计为O(nlogn)。 但是,就时间和空间而言,这将不如快速排序有效。 HashSet更复杂,具体取决于哈希函数。 在大多数情况下,它会很好,时间复杂度为O(n)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM