使用Arrays.sort进行数组分析的性能

时间:2012-01-31 22:06:18

标签: java performance big-o code-analysis

我的代码以下列方式使用Arrays.sort(char[])

    void arrayAnalysis(String[] array){
      for(int a=0; a<array.length;a++){
        char[] letters = array[a].toCharArray();
        Arrays.sort(letters);
        ...
        for(int b=a+1; b<array.length;b++){
          char[] letters2 = array[b].toCharArray();
          Arrays.sort(letters2);

          if(Arrays.equals(letters, letters2)
            print("equal");
        }
      }
    }

在这种情况下,n等于数组大小。由于嵌套的for循环,性能自动为O(n ^ 2)。但是,我认为Arrays.sort(带有O(nlog(n)))也会影响性能并使其比O(n ^ 2)更差。这种想法是否正确?

最终的表现是O(n * nlog(n)*(n * nlog(n))?还是我离开?

感谢。

编辑:我应该补充一点,当n与数组大小相关时,Arrays.sort正在使用数组元素中的字母数。如果将这个添加到性能分析中,这是我困惑的一部分。

编辑2:如果下选民留下评论为什么它被认为是一个糟糕的问题,那将是很酷的。

2 个答案:

答案 0 :(得分:5)

如果n是数组的长度,并且m是每个array[i]的长度,那么您将在每个n^2次迭代中执行{ {1}}排序,总体来说是O(m log m)(或O(n^2 (m log m))如果O(n^3 log n)。[编辑:现在我想更多关于这一点,你的猜测是正确的,这是错误的复杂性但我在下面说的仍然是正确的!]]

但这并不是必需的。您可以只生成数组的排序副本,然后使用该数组执行嵌套for循环。看看n == m为0时会发生什么:首先排序a,然后在内部for循环中排序array[0]array[1]

array[n]为1时,您首先排序a,然后在内部for循环array[1]array[2]但是你已经对所有进行了排序,并且它不会在过渡期间发生变化。

答案 1 :(得分:2)

运行 n 外部循环,每个循环都运行 n 内部循环,每个循环都调用一个O( n log n )算法,因此最终结果 - 没有级别之间的任何交互 - 是O( n 3 log n )。