Java应用程序花费大部分时间对某些键进行排序并删除重复项。
因此,必须选择适合的排序算法。
键是整数(大约256位但不一定),数组大小介于1000到100000之间。
输入数组由连续的键组组成。这些组已经分类并且很小(大约10个键)。
一个数组示例(3组,32位密钥):
0x01000000
0x01010000
0x01010100
0x01010101
0x01000000
0x01010000
0x01010100
0x01010102
0x01000000
0x01020000
0x01020200
0x01020203
排序并删除重复项后:
0x01000000
0x01010000
0x01010100
0x01010101
0x01010102
0x01020000
0x01020200
0x01020203
有什么难的?任何的想法 ?有链接吗?
由于
PS:在查看排序算法之后,包括很多变换的合并排序,基数排序,qui ......我继续挖掘哈希映射。
PPS:最后我分叉了Java遗留合并排序,添加了过滤和排序组的概念。它提供了很好的加速。
答案 0 :(得分:5)
合并排序(http://en.wikipedia.org/wiki/Merge_sort)
由于您的输入数据是预分类的,因此您有一个良好的开端。您可以将每个列表中的第一个值输入PriorityQueue,取出最小值,然后将该列表中的下一个值添加到队列中。重复。进行一些检查以达到目的。 : - )
我确信有更多完整细节的答案。
更多链接:
http://www.cs.washington.edu/education/courses/cse373/06sp/handouts/lecture08.pdf
和我自己的答案,包括相当完整的Java代码:
答案 1 :(得分:1)
没有任何更多细节的最简单的解决方案是
您应该能够将所有行读入TreeSet并在最后打印出来。
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
TreeSet<String> sortedSet = new TreeSet<String>();
for(String line; (line = br.readLine()) != null;)
sortedSet.add(line);
for (String s : sortedSet)
System.out.println(s);
答案 2 :(得分:0)
我建议你在这里使用Collections.sort,因为它会处理重复项(如果你为数字创建一个SET),并且排序时间复杂度是O(nlogn),它和它一样好
如果您只有一组特定的数字,那么您可能需要查看Radix排序。
答案 3 :(得分:0)
如果您每次都对全新数组进行排序,您可能会受益于Quick sort或Bucket sort
如果您的数组更新Fibonacci heap(最有效,但很复杂),Binomial heap或简单Binary heap。
答案 4 :(得分:0)
由于您的排序键是有限范围内的整数,因此您可以使用radix sort。基数排序具有线性时间复杂度,而基于比较的更通用排序算法具有用于排序n个项目的最小O(n log n)运行时间,使得基数排序和类似排序算法优于大数据集。
答案 5 :(得分:0)
您可以遍历所有元素并将它们全部放在Set
中。具体来说,将所有元素放在TreeSet
中以便为您提供正确的排序。这也将自动删除重复项。你的代码实际上非常简单 -
Set<int> sortedUniqueKeys = new TreeSet<int>(keys);
其中keys是重复整数键的未排序数组。所有排序/重复删除都在构造函数中完成,并且(推测)很快。