java - 创建一个 SortedSet(对象)并向其插入元素或创建一个 ArrayList 并在之后对其进行排序是否更快?

标签 java sorting arraylist

<分区>

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

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

制作一个 TreeSet 会更快吗?

最佳答案

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

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

然而 Collections.sort 在实践中似乎更快。

此代码片段打印 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;
    }
}

关于java - 创建一个 SortedSet(对象)并向其插入元素或创建一个 ArrayList 并在之后对其进行排序是否更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28560522/

相关文章:

java - 处理短数据类型的变量

Java:如何在抽象类中引用子类的静态变量?

php - PHP 中有简单的 usort 吗?

java - 从两个列表中删除不重复的对象

java - 为什么 List 中的元素会自行修改?

java - JTable 中的乘法值

java - 如果我忘记了 key ,如何获取原文

java - 尝试对 kml 文件中的一些地标进行排序

linux - 按类型和大小显示文件的终端命令/脚本

java - 将CSV文件中的数据读取到ArrayList中并显示在XY图表中