web-dev-qa-db-ja.com

O、Ω、Θの違いは何ですか?

私はアルゴリズム分析を学んでいます。 O、Ω、Θの違いがわかりません。

それらの定義方法は次のとおりです。

  • f(n) = O(g(n))は、c · g(n)f(n)の上限であることを意味します。したがって、f(n)が常に≤c · g(n)であるような、いくつかの定数cが存在し、十分な大きさのn(つまり、一部の場合は_n ≥ n0_)定数_n0_)。
  • f(n) = Ω(g(n))は、c · g(n)f(n)の下限であることを意味します。したがって、すべての_n ≥ n0_について、f(n)が常に≥c · g(n)になるような定数cが存在します。
  • f(n) = Θ(g(n))は、c1 · g(n)f(n)の上限であり、c2 · g(n)f(n)の下限であることを意味します。 _n ≥ n0_。したがって、f(n) ≤ c1 ·g(n)およびf(n) ≥ c2 ·g(n)のような定数_c1_および_c2_が存在します。これは、g(n)f(n)に適切で緊密な境界を提供することを意味します。

私がこれを理解した方法は次のとおりです。

  • O(f(n))は、与えられた関数/アルゴリズムの最悪の場合の複雑さを与えます。
  • Ω(f(n))は、与えられた関数/アルゴリズムの最良の場合の複雑さを示します。
  • Θ(f(n))は、与えられた関数/アルゴリズムの平均的なケースの複雑さを示します。

私が間違っている場合は私を訂正してください。その場合、各アルゴリズムの時間計算量は3つの表記法すべてで表現する必要があります。しかし、私はそれがO、Ω、またはΘのいずれかとして表されていることを観察しました。なぜ3つすべてではないのですか?

31
Xinus

O、Ω、またはΘのいずれの表記も、関数の漸近的成長を表すことを覚えておくことが重要です。本質的にアルゴリズム自体とは何の関係もありません。問題の関数mayは、アルゴリズムの「複雑さ」(実行時間)であり、最悪の場合、最良の場合、または平均的な場合ですが、表記は、関数の出所とは無関係です。

たとえば、関数f(n)= 3n2+5は:

  • オン2)、それもO(n2log n)、O(n3)、 オン4)などですが、O(n)ではありません。
  • Ω(n2)、これもΩ(n log n)、Ω(n)などですが、Ω(n)ではありません。3)。
  • Θ(n2)。 Θ(nでもない2log n)またはΘ(n2/ log n)。

さて、通常、考慮される関数はアルゴリズムの最悪の場合の複雑さであり、3つの表記法が使用されるかどうかは、それについて何を言いたいか、および分析をどれだけ注意深く行うかによって異なります。たとえば、ネストされたループが2つあるため、最悪の場合の実行時間は最大でO(n2)、これが実際にいくつかの入力で達成されるかどうかを気にすることなく。 (通常、それは明らかです。)または、少なくともcn(log n)を必要とする入力がいくつかある必要があるため、ソートの最悪の実行時間はΩ(n log n)であると言えます。ステップ。または、特定のマージソートアルゴリズムを調べて、最悪の場合およびで最大でO(n log n)ステップかかることがわかります。一部の入力ではnlog nステップかかるため、最悪の場合の実行時間はΘ(n log n)です。

上記の3つの例すべてで、分析されたのは同じ(最悪の場合)実行時間であったことに注意してください。代わりに、ベストケースまたはアベレージケースを分析する場合がありますが、ここでも、使用する3つの表記法は、言いたいことによって異なります。つまり、上限、下限、またはタイトバウンドを同じ関数の成長。

36
ShreevatsaR

Θは、漸近的にタイトな上限と下限を示します。

Oは上限を示しますが、この境界は厳密な場合とそうでない場合があります。
oは、厳密ではない上限を示します。

Ωは下限を示しますが、この境界は厳密な場合とそうでない場合があります。
ωは厳密ではない下限を示します。

34
Can Berk Güder

これら3つの意味については、CanBerkGüderの回答を参照してください。

また、ベストケース、ワーストケース、平均ケースとはまったく関係がないことにも注意してください。たとえば、バブルソートはΘ(n)のベストケース(データがすでにソートされている場合はn-1の比較のみが必要なため)であり、Θ(n ^ 2)のワーストケースです。これは、ランダムにシャッフルされた入力を想定したΘ(n ^ 2)平均ケースです。したがって、その平均的なケースもO(n ^ 2)、O(n ^ 3)、およびO(2 ^ n)です。

したがって、O、Θ、およびΩは、それがどのような境界であるかを示します。彼らはあなたに限界が何であるかを教えてくれません。コンテキストでは、それは最良の場合、最悪の場合、平均的な場合、またはアルゴリズム全体(すべての場合)の制限である可能性があります。

もちろん、アルゴリズムにΩ(g)のベストケースがある場合、それ自体がΩ(g)です。 O(g)最悪の場合はO(g)なので、そこには関係があります。しかし、Θ(g)の平均の場合は、ほとんど何もわかりません。最良の場合と最悪の場合。

「どうして3つ全部じゃないの?」。

関数がΘ(g)の場合、それはO(g)およびΩ(g)でもあります。したがって、Θ境界と並んで他の境界を提供する意味はあまりありません。

他の1つだけを見る場合、それは一般に、上限のみを気にするか、下限のみを気にするためです。したがって、すべての比較ソートは必然的にΩ(n log n)ワーストケースであり、バブルソートはO(n ^ 2)ワーストケースですが、O(n)ベストケースであるため、時間の複雑さを完全に説明しようとしているのではなく、特定のコンテキストで気になる範囲を表現しているだけです。

そして、いずれにせよ、ほとんどの人は怠惰なようで、ギリシャ文字を入力する必要はありません。私は私がいることを知っています。したがって、比較ソートは「せいぜいO(n logn)」であるとだけ言います。それは実際には表記法の乱用ですが、それは重要な意味を持ちます。

6
Steve Jessop

これらは本当にあなたを助けるリソースのいくつかです:

6
codaddict

Big-O表記は、nが大きい場合にアルゴリズムのパフォーマンスが大幅に低下しないことを保証するため、アルゴリズムの複雑さと呼ばれることがよくあります。ただし、前に正しく指摘したように、Big-Oは漸近的な評価を提供し、特定の入力が与えられるとアルゴリズムの動作が異なる場合があります。たとえば、配列がすでにソートされている場合、クイックソートはO(n ^ 2)になります。 OTOH、漸近的な状況は、きちんとした実装で実際に改善されるかもしれません。

0
D_K