使用する時間の複雑さの分析の表記をどのように知るのですか?


90

ほとんどの入門アルゴリズムクラスでは、(Big O)やような表記法が導入されており、学生は通常、これらのいずれかを使用して時間の複雑さを見つけることを学びます。OΘ

ただし、、およびなどの他の表記法があります。ある表記法が別の表記法よりも望ましい特定のシナリオはありますか?oΩω


2
そのあまりないことが好ましいとして適用 ...
vzn

回答:


76

あなたはランダウ記法に言及しています。それらは同じものに対する異なるシンボルではありませんが、まったく異なる意味を持っています。どちらが「好ましい」かは、目的のステートメントに完全に依存します。

F G F O G <fO(g)は、が最大で速度で漸近的に定数定数まで成長することを意味します。と考えてください。はより厳密な形式、つまりです。fgfo(g)<

F G ω F Ω G G OF fΩ(g)は対称的な意味を持ちます:は少なくとも同じくらい速く成長します。はより厳密な従兄弟です。はと同等あることがわかります。fgωfΩ(g)gO(f)

F G F OG Ω G をf gのΘ OfΘ(g)は、がほぼ同じ速度で成長することを意味します。正式に。(漸近的等式)はより強力な形式です。を使用するとき、しばしば意味します。fgfO(g)Ω(g)fgΘO

とその兄弟が関数クラスであることに注意してください。彼らと「算術」を行うときは、これとその正確な定義(誰が話しているかによって異なる場合があります)を十分に認識することが重要です。O(g)

物事を証明するときは、正確な定義で作業するように注意してください。Landauのシンボルには多くの定義があり(すべて同じ基本的な直感を持っています)、それらのいくつかは関数の一部のセットでは同等ですが、他のセットでは同等ではありません。

推奨読書:

Landau表記を厳密かつ健全な方法で使用することに興味がある場合は、Rutanen et al。による最近の研究に興味があるかもしれません。[1]。彼らはアルゴリズムでそれらを使用するときに漸近表記の必要かつ十分な基準を定式化し、共通の定義がそれらを満たすことができないことを示し、(実際に)実行可能な定義を提供します。


  1. K. Rutanenらによるアルゴリズム分析のためのO表記の一般的な定義。(2015)

5
私はちょうどがあることを指摘したいのような役割を果たしとのような役割を果たし、違いがあります。およびような関数およびを見つけることは難しくありません。OΩgffO(g)fΩ(g)
ザックラングレー

1
関数クラスについては+1。やようなものは、論文や本のいたるところに登場します。これは、これらの表記法に初めて直面する人にとって混乱を招く可能性があります。o(1)Ω(2n)
ジャノマ

7
@ZachLangleyあなたの言うことは非常に真実です。ここには完全な注文はありません。おそらくを起動することはおそらく危険ですが、直感的な構築の目的に役立つと思います。
ラファエル

42

ビッグO:上限

「ビッグO」()は、最も一般的なものです。アルゴリズムの複雑さを分析する場合、ほとんどの場合、重要なのは、入力のサイズが大きくなったときに実行時間¹が大きくなる速度に上限を設定することです。基本的に、アルゴリズムを実行するのに時間がかかりすぎないことを知りたいです。これを実際の時間単位(秒)で表現することはできません。これは、正確な実装(プログラムの記述方法、コンパイラの性能、マシンのプロセッサの速度など)に依存するためです。そのため、そのような詳細に依存しないもの、つまり、より大きな入力をフィードするときにアルゴリズムを実行するのにかかる時間を評価します。そして、私たちは主にプログラムが完了したことを確認できることに気を配っているので、通常、そのような時間以下の時間がかかることを知りたいです。O

アルゴリズムの実行時間は入力サイズに対してであるということは、アルゴリズムが最大ステップで完了するような定数が存在することを意味します。つまり、実行時間アルゴリズムの最大成長率は(スケーリングファクターまで)です。入力サイズアルゴリズムの実行時間注目すると、非公式にはが何らかのスケーリング係数になることを意味します。O(f(n))nKKf(n)fT(n)nO(n)T(n)f(n)

下限

場合によっては、上限よりも多くの情報があると便利です。はの逆です。関数が少なくとも他の関数と同じくらい速く成長することを表します。は、ある定数に対してを意味するか、非公式に言えば upいくつかのスケーリング係数に。ΩOT(n)=Ω(g(n))T(N)Kg(n)KT(n)g(n)

アルゴリズムの実行時間を正確に決定できる場合、はと組み合わせます。これは、スケーリング係数まで関数の成長率が既知であることを表します。は、定数およびに対してを意味します。非公式的に言えば、スケーリングファクターまで。ΘOΩT(n)=Θ(h(n))Kh(n)T(n)Kh(n)KKT(n)h(n)

さらなる考慮事項

「小さな」とは、複雑さの分析ではあまり使用されません。小さなは大きなより強い; ここで、は速くない成長を示し、は成長が厳密に遅いことを示します。逆に、は厳密に速い成長を示します。oωoOOoω

私は上記の議論で少し非公式でした。ウィキペディアには、すべての定義とより数学的なアプローチがあります。

などで等号を使用することは誤った呼び名であることに注意してください。厳密に言えば、は変数関数のセットであり、書く必要があります。T(n)=O(f(n))O(f(n))nTO(f)

例:いくつかのソートアルゴリズム

これはかなり乾燥しているので、例を挙げましょう。ほとんどのソートアルゴリズムには、2次の最悪の場合の実行時間があります。つまり、サイズ入力の場合、アルゴリズムの実行時間はです。たとえば、選択ソートでは実行時間がます番目の要素を選択するには回の比較が必要であり、合計で比較が必要になるためです。実際、比較の数は常に正確にであり、として増加します。したがって、選択ソートの時間の複雑さについて、より正確にすることができます。それはです。nO(n2)O(n2)knkn(n1)/2n(n1)/2n2Θ(n2)

マージソートを実行します。マージソートも2次()です。これは事実ですが、あまり正確ではありません。実際、マージソートの実行時間は、最悪の場合です。選択ソートのように、マージソートのワークフローは入力の形状に本質的に依存せず、その実行時間は常にから定数乗数まで、つまり。O(n2)O(nlg(n))nlg(n)Θ(nlg(n))

次に、quicksortを検討します。クイックソートはより複雑です。確かにです。さらに、クイックソートの最悪の場合は2次です。最悪の場合はです。ただし、クイックソートの最良のケース(入力が既にソートされている場合)は線形です。一般的なクイックソートの下限について言えることは、です。ここでは証明を繰り返しませんが、クイックソートの平均的な複雑さ(入力のすべての可能な順列の平均)はです。O(n2)Θ(n2)Ω(n)Θ(nlg(n))

一般的な設定でのソートアルゴリズムの複雑さに関する一般的な結果があります。ソートアルゴリズムは、一度に2つの要素しか比較できず、yesまたはnoの結果(または)であるとます。そして、アルゴリズムはすべての要素を少なくとも1回比較して適合位置を知る必要があるため、どのソートアルゴリズムの実行時間も常に(はソートする要素の数)であることは明らかです。この下限は、たとえば、入力が既にソートされており、アルゴリズムが各要素を次の要素と単に比較し、順序を維持するだけの(比較)にことができます。それほど明らかではないのは、最大実行時間が必然的にxyx>yΩ(n)nn1Ω(nlg(n))。アルゴリズムで比較する回数が少なくなることがありますが、入力サイズ、アルゴリズムがを超える入力を少なくとも1つ持つような定数が必要です。比較。証明の考え方は、アルゴリズムの決定木を構築すること、つまり、各比較の結果からアルゴリズムが行う決定に従うことです。各比較はyesまたはnoの結果を返すため、決定木は二分木です。あります入力の可能な順列、およびアルゴリズムはそれらすべてを区別する必要があるため、決定木のサイズはKnKnlg(n)n!n!。ツリーはバイナリツリーであるため、これらすべてのノードに適合するには、深さが必要です。深さとは、アルゴリズムが行う決定の最大数であるため、アルゴリズムの実行には少なくともこの数の比較が含まれます。最大実行時間はです。Θ(lg(n!))=Θ(nlg(n))Ω(nlg(n))

¹ またはメモリスペースなどの他のリソース消費。この回答では、実行時間のみを考慮しています。


1
「ただし、クイックソートの最適なケース(入力が既にソートされている場合)は線形です」これは最悪のケースです!!
user5507

@ user5507:実際には、ピボット戦略に依存します。最初の(または最後の)要素がピボットとして選択されている場合、あなたは正しいです。しかし、中間要素、または最初、中間、最後の中央値を選択した場合、ソートされた入力が最良のケースです。
チル

「複雑さの分析では、小さなoとωはあまり使用されません。」これは、スペースの複雑さの分析には当てはまりません。時間の複雑さの分析では、特定の操作(比較、ディスクシーク、キャッシュミス、何が必要か)をカウントするときに、通常oとωを使用します。しかし、いつでも待ってより高速のコンピューターを購入できるため、「壁時間」は常に「一定の要因まで」であるため、big-Oははるかに一般的です。空間分析では、情報理論のために多くの場合、厳密な下限があります。そのため、サイズが「f(n)+ o(f(n))ビット」として報告されるのは非常に一般的です。
仮名14年

私が考えている間:f(n)が何らかのデータ構造のサイズの理論上の下限である場合、f(n)+ O(1)(一定のオーバーヘッド)を使用するものは「暗黙的」と呼ばれ、 f(n)+ O(f(n))(一定の相対オーバーヘッド)は「コンパクト」と呼ばれ、f(n)+ o(f(n))(相対的なオーバーヘッドは最終的に重要ではなくなる)を使用するものは「簡潔」と呼ばれます「。あなたがそのスペースで働く必要があるかどうかを知るための良い条件。
仮名14年

17

典型的にはながら、上部境界(上から推定)を知らせるために使用される低い境界(以下から推定)を述べるために使用され、そして、それらが一致する場合に使用され、使用することができ、その場合、それらの代わりに(通常)結果を述べます。OΩΘΘ


3
「典型的に」?それらは他の何かに使用できますか?
-svick

1
@svick、はい、たとえば、これは、上限ステートメントではありません。上限文で私のようなものを意味しに上限表現。P=DTime(nO(1))f=O(g)f
カヴェー

4
実際、Kaveh、それ上限ステートメントです。「」の提案者の英語翻訳は、「PはAT MOSTの多項式演算数を使用して解決できる問題のセットです」です。「せいぜい」という意味でなければ、書いておく必要があります。(もちろん、両方の記述は正しいです。)P=DTime(nO(1))P=DTime(nΘ(1))
ジェフ

@JeffE、私はそれを関数セット間の平等と考えていますが、あなたは正しいです、より一般的な意味での上限と考えることもできます。
カヴェー

@JeffE実際、ので、しかし。D T I M EΘ nは対数NをP D T I M EΘ nは対数NをD T I M EnはΘ 1 = PDTIME(nΘ(1))DTIME(Θ(nlogn))PDTIME(Θ(nlogn))DTIME(nΘ(1))=
デビッドリチャービー14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.