可能性のある複製:
Θ(n)とO(n)の違いは何ですか?
私は人々がアルゴリズムの複雑さについて非公式に話すとき、彼らはビッグオーについて話すように思えます。しかし、正式な状況では、時々ビッグオーがスローされるビッグシータをよく目にします。2つの違いは数学的にはわかりますが、英語では、ビッグシータを意味するときにビッグオーを使用する状況間違っている、またはその逆(アルゴリズムの例はありがたい)
おまけ:なぜ人々は非公式に話すとき、どうやら常に大物を使うのでしょうか?
Big-Oは上限です。
Big-Thetaは厳密な境界、つまり上限and下限です。
起こりうる最悪の事態のみを心配する場合は、big-Oで十分です。つまり、「これ以上悪化することはない」と書かれています。もちろん、バウンドがきつくなるほど良いのですが、きついバウンドを計算するのは必ずしも簡単ではありません。
ウィキペディアからの次の引用もいくつかの光を投げかけています。
非公式に、特にコンピューターサイエンスでは、Big O表記法は、Big Theta表記法を使用することが特定のコンテキストでより実際に適切である場合に、漸近的なタイトな境界を記述するために多少乱用されることがよくあります。
たとえば、関数
T(n) = 73n
を検討する場合3+ 22n
2+ 58
、次のすべてが一般的に許容されますが、通常、バウンドの緩さ(つまり、以下の箇条書き2および3)は、バウンドの緩み(すなわち、以下の箇条書き1)よりも強く推奨されます。
T(n) = O(n
100)
、これはT(n) ∈ O(n
と同じです100)
T(n) = O(n
3)
、これはT(n) ∈ O(n
と同じです3)
T(n) = Θ(n
3)
、これはT(n) ∈ Θ(n
と同じです3)
同等の英語のステートメントはそれぞれ次のとおりです。
T(n)
はn
よりも速く漸近的に成長しません100T(n)
はn
よりも速く漸近的に成長しません3T(n)
はn
のように漸近的に成長します3。したがって、3つのステートメントはすべて真実ですが、徐々に多くの情報がそれぞれに含まれています。ただし、一部のフィールドでは、成長が遅い関数がより望ましいため、Big O表記(上のリストの箇条書き番号2)がBig Theta表記(上のリストの箇条書き番号3)よりも一般的に使用されます。
私は数学者であり、アルゴリズムの複雑さだけでなく、ビッグO、ビッグシータ、ビッグオメガの表記法を何度も見て、必要としてきました。人々が言ったように、ビッグシータは両面バウンドです。厳密に言えば、それはアルゴリズムがどれだけうまくできるか、そのアルゴリズムはより良くできないか、またはアルゴリズムはより良くできないということを説明したいときに使うべきです。たとえば、「ソートには最悪の場合の入力に対してΘ(n(log n))比較が必要」と言う場合、すべての入力に対してO(n(log n))比較を使用するソートアルゴリズムがあることを説明しています。 ;そして、すべてのソートアルゴリズムについて、Ω(n(log n))の比較を強制する入力があります。
現在、人々がΩの代わりにOを使用する1つの狭い理由は、最悪または平均的なケースに関する免責事項を削除することです。 「ソートにはO(n(log n))比較が必要です」と言った場合、ステートメントは良好な入力に対しても当てはまります。もう1つの狭い理由は、Xを実行する1つのアルゴリズムに時間がΘ(f(n))かかっても、別のアルゴリズムの方がうまくいく可能性があるため、X自体の複雑さはO(f(n))としか言えないからです。
しかし、人々が非公式にOを使用するより広い理由があります。人間レベルでは、反対側が文脈から「明らか」であるときに常に両側の声明を出すのは苦痛です。私は数学者なので、「雨が降った場合にのみ傘を取ります」または「4つのボールをジャグリングできますが5つはできません」と言うのではなく、雨」または「4つのボールをジャグリングできます」。しかし、そのような記述の他の半分は、明らかに意図されているか、明らかに意図されていないことがよくあります。当たり前のことをだらしないのは人間の本性です。髪を分割するのはわかりにくいです。
残念ながら、数学やアルゴリズムの理論などの厳しい分野では、髪の毛を分割しないことも混乱します。 ΩまたはΘを言う必要がある場合、人々は必然的にOを言うでしょう。詳細が「明らか」であるためにスキップすると、常に誤解が生じます。そのための解決策はありません。
私のキーボードにはOキーがあるためです。
ΘキーまたはΩキーはありません。
ほとんどの人は同様に怠zyで、Θを意味するときはOを使用するのではないかと思う。
大きなOがそれほど使用される理由の1つは、Oが非常に使用されるためです。多くの人がこの表記を見て思考彼らはそれが何を意味するかを知っており、それを自分で(間違って)使用しています。これは、正式な教育がこれまでにしか行われていないプログラマーでよく起こります-私はかつて自分自身を罪にしました。
もう1つの理由は、ほとんどのギリシャ語以外のキーボードで大きなシータよりも大きなOを入力する方が簡単だからです。
しかし、私は多くが一種の妄想のためだと思います。私は少しの間、防衛関連のプログラミングで働いていました(そして、当時のアルゴリズム分析についてはほとんど知りませんでした)。そのシナリオでは、最悪の場合のパフォーマンスは常に人々が興味を持っているものです。なぜなら、その最悪の場合はちょうど間違った時に起こるかもしれないからです。その発生の実際の確率がたとえば船の乗組員全員が同じ瞬間に突然の心臓発作に襲われる可能性よりもはるかに少ない-それはcouldまだ起こる。
もちろん、非常に一般的な状況では多くのアルゴリズムの最悪のケースがあります-典型的な例は、バイナリリンクにインオーダーを挿入して、実質的に単一リンクリストを取得することです。平均パフォーマンスの「実際の」評価では、さまざまな種類の入力の相対的な頻度を考慮する必要があります。
おまけ:なぜ人々は非公式に話すとき、どうやら常に大物を使うのでしょうか?
Big-ohでは、このループは次のとおりです。
for i = 1 to n do
something in O(1) that doesn't change n and i and isn't a jump
はO(n), O(n^2), O(n^3), O(n^1423424)
です。 big-ohは単なる上限であり、厳密な境界を見つける必要がないため、計算が容易になります。
上記のループはonlybig-theta(n)
です。
エラトステネスのふるい の複雑さは何ですか? O(n log n)
と言った場合、間違いはないでしょうが、それも最良の答えではありません。 big-theta(n log n)
と言った場合、あなたは間違っているでしょう。
なぜなら、ベストケースが速いアルゴリズムがあるため、技術的には大きなシータではなく、大きなOです。
Big Oは上限であり、Big Thetaは等価関係です。
ここには多くの良い答えがありますが、何かが欠けていることに気付きました。ほとんどの答えは、人々がビッグシータよりもビッグOを使用する理由は難易度の問題であり、場合によってはこれが真実である可能性があることを暗示しているようです。多くの場合、Big Thetaの結果につながる証拠は、Big Oの結果よりもはるかに複雑です。これは通常当てはまりますが、これは、ある分析を他の分析よりも使用することに大きな関係があるとは思いません。
複雑さについて話すとき、私たちは多くのことを言うことができます。ビッグOの時間の複雑さは、上限内で実行するために保証されるアルゴリズムを教えてくれます。 Big Omegaについてはあまり議論されておらず、アルゴリズムの実行が保証される最小時間、つまり下限を教えてくれます。現在、Big Thetaは、これらの数値の両方が実際に与えられた分析に対して同じであることを教えてくれます。これは、アプリケーションの実行時間が非常に厳密であり、複雑さよりも漸近的に小さい値だけ逸脱できることを示しています。多くのアルゴリズムには、漸近的に等価な上限と下限がありません。
したがって、Big Thetaの代わりにBig Oを使用することは技術的に常に有効ですが、Big Oの代わりにBig Thetaを使用することはBig OとBig Omegaが等しい場合にのみ有効です。たとえば、挿入ソートの時間の複雑さはn ^ 2でBigОですが、その最良のシナリオでは、Big Omegaがnになります。この場合、時間の複雑さはnまたはn ^ 2のビッグシータであると言うのは正しくありません。これらは2つの異なる境界であり、そのように扱う必要があるためです。
私はビッグシータを見ましたが、学校の違いを教えられたと確信しています。私はそれを調べなければなりませんでした。これはウィキペディアが言うことです:
Big Oは、関数を比較するために最も一般的に使用される漸近表記法ですが、多くの場合、Big Oは漸近的により厳密な境界のためにBig ThetaΘに置き換えられます。
公式に話すときに人々がBig-Oを使用する理由はわかりません。おそらく、ほとんどの人がBig-ThetaよりBig-Oに精通しているからでしょうか?あなたが私に思い出させるまで、Big-Thetaが存在することさえ忘れていました。記憶がリフレッシュされたので、会話でそれを使用することになります。 :)