ネストされたループは常にO(n ^ k)ですか?


9

別のループ内にループがあっても、内側のループが1回しか実行されないことがわかっている場合、このアルゴリズムはO(n ^ 2)のままですか?

For i = 1 to n do

     For j = 1 to i do

          If (i==j) do

              For k = 1 to n

                  {Do stuff}

2番目のループの反復ごとに1回iだけになるため、非常に内側のループは最大で1回実行されjます。これはまだn ^ 3ですか?

回答:


7

このように考えてください。Nに関係なく、最も内側の関数は2番目のループの実行ごとに1回だけ実行されます。つまり、実行回数はNに線形に依存します。これは、最初のループ内のすべてを線形(O(n))時間操作として扱うことができることを意味します({do stuff}も一定時間であると想定)。最も外側のループを検討すると、O(n)をn回取る処理を実行していることがわかります。これは、全体的なランタイムがO(n ^ 2)であることを意味します

Nを2倍にすると、合計でN ^ 2回の反復が追加されます。したがって、全体のランタイムはN ^ 2です。


どうもありがとうございました!これは私が信じていることですが、ネストされたループについていつも考えていた方法が私を混乱させました
ジョン

@john、問題ありません。正しく理解するのは難しいです。Nを2倍にすることを考え、それから何かをする回数にどのように影響するかを尋ねると役立ちます。
Oleksi、2012年

えっ?最初と3番目のループはnに依存します。条件は、2番目のループの実行ごとに1回だけ真です。ここには、2つのn ^ 2タスク、ijループペアとikループペアがあります。ただし、結果はn ^ 2のままです。
Loren Pechtel 2012年

@LorenPechtelおっと。ごめんなさい。私はこれを見落としました。これを反映するように答えを更新しました。
Oleksi

9

いいえ、ネストされたループは、アルゴリズムがO(n ^ k)であることを自動的に意味するわけではありません。この例の作業の基本単位は{Do stuff}であるため、n増加すると実行される回数を数える必要があります。jループは必要iありません。1からカウントアップするだけで、ループがに達するまで何もしませんi。その1回の反復でのみ実際に処理が行われるため、コード例はO(n ^ 2)です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.