概要
他の人は、ツリー図などの良い図の例を示しています。簡単なコード例は見当たりませんでした。そのため、私の説明に加えて、アルゴリズムのさまざまなカテゴリの複雑さを説明するために、簡単な print ステートメントをいくつかのアルゴリズムに提供します。
まず、 https://en.wikipedia.org/wiki/Logarithmから取得できる対数の一般的な考え方を理解する必要があります。自然科学の使用e
と自然対数。コンピュータはバイナリベースであるため、エンジニアリングの弟子は log_10 (対数ベース 10) を使用し、コンピュータ科学者は log_2 (対数ベース 2) をよく使用します。自然対数の省略形が として表示されることがありますがln()
、エンジニアは通常、_10 をオフのままにして使用log()
し、log_2 は と省略しlg()
ます。すべてのタイプの対数は同様の方法で成長します。そのため、それらは の同じカテゴリを共有しますlog(n)
。
以下のコード例を見るときは、O(1)、O(n)、O(n^2) の順に見ることをお勧めします。それらに慣れたら、他のものを見てください。微妙な変更が同じ分類にどのようにつながるかを示すために、クリーンな例とバリエーションを含めました。
O(1)、O(n)、O(logn) などは、成長のクラスまたはカテゴリと考えることができます。一部のカテゴリは、他のカテゴリよりも時間がかかります。これらのカテゴリは、アルゴリズムのパフォーマンスを順序付けする方法を提供するのに役立ちます。入力 n が大きくなるにつれて、より速く成長するものもありました。次の表は、この成長を数値で示しています。以下の表では、log(n) を log_2 の上限と考えてください。

さまざまな Big 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 の二乗 例:
O(n^2)
は、標準の for ループをネストすることで簡単に取得できます。
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 立方 例:
これはアルゴリズム 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";
概要
上記は、いくつかの単純な例と、実際には分析を変更しない微妙な変更を導入できることを示すのに役立つバリエーションを示しています。うまくいけば、それはあなたに十分な洞察を与えるでしょう.