概観
他の人は、ツリー図などの良い図の例を示しています。簡単なコード例は見ませんでした。そのため、私の説明に加えて、さまざまなアルゴリズムカテゴリの複雑さを示すために、いくつかのアルゴリズムに単純な印刷ステートメントを提供します。
最初に、Logarithmの一般的な概念が必要になります。これは、https://en.wikipedia.org/wiki/Logarithmから取得できます。自然科学の使用e
と自然ログ。コンピューターはバイナリベースであるため、工学の弟子はlog_10(ログベース10)を使用し、コンピューターの科学者はlog_2(ログベース2)を頻繁に使用します。自然対数の省略形がと表示される場合がありますがln()
、エンジニアは通常log()
_10をオフにしてそのまま使用し、log_2はと省略されlg()
ます。すべてのタイプの対数は同様の方法で増加しますlog(n)
。そのため、これらは同じカテゴリのを共有します。
以下のコード例を見るときは、O(1)、O(n)、O(n ^ 2)の順に見ることをお勧めします。あなたがそれらに満足したら、次に他の人を見てください。微妙な変更によって同じ分類がどのように行われるかを示すために、明確な例とバリエーションを含めました。
O(1)、O(n)、O(logn)などは、成長のクラスまたはカテゴリと考えることができます。一部のカテゴリは、他のカテゴリよりも実行に時間がかかります。これらのカテゴリは、アルゴリズムのパフォーマンスを順序付ける方法を提供します。一部は、入力nが大きくなるにつれて速く成長しました。次の表は、この成長を数値で示しています。次の表では、log(n)をlog_2の上限と考えています。
さまざまなビッグOカテゴリの簡単なコード例:
O(1)-一定時間の例:
アルゴリズム1はhelloを1回出力し、nに依存しないため、常に一定の時間で実行されるため、ですO(1)
。
print "hello";
アルゴリズム2はhelloを3回出力しますが、入力サイズには依存しません。nが大きくなっても、このアルゴリズムは常にhelloを3回だけ出力します。言われている3は定数なので、このアルゴリズムもO(1)
です。
print "hello";
print "hello";
print "hello";
O(log(n))-対数の例:
- アルゴリズム3-これは「log_2」のように機能します
アルゴリズム3は、log_2(n)で実行されるアルゴリズムを示しています。forループのポスト操作は、iの現在の値を2倍するためi
、1から2、4から8、16から32になります。
for(int i = 1; i <= n; i = i * 2)
print "hello";
- アルゴリズム4-これは「log_3」のように機能します
アルゴリズム4はlog_3を示しています。通知i
は1から3から9から27に進みます...
for(int i = 1; i <= n; i = i * 3)
print "hello";
- アルゴリズム5-これは「log_1.02」のように機能します
アルゴリズム5は重要です。これは、数値が1より大きく、結果がそれ自体に対して繰り返し乗算される限り、対数アルゴリズムを調べていることを示すのに役立ちます。
for(double i = 1; i < n; i = i * 1.02)
print "hello";
O(n)-線形時間の例:
このアルゴリズムは単純で、helloをn回出力します。
for(int i = 0; i < n; i++)
print "hello";
このアルゴリズムは、helloをn / 2回出力するバリエーションを示しています。n / 2 = 1/2 * n。1/2定数を無視し、このアルゴリズムがO(n)であることを確認します。
for(int i = 0; i < n; i = i + 2)
print "hello";
O(n * log(n))-nlog(n)の例:
組み合わせと考えるO(log(n))
とO(n)
。forループの入れ子は、O(n*log(n))
for(int i = 0; i < n; i++)
for(int j = 1; j < n; j = j * 2)
print "hello";
アルゴリズム9はアルゴリズム8に似ていますが、各ループでバリエーションが許可されているため、最終的な結果は次のようになります。 O(n*log(n))
for(int i = 0; i < n; i = i + 2)
for(int j = 1; j < n; j = j * 3)
print "hello";
O(n ^ 2)-nの2乗の例:
O(n^2)
ループの標準をネストすることで簡単に取得できます。
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
print "hello";
アルゴリズム10に似ていますが、いくつかのバリエーションがあります。
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j = j + 2)
print "hello";
O(n ^ 3)-nの3乗の例:
これはアルゴリズム10に似ていますが、ループが2ではなく3つあります。
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
for(int k = 0; k < n; k++)
print "hello";
アルゴリズム12と同様ですが、まだ生成されるいくつかのバリエーションがありますO(n^3)
。
for(int i = 0; i < n; i++)
for(int j = 0; j < n + 5; j = j + 2)
for(int k = 0; k < n; k = k + 3)
print "hello";
概要
上記は、いくつかの簡単な例と、分析に実際には影響を与えないわずかな変更を導入できることを示すバリエーションです。うまくいけば、十分な洞察が得られます。