【问题标题】:is it faster to create a SortedSet (of objects) and insert elements to it or create an ArrayList and sort it afterwards? [duplicate]创建一个 SortedSet(对象)并向其中插入元素或创建一个 ArrayList 并在之后对其进行排序是否更快? [复制]
【发布时间】:2015-04-18 02:11:10
【问题描述】:

我在一个文件中有一百万行。从每一行创建一个对象并将其添加到集合中。必须使用类的自定义 compareTo() 方法对集合进行排序。

目前我按阅读顺序将对象添加到ArrayList,然后执行Collections.sort()

制作 TreeSet 会更快吗?

【问题讨论】:

  • 你为什么不试试看?
  • 可能会慢一些,但试用大约需要三行代码。
  • @FINDarkside,我现在还是个初学者,所以我不仅想看看它的实际效果,还想了解它背后的理论。我现在正在尝试。
  • arraylist 的添加操作复杂度为 O(n),排序后需要时间 n log(n) 并且在同一级别树集具有内置的自定义比较器,添加和复杂度为 log(n)对于 addall() 操作将给出 O(n log n)
  • 看看这个问题:java-collections-sort-performance

标签: java sorting arraylist


【解决方案1】:

这两种方法都在 ?(n log(n)) 时间内:将项目添加到 ArrayList 的最坏情况是 ?(n),但通常在后备数组足够长时在恒定时间内完成.实际排序在?(n log(n))中。

根据docs,向TreeSet 添加项目在?(log n) 中。你这样做 n 次,所以总的时间复杂度是?(n log(n))。

但是Collections.sort 在实践中似乎更快。

此代码 sn-p 打印 timeArray: 380timeTree: 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;
    }
}

【讨论】:

    猜你喜欢
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多