TreeSet与ArrayList和排序

时间:2016-07-24 19:13:28

标签: java algorithm performance sorting

我有很多String对象,我应该以某种方式对它们进行排序。我决定找出更有效的方法 - 将对象放入TreeSet中,因此TreeSet自己对对象进行排序,或者将对象放在ArrayList中,然后对ArrayList进行排序。

我想方式:

对于ArrayList大小N的良好排序将具有N * log(N)的复杂性。

TreeSet使用红黑二叉树进行排序。此插入的插入的复杂性是A插入后的log(A)。因此,第一个元素的插入的复杂性将等于log(1),第二个元素的插入的复杂性将等于log(2),依此类推。因此完全复杂性将是log(1)+ log(2)+ log(N)。并且这个总和小于N * log(N)。

所以我期望TreeSet比ArrayList更有效。

我用代码测试它。就是这样:

public class SortTest {    
    static String getRandomString() {
        Random random = new Random();
        String result = "";
        for (int i = 0; i < 10; i++) {
            result += (char)(80 + random.nextInt(40));
        }
        return result;
    }

    static void testTreeSet() {
        TreeSet<String> treeSet = new TreeSet<>();
        for (int i = 0; i < 10000000; i++) {
            treeSet.add(getRandomString());
        }
    }

    static void testArrayList() {
        ArrayList<String> arrayList = new ArrayList<>();
        for (int i = 0; i < 10000000; i++) {
            arrayList.add(getRandomString());
        }
        Collections.sort(arrayList);
    }

    public static void main(String[] args) {
        Date date1 = new Date();
        testTreeSet();
        Date date2 = new Date();
        System.out.println(date2.getTime() - date1.getTime());        
        Date date3 = new Date();
        testArrayList();
        Date date4 = new Date();
        System.out.println(date4.getTime() - date3.getTime());
    }
}

我得到了这个结果:

23613
16217

所以ArrayList和sort比TreeSet更有效。 有人可以解释原因吗?

0 个答案:

没有答案