2016-04-07 10 views
2

に影響を与える計算するんFORループはどのように我々が持っていると言うループセンチネルFOR複雑

int n; 

for (int i = 0; i < sqrt(n); i++) 
{ 
    statement; 
} 

私はループのO(n)の複雑さに複雑さを加えるの平方根を計算していますか?私の例では、Javaのsqrt関数は時間の複雑さがO(log n)であり、これがループの時間の複雑さにどのように影響しますか? sqrt関数はループのすべてのシーケンスに適用されるか、または一度だけ適用され、その値は再び格納されて使用されますか?

+1

'statement'の中で' n'を修正していますか? –

+0

この文でnが変更されていないとします。 – cheroz

+0

(ループのセンチネルは表示されません:終了条件に1つの評価を保存するために作成または変更された要素例:_key_と_head_および_tail_への参照を指定した順序付けられた単一リンクリストの検索_tail_または_nil_各反復で、最後の要素を_key_に設定するか、そのような要素を追加して、list_の_endについて気にせずに検索してください)。 – greybeard

答えて

2

これは言語に依存する可能性がありますが、一般にi < sqrt(n)のチェックは各ループの反復後に実行されるため、効果的にsqrt(n)回と呼ばれます。 sqrt関数は、ループのすべての列に適用されるので、

int n; 
double sn = sqrt(n); 

for (int i = 0; i < sn; i++) 
{ 
    statement; 
} 
+0

これは、ステートメントを実行する前にすべての繰り返しが同じ値を計算するのに時間がかかることを意味します。 – cheroz

+0

はい、あなたが正しくています – malarzm

+1

@cherozコンパイラは、副作用がないと判断して引数の値を変更できない場合、ループから 'sqrt'呼び出しを最適化することが可能です。しかし、それを明示的にし、すべての疑念を取り除く方が常に良いです。 –

0

良いアイデアは、変数にsqrt(n)結果を格納し、iにそれを比較することです。しかし、nの使用は異なります。 sqrtのO(logn)の複雑さは、値のビット数であるnですが、ループのO(n)は実際の値であるnです。その定義がnの場合、sqrtはO(loglogn)のようになります。

このようなループの場合、sqrtのような数値に対する操作の複雑さは一定の時間として扱うことができます。ビット数は制限されているため、時間は大きなループと比較して重要ではありません。

0
変数について

N問題で与えられ、

O(ログ(D =可変のビット) * SQRT(N =ループで数)

N-見つけると仮定数字(ビット)の数 'sqrtはlog(D)で、' fgb 'は最初に述べたものです。

、ビット Nの数は、すべての演算により、全てのハードウェアのために一定であると仮定するので:

O(ログ(定数)* SQRT(N))

O(定数*のSQRT( N))

O(SQRT(N))

が、Nのビットが強くstypedない場合場合は、1024 128 256にビットを64ビットから行くが、それを有するように(徐々に増加させます値)の場合は

O(ログ(D)* SQRT(n))を

+0

sqrt関数がライブラリ/ハードウェア関数でない場合、sqrtを計算するためにバイナリ検索を使用し、したがってO(log n)時間の複雑さがあるとします。私はこれを理解するのが遅い場合は申し訳ありませんが、私はちょうどアルゴリズムについて学び始めています。 – cheroz

+0

すべての計算でビット数が同じであれば、その平方根n。 –

0

時間複雑各反復回呼び出され

sqrt(n)についてのあなたの質問に答えると、これは、いくつかのさらに時間がかかります。

sqrt(n)iまたはstatementの値とは独立しているため、計算には常に同じ時間がかかります。だから私の理解から、はループの複雑さを増やさずに、それはまだO(n)です。

関連する問題