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

Java 使用Arrays.sort进行数组分析的性能,java,performance,big-o,code-analysis,Java,Performance,Big O,Code Analysis,我有一个使用数组的代码。排序(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[])的方式如下:

    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");
        }
      }
    }
void数组分析(字符串[]数组){

对于(int a=0;a您运行n个外部循环,每个外部循环运行n个内部循环,每个内部循环调用一个O(n logn)算法,因此最终结果(在级别之间没有任何交互)是O(n3 logn)。

如果
n
是数组的长度,
m
是每个
数组的长度[i]
,然后您将在每个
n^2
迭代中执行
O(m log m)
排序,因此总体上是
O(n^2(m log m))
(或者
O(n^3 log n)
如果
n==m
[编辑:现在我想得更多了,您的猜测是正确的,这是错误的复杂性。但我下面说的仍然是正确的!]

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


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

字符串有多长?这是数组中的
n
。排序大O,它与数组大小中的
n
不同。如果您有最大字符串长度,那么Arrays.sort位以一个常量为界。那么您的复杂度估计值不仅取决于
n
,还取决于字符串大小。下面的答案很好。非常感谢@ChrisNash,我以前没有考虑过边界大小。关于下面的答案,我的困惑是是否忽略了初始排序。明白了,您看到的是外部排序
O(m log m)
和内部排序
O(m log m)
。但是它们是顺序操作,所以它们是加法而不是乘法(记住
O(某物)+O(较小的东西)
仍然是
O(某物)
)。重要的一点是有多少排序。在外循环中也有一个O(n log n)算法调用。我想你忽略了
数组。排序(char[])
在外部循环中调用。但是,您所说的非常有意义。这是一种提高性能的方法。对数组进行一次排序。这就是
O(n(m log m))
。比较数组就是一个嵌套循环,这就是
O(n^2 m)
,由于是最坏的情况,您必须比较每个字符中的
m
字符。这是一个可爱的问题,因为
n
m
的相对大小实际上会对答案产生影响。