配列に関連する問題があり、要件は時間の複雑さが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()
はより多くのスペースを消費しますか?
ここで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)スペースなので、便利かもしれません。
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))に増加します
それは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)の平均複雑度を持ち、インプレースで実行されるデュアルピボットクイックソートアルゴリズムで実装されています(たとえば、余分なスペースは必要ありません)。