マージソートアルゴリズムの時間の複雑さを計算している間、私は非常に混乱しています。特に分割ステップについて。除算ステップでは、「n」の中点、つまり「q = n/2」を計算する必要があります。
一定の時間がかかる方法。除算が初歩的な操作であり、時間が非常に短いと想定する場合は、除算にかかる時間も含める必要があります。
非常に長い時間を分割する必要がある場合は、時間の複雑さを計算する際に考慮する必要があります。私によると、除算の数は「n」に依存します。つまり、中点の計算は配列サイズ「n」に依存します。
例えば、
n = 2の場合
必要な除算の数= 1
n = 4の場合
必要な除算の数= 3
n = 8の場合
必要な分割数= 7
n = 16の場合
必要な除算の数= 15など...
私によると、
再帰的に定義する場合:-
「n」に必要な除算の数(入力配列の長さ= n)<= 1 +(n-1)に必要な除算の数。 {n = 0の場合除算の数= 0 n = 1の場合除算の数= 0}
または........。
「n」に必要な除算の数(入力配列の長さ= n)<=(0からn-1までの2 ^ iの合計)-(2 ^ n)
したがって、「n」に依存します。では、どうすればそれを一定の時間と見なすことができますか????
この明らかな不一致を理解するために時間を割いていただき、ありがとうございます。分割を考慮する必要があること、そしてこのアルゴリズムでは_~n
_分割があることは正しいです。一般に、適度に小さい数(長い数に収まる数)を除算する場合、その個々の除算演算は実質的にO(1)
としてカウントされるため、O(n)
除算があります。
あなたが欠けているのは、それが本当に重要ではないということです。なぜなら、私たちはすでにO(n)
操作をミックスに持っているからです:マージ。この特定のケースでは、分割を追加しても全体的な複雑さがO(n log n)
から変更されないのはそのためです。除算を考慮すると、それはO(2n log n)
に変更され、定数が因数分解されます。
除算が基本的な操作であり、時間が非常に短いと仮定する場合、除算にかかる時間も含める必要があります
Big Oは、実際には1回の操作にかかる時間を測定しません。むしろ、単一操作の数を増やすと、アルゴリズムがどれだけ適切にスケーリングするかを測定します。
このグラフを考えてみましょう:
水平軸はnを表します。縦軸は合計計算時間を表します。 nの値が小さい場合、O(n²)およびO(n³)アルゴリズムは実際にはO(1)対応物。これは、この架空の例では、O(1)アルゴリズムの単一操作は、O(n²)の単一操作よりもコストがかかるためです。 O(n³)アルゴリズム。
「分割ステップには一定の時間がかかる」というのは当たり前だと思いますが、一定の時間である理由は、1回の計算だからです。
この時点で、著者が言うのは、single分割ステップのコストはO(1)であるということだけです。著者は、3つの分割ステップまたは1000000の分割ステップを実行することについて主張していません。
compareまでの回数は、ほとんどのソートアルゴリズムの時間計算量の理由です。どの 分割統治アルゴリズム でも、divideの最大回数はn-1です。 これはnlog(n)よりも小さいため、無視できます。