删除重复的好程序

时间:2014-04-20 18:10:00

标签: java sorting

我有一个带有SPACE分隔符的巨大字符串(1GB),我将它转换为Array []。我的字符串包含许多重复项。我要对字符串进行排序并删除重复项。我已经制定了两个程序,而且我无法确定这两个程序中的一个。

程序1

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

程序2

我对数组进行排序,并使用将已排序的数组与其先前值进行比较的正式过程删除重复项,并删除重复数据。

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

案例1:记忆&lt; 〜1GB

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

案例2:记忆&gt; 〜1GB

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

时间复杂度:O(nlogn)

案例3:记忆&gt;&gt; 〜1GB

像其他人建议的那样做。使用TreeSet或HashSet。对于TreeSet,每次插入都是O(logn),因此总数为O(nlogn)。然而,就时间和空间而言,这将比快速排序效率低。根据哈希函数,HashSet更复杂。在大多数情况下,它会做得很好,时间复杂度为O(n)。