漸近関数とは何ですか?とにかく、漸近線とは何ですか?
サイズnの入力に適用されたときにアルゴリズムによって消費されるリソースの量(CPU時間、RAM、ディスク容量など)を記述する関数f(n)が与えられた場合、そのパフォーマンスを記述するための最大3つの漸近表記法を定義します大型のn。
漸近線(または漸近関数)は、nが大きくなるにつれてf(n)がますます近づきますが、決して到達しない他の関数(または関係)g(n)です。漸近関数について話すことの利点は、f(n)の式が非常に複雑な場合でも、一般的に話すほうがはるかに簡単であることです。漸近関数は、f(n)を上または下に制限 する境界表記の一部として使用されます。
(注:ここで採用されている意味では、漸近関数は、いくつかの一定の非ゼロ係数を補正した後、元の関数に近いだけです。3つのbig-O /Θ/Ω表記はすべて、この定数係数を考慮から無視しています。)
3つの漸近境界表記法とは何ですか?
3つの表記はすべて次のように使用されます。
f(n)= O(g(n))
ここで、f(n)は対象の関数であり、g(n)はf(n)を近似しようとしている他の漸近関数です。これは、厳密な意味での平等としてますが、すべきではない速いかとの正式な声明fが(N)に対する成長するn個と比較してG(N)として、nは大きくなります。純粋主義者はしばしば記号f(n)∈O(g(n))を使用して、記号O(g(n))が実際に共通の成長率を共有する関数のファミリー全体であることを強調します。
Big-ϴ(シータ)表記は、f(n)の成長が一定の係数まで等しいことを示します(これについては後で詳しく説明します)。成長率の演算子と同様に動作します。=
Big-O表記は、f(n)の成長の上限を表します。成長率の演算子と同様に動作します。≤
Big-Ω(オメガ)表記は、f(n)の成長の下限を表します。成長率の演算子と同様に動作します。≥
他の多くの漸近表記法がありますが、それらはコンピュータサイエンスの文献ではほとんど発生しません。
Big-O表記とその同類は、時間の複雑さを比較する方法としてよく使用されます。
時間の複雑さは何ですか?
時間の複雑さは、アルゴリズムがその入力サイズnの関数として実行するのにかかる時間T(n)の凝った用語です。これは、リアルタイムの時間(秒など)、CPU命令の数などで測定できます。通常、アルゴリズムは、毎日のフォンノイマンアーキテクチャコンピューターで実行されると想定されています。ただし、時間の複雑さを使用して、物事が異なる可能性のある、よりエキゾチックなコンピューティングシステムについて話すこともできます!
また、Big-O表記を使用してスペースの複雑さについて話すことも一般的です。スペースの複雑さは、アルゴリズムを完了するために必要なメモリ(ストレージ)の量であり、RAM、ディスクなどがあります。
あるアルゴリズムは低速ですがメモリ使用量が少なく、別のアルゴリズムは高速ですがメモリ使用量が多い場合があります。リソースが異なるように制約されている場合、それぞれが異なる状況でより適切な場合があります。たとえば、組み込みプロセッサのメモリが限られているため、アルゴリズムが遅い場合がありますが、データセンターのサーバーには大量のメモリがあり、アルゴリズムが速い場合があります。
Big-ϴの計算
アルゴリズムのBig-ϴを計算することは、小さな教科書または学部クラスの約半期を満たすことができるトピックです。このセクションでは、基本を説明します。
擬似コードで関数f(n)が与えられた場合:
int f(n) {
int x = 0;
for (int i = 1 to n) {
for (int j = 1 to n) {
++x;
}
}
return x;
}
時間の複雑さは何ですか?
外側のループはn回実行されます。外側のループが実行されるたびに、内側のループがn回実行されます。これにより、実行時間はT(n)= n 2になります。
2番目の関数を考えます。
int g(n) {
int x = 0;
for (int k = 1 to 2) {
for (int i = 1 to n) {
for (int j = 1 to n) {
++x;
}
}
}
return x;
}
外側のループは2回実行されます。中央のループはn回実行されます。中央のループが実行されるたびに、内側のループがn回実行されます。これにより、実行時間はT(n)= 2n 2になります。
質問は、両方の関数の漸近的な実行時間は何ですか?
これを計算するには、2つの手順を実行します。
- 定数を削除します。入力によりアルゴリズムの時間が長くなると、他の用語が実行時間を支配し、重要ではなくなります。
- 最大の用語を除くすべてを削除します。nが無限大になり、N 2が急速に上回っn個。
ここで重要なのは、主要な用語に焦点を当て、それらの用語を単純化することです。
T(N)= N 2 ∈Θ(N 2)、
T(N)= 2N 2 ∈Θ(N 2)
複数の用語を持つ別のアルゴリズムがある場合、同じルールを使用して単純化します。
T(n)= 2n 2 + 4n + 7∈ϴ(n 2)
これらすべてのアルゴリズムの鍵は、最大の用語に焦点を合わせ、定数を削除することです。実際の実行時間ではなく、相対的な複雑さを見ています。
Big-ΩおよびBig-Oの計算
まず、非公式の文献では、ギリシャ文字は入力が難しいため、「Big-O」はしばしばBig-Θの同義語として扱われます。そのため、青から外れた誰かがアルゴリズムのBig-Oを求める場合、おそらくそのBig-Θが必要です。
さて、前に定義した正式な意味でBig-ΩとBig-Oを本当に計算したい場合、大きな問題があります。特定の関数には無限に多くのBig-ΩとBig-Oの記述があります!これは、42以下の数値を尋ねるようなものです。多くの可能性があります。
T(n)∈ϴ(n 2)を使用するアルゴリズムの場合、次のいずれかが正式に有効なステートメントです。
- T(n)∈O(n 2)
- T(n)∈O(n 3)
- T(n)∈O(n 5)
- T(n)∈O(n 12345 ×e n)
- T(n)∈Ω(n 2)
- T(n)∈Ω(n)
- T(n)∈Ω(log(n))
- T(n)∈Ω(log(log(n)))
- T(n)∈Ω(1)
しかし、T(n)∈O(n)またはT(n)∈Ω(n 3)を述べることは正しくありません。
相対的な複雑さとは何ですか?どんなクラスのアルゴリズムがありますか?
2つの異なるアルゴリズムを比較すると、通常、入力が無限大になるにつれて複雑さが増します。異なるタイプのアルゴリズムを見ると、それらは比較的同じままであるかもしれません(たとえば、一定の要因で異なる)、または大きく分岐するかもしれません。これがBig-O分析を実行する理由です。つまり、アルゴリズムが大きな入力で合理的に実行されるかどうかを判断するためです。
アルゴリズムのクラスは次のように分類されます。
Θ(1)-定数。たとえば、リストの最初の番号を選択すると、常に同じ時間がかかります。
Θ(n)-線形。たとえば、リストの反復には、常にリストのサイズnに比例した時間がかかります。
Θ(log(n))-対数(通常、底は関係ありません)。各ステップで入力スペースを分割するアルゴリズム(バイナリ検索など)は例です。
Θ(n×log(n))-線形時間の対数(「線形」)。これらのアルゴリズムは通常、すべての入力を反復(n)しながら、分割して征服(log(n))します。多くの一般的なソートアルゴリズム(マージソート、ティムソート)はこのカテゴリに分類されます。
Θ(n m)-多項式(nは任意の定数mに引き上げられます)。これは非常に一般的な複雑度クラスで、ネストされたループでよく見られます。
Θ(m n)-指数(定数mはnに引き上げられます)。多くの再帰アルゴリズムおよびグラフアルゴリズムがこのカテゴリに分類されます。
Θ(n!)-階乗。特定のグラフおよび組み合わせアルゴリズムは、階乗の複雑さです。
これは、ベスト/アベレージ/ワーストケースと関係がありますか?
いいえ 。Big-Oとその表記法は、特定の数学関数について説明しています。これらは、アルゴリズムの効率を特徴付けるのに役立つ数学ツールですが、ベスト/平均/ワーストケースの概念は、ここで説明する成長率の理論とは無関係です。
アルゴリズムのBig-Oについて話すには、有用な意味で入力の「サイズ」を記述する1つのパラメーターのみを使用して、アルゴリズムの特定の数学モデルにコミットする必要がありますn
。しかし、現実の世界では、入力は単なる長さよりもはるかに多くの構造を持っています。これはソートアルゴリズムだった場合、私は文字列で養うことができ"abcdef"
、"fedcba"
または"dbafce"
。それらはすべて長さ6ですが、そのうちの1つは既にソートされており、1つは逆になっており、最後はランダムな寄せ集めです。入力が既にソートされている場合、一部のソートアルゴリズム(Timsortなど)の方がうまく機能します。しかし、この不均一性を数学モデルにどのように組み込むのでしょうか?
典型的なアプローチは、入力がランダムで確率的な分布から来ると単純に仮定することです。次に、lengthを使用して、すべての入力についてアルゴリズムの複雑度を平均しますn
。これにより、アルゴリズムの平均ケース複雑度モデルが得られます。ここから、通常のBig-O /Θ/Ω表記を使用して、平均的なケースの動作を説明できます。
しかし、サービス拒否攻撃が心配な場合は、もっと悲観的にならなければならないかもしれません。この場合、唯一の入力はアルゴリズムに最大の悲嘆を引き起こすものであると仮定する方が安全です。これにより、最悪の場合のアルゴリズムの複雑性モデルが得られます。その後、最悪のモデルのBig-O /Θ/Ωなどについて話すことができます。
同様に、ベストケースモデルに到達するためのアルゴリズムのトラブルが最も少ない入力のみに関心を集中し、Big-O /Θ/Ωなどを調べることもできます。