我在文件中有一百万行。从每一行创建一个对象并将其添加到集合中。必须使用类的自定义compareTo()
方法对集合进行排序。
目前,我按照阅读顺序将对象添加到ArrayList
,然后执行Collections.sort()
。
制作TreeSet会更快吗?
答案 0 :(得分:2)
两种方法都在(n log(n))时间内:向ArrayList
添加项目的情况最差(n),但通常在固定时间内完成,此时后备阵列足够长。实际的排序是(n log(n))。
根据docs,将项目添加到TreeSet
位于(log n)。你这样做了n次,所以整体时间复杂度是(n log(n))。
然而Collections.sort
在实践中似乎更快。
此代码段打印timeArray: 380
和timeTree: 714
。
import java.util.Collections;
import java.util.ArrayList;
import java.util.TreeSet;
import java.util.Random;
class Test {
public static void main(String[] args) {
int steps = 1000000; // one million lines
System.out.print("timeArray: ");
System.out.println(timeArray(steps));
System.out.print("timeTree: ");
System.out.println(timeTree(steps));
}
private static long timeArray(int steps) {
long t1 = System.currentTimeMillis();
ArrayList<Integer> arr = new ArrayList<>();
Random rnd = new Random();
for (int i = 0; i < steps; i++) {
arr.add(rnd.nextInt());
}
Collections.sort(arr);
return System.currentTimeMillis() - t1;
}
private static long timeTree(int steps) {
long t1 = System.currentTimeMillis();
TreeSet<Integer> tree = new TreeSet<>();
Random rnd = new Random();
for (int i = 0; i < steps; i++) {
tree.add(rnd.nextInt());
}
return System.currentTimeMillis() - t1;
}
}