我有一个带有SPACE分隔符的巨大字符串(1GB),我将它转换为Array []。我的字符串包含许多重复项。我要对字符串进行排序并删除重复项。我已经制定了两个程序,而且我无法确定这两个程序中的一个。
我认为排序字符串是一个昂贵的过程,我想使用HashSet删除重复项然后排序。
我对数组进行排序,并使用将已排序的数组与其先前值进行比较的正式过程删除重复项,并删除重复数据。
从我的观点来看,第一个程序似乎很好。但我不知道我是否遇到任何错误。哪一个会好...?
答案 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)。