web-dev-qa-db-ja.com

Arrays.sort()は時間の複雑さと時空の複雑さを増やしますか?

配列に関連する問題があり、要件は時間の複雑さがO(n)であり、空間の複雑さがO(1)であることです。

Arrays.sort(arr)を使用し、forループを1つのパスループに使用する場合、たとえば、

_public static int hello(int[]A){
  Arrays.sort(A);
  for(int i=0;i<A.length;i++){
     ....................
  }
  return ....;
_

}

したがって、ループにはO(n)時間かかります。私の質問は、Arrays.sort()はもっと時間がかかりますか?Arrays.sort()を使用すると複雑さはまだO(n)ですか?Arrays.sort()はより多くのスペースを消費しますか?

16
aminy

ここでJavaについて話していると思います。

したがって、ループにはO(n)の時間がかかります。私の質問は、Arrays.sort()の方が時間がかかるということです。

はいArrays.sort(int[]) 私が知っているすべてのJava標準ライブラリ実装で、は比較ベースのソートの例であり、したがって 最悪の場合の複雑さΩ(n log n)が必要) です。特に、Oracle Java 7は整数オーバーロードにデュアルピボットクイックソートバリアントを使用しますが、実際にはΩ(n2 最悪の場合。

そしてArrays.sort()はより多くのスペースを必要としますか?

おそらくω(1)スペースを使用します(つまり、別のyesを使用し、スペースの使用はO(1)ではありません)。余分なスペースを一定にして比較ベースのソートを実装することは不可能ではありませんが、実際的ではありません。

とはいえ、特定の条件下では、特定のタイプのデータを線形時間でソートすることが可能です。たとえば、以下を参照してください。

入力整数の定数範囲がある場合(たとえば、一部の定数Cのabs(A[i]) <= Cの場合)、ソートのソートと基数のソートは実際にO(n)時間とO(1)スペースなので、便利かもしれません。

25
Niklas B.

Java jvm 8 javadocs of Arrays.sort()メソッドによると:

並べ替えアルゴリズムは、Vladimir Yaroslavskiy、Jon Bentley、およびJoshua BlochによるDual-Pivotクイックソートです。このアルゴリズムは、他のクイックソートが2次のパフォーマンスに低下する原因となる多くのデータセットでO(n log(n))パフォーマンスを提供します。通常、従来の(1ピボット)Quicksort実装よりも高速です。

したがって、時間の複雑さがO(n)からO(n log(n))に増加します

4
pedrogonzalezj

それはO(n)時間より長く、O(1)より多くのスペースを必要とします。

Arrays.sort() 1.7で変更された Timsort を使用します。これは比較的最近開発されたソートアルゴリズムであり、複雑度xのソートを提供します。ここでO(n)<x <O(nlgn)およびO(n/2)のスペース

最近のJDKのArrays.sort(int [] a)は、O(n log n)の平均複雑度を持ち、インプレースで実行されるデュアルピボットクイックソートアルゴリズムで実装されています(たとえば、余分なスペースは必要ありません)。

1
apangin