次のコードの big o 表記の計算について質問があります。
j = 1;
while ( j <= n ) do
for i = 1 to j do
O(1);
endfor;
j=j*2;
endwhile
これまでのところ、ループは Σ i=1,..,n 2 iと計算されています。幾何学的数列のように見えますが、大きな O の値がどうなるかはわかりません。誰でも助けてもらえますか?
すでに述べたように幾何学的シーケンスであるため、ここではガウスではありません。
j が n に達すると、外側の while ループは停止します。
そのために必要な反復回数は、ここで解決するlog₂(n)
問題2^x = n
であると仮定して計算できます。(nに達するまで何回2を掛け続けなければならないか)
興味深いことに、これは次のことにつながります。
log₂(n) log₂(n)
∑ 2^i = 2 - 1 = n - 1
0
Sum from 1 to log2(n) taken over 2^i
これはまさに2^(log2n) - 1
= n - 1
(フォントセットが必要な Unicode 文字をサポートしていない場合に備えて、上記の式を言い換えます)
ここでの事実を利用して
k k+1
∑ 2^i = 2 - 1
0
したがって、アルゴリズムはO(n)にする必要があります。
または、幾何学的シーケンスの一般的な式を使用して合計を計算することもできます。
Sn = a0 * (1-q^n) / (1-q)
これは、実際には同じ結果につながるはずです。
log₂n
1 - 2 1 - n
----------- = ------ = n - 1
1 - 2 -1
0(n^2) である必要があります。これは挿入ソートと同じです
void insertionsort(void){
for(int x=1;x<n;x++){
int temp= array[x];
for(int y=x-1; y>=0 && array[y]>temp ;y--){
array[y+1]=array[y];
}array[y+1]=temp;
}
}
1 から n になると O(n) になりますが、それぞれ y=x-1 から 0 になります。最悪の場合、常に y=x-1 から 0 になります。したがって、これはx が大きくなるたびに。
これはあなたの場合です。
幾何学的順序は正しいです。簡単な例を見てみましょう。n が 8 の場合、内側のループの反復回数は 1、次に 2、次に 4、次に 8 です。n が 7 の場合、1、2、4、そして 8 はありません。したがって、O( 1) n を増やすと、操作は n と 2n - 1 の間で変化します。その範囲の両側で、次数は O(n) です。
わかりました! 理解を深めるために、いくつかの値を想定してみましょう。
n を 4 とします。
So now:
j=1 ( <4 ) => loop runs 1 time = O(1)
j=1*2 = 2 ( <4 ) => loop runs 2 times = 2*O(1)
j=2*2 = 4 ( =4 ) => loop runs 4 times = 4*O(1)
n が 2^x 型の場合、一連のループ実行は次のようになります。
O(1) + 2*O(1) + 4*O(1) + 8*O(1) + 16*O(1) + ..... + n*O(1). = 1*(2^(x+1) - 1)*O(1)/(2-1) = (2n-1)*O(1) = O(n) n = 2^x で、外側のループは x+1 回実行されます。
n が 2^x 型でない場合。n = 6 としましょう。
So now:
j=1 ( <6 ) => loop runs 1 time = O(1)
j=1*2 = 2 ( <6 ) => loop runs 2 times = 2*O(1)
j=2*2 = 4 ( <6 ) => loop runs 4 times = 4*O(1)
j=2*4 = 8 ( >6 ) => loop exits.
外側のループが 2^( floor value( log base 2(n) )) + 1 回だけ実行されることは明らかです。そして、この値は有効な n になります。
したがって、式に入れましょう: (2n-1) O(1) => (2 (2^(floorValue(logBase2(n))) - 1)*O(1) は O(n) にほぼ等しくなります。
ここで少し賢くなるために: あなたが求めているのは、実際にはTheta
. あなたのコードはTheta(n)
- ですが、 Big-O は上限にすぎないO(n)
ため、O(n * log_2(n))
またはです。正確です。O(n!)
Theta