web-dev-qa-db-ja.com

アルゴリズムの最悪の場合の実行時間の上限と下限

アルゴリズムの分析について学んでいます。アルゴリズムの最悪の場合の実行時間の概念を理解しています。

しかし、アルゴリズムの最悪の場合の実行時間の上限と下限は何ですか?

アルゴリズムの最悪の場合の実行時間の上限が同じアルゴリズムの最悪の場合の実行時間の下限と異なる例は何でしょうか?

12
Amulya Khare

関数f(n)の場合、g(n)上界big O )であり、「十分に大きいn」の場合、f(n)<=c*g(n)、定数cの場合です。 [gがfを支配する]
g(n)は下限大きなオメガ )「十分に大きいn」の場合はf(n) >= c*g(n)、定数cの場合。 [fがgを支配する]

g(n)f(n)の上限と下限の両方である場合[異なるcを使用]、g(n)はf(n) [ビッグシータ]の厳密な境界であると言います。

タイトなものの代わりに上限の例を使用しますフィボナッチ 再帰的アルゴリズムのように、タイトな境界を見つけるのが難しい場合があります。したがって、O(2 ^ n)の簡単な上限を簡単に見つけることができます。詳細については、この 投稿 の回答をご覧ください。

9
amit

これを例で説明しましょう:

クイックソートの最悪の実行時間はTheta(n^2)です。したがって、有効な下限はOmega(n)になり、上限はO(n^3)になります。これは、最悪のシナリオでは、クイックソートに少なくとも線形時間と最大立方時間かかることを示しています。

これはあまり正確なステートメントではありませんが、より複雑なアルゴリズムの場合、そのようなステートメントが私たちにできる最善の方法です。

1
tskuzzy

まず、事例についてお話しましょう。 case of input for algorithmは、instance of a problemに関連付けられています。ソートの問題(特定の順序でセットの順列を見つけたい場合)については、数値のセット{1、5、4、2、6}のようなインスタンスを見ることができます。この一連の数値は、選択ソートなどのソートの問題を解決することを目的としたソートアルゴリズムへの入力、または 他のソートアルゴリズム のいずれかです。

同じ入力のセットを、問題を解決したい任意のアルゴリズムに与えることができます。どのソートアルゴリズムを使用するかは関係ありません。入力のセットは常に同じです(定義上、これらはすべて同じ問題のインスタンスであるため)。ただし、特定のケースは、特定のアルゴリズムに対して良くも悪くもなります。一部のアルゴリズムは、入力が何であっても常に同じように動作しますが、一部のアルゴリズムは一部の入力で悪化する可能性があります。ただし、これは、すべてのアルゴリズムにいくつかの最良のケースといくつかの最悪のケースがあることを意味します。また、平均的なケース(すべてのケースの平均を取ることによる)または予想されるケース(1つのケースが他のケースよりも一般的であると予想する何らかの理由がある場合)について話すこともあります。

アルゴリズムの事例

「ソートされていないリストの最小値を見つける」という問題は、考えられるすべての入力に対して常に同じように機能します。どんな巧妙なアルゴリズムを書いても、すべての要素をチェックする必要があります。ゼロのリスト、乱数のリスト、または最初の要素が最小であるリストがあるかどうかは関係ありません。最後に到達するまでわかりません。そのアルゴリズムではすべてのケースが同じであるため、最良のケースは最悪のケースであり、平均的なケースと予想されるケースでもあります。リストがソートされていれば、もっとうまくいく可能性がありますが、それは別の問題です。

「リスト内の特定の要素を見つける」という問題は異なります。リストを直線的にウォークスルーするアルゴリズムを使用しているとすると、指定された要素がリストの最初の要素であることが判明し、すぐに完了する可能性があります。ただし、それがリストの最後の要素である場合もあります。その場合、リストを見つける前にすべてを歩く必要があります。つまり、最良のケースと最悪のケースがありました。

入力サイズの関数としてのアルゴリズム

アルゴリズムを分析したいとき、私たちアルゴリズム学者は、アルゴリズムで投げることができるすべての可能なケースについて考えます。通常、最も興味深い2つのケースは、最良のケースと最悪のケースです。アルゴリズムランタイムをその入力の関数と考える場合、最良の場合は関数を最小化する入力であり、最悪の場合は関数を最大化する入力です。ここでは、代数の数学的な意味で「関数」を使用しています。線を引く一連のx/yペア(入力/出力ペア、この場合は「入力サイズ/実行ステップ数」)です。

アルゴリズムの実行時間はその入力の関数であるため、可能な入力サイズごとに異なるベストケース(およびワーストケース)があります。そのため、最良のケースを単一の入力として扱うこともありますが、実際には入力のセットです(入力サイズごとに1つ)。最良の場合と最悪の場合は、特定のアルゴリズムに関して非常に具体的なものです。

境界

では、境界についてはどうでしょうか。境界は、特定のアルゴリズムの関数と比較するために使用する関数です。考えられる境界関数は無数にあります。グラフには何種類の線を描くことができますか?それが境界関数の数です。ほとんどのアルゴリズム担当者は通常、定数関数、線形関数、対数関数、指数関数など、いくつかの特定の関数にのみ関心があります。

上限は、別の関数の上にある関数です。下限は、他の関数の下にある関数です。 BigOとBigOmegaについて話すとき、境界が常に他の関数の上にあるか下にあるかは関係ありません。特定のポイントの後は常にそうです(入力サイズが小さいとアルゴリズムがおかしくなることがあるため)。

任意の関数には無限の数の可能な上限があり、任意の関数には無限の数の可能な下限があります。しかし、これは、さまざまなサイズの無限大について話している奇妙な時期の1つです。上限であるためには、関数が他の関数の下にあってはならないので、他の関数の下にある無限の数の関数を除外します(したがって、すべての可能な関数のセットよりも小さくなります)。

もちろん、上限が無限にあるからといって、それらがすべて役立つとは限りません。関数f(∞)はすべての関数の上限ですが、それは「私は無限のドル数未満です」と言っているようなものです。私が無一文であるか億万長者であるかを判断するのに特に役立ちません。そのため、「タイト」な上限(「最小上限」または「上限」とも呼ばれます)に関心があることがよくありますが、これ以上の上限はありません。

ベスト/ワーストケース+下界/上界

アルゴリズムのランタイム関数の上位関数と下位関数を表す最良/最悪のケースがあります。他の関数の上または下に(それぞれ)ある可能性のある他の関数を表す上限と下限があります。これらを組み合わせて、アルゴリズムに関する重要なアイデアを明確にすることができます。

最悪の場合の下限:アルゴリズムの実行時間を最大化する入力がアルゴリズムに与えられた場合に、アルゴリズムの実行時関数の下の境界となる関数。

最悪の場合の上界:アルゴリズムの実行時間を最大化する入力がアルゴリズムに与えられたときに、アルゴリズムの実行時関数の上の境界となる関数。

ベストケースの下限:アルゴリズムの実行時間を最小化する入力がアルゴリズムに与えられた場合に、アルゴリズムの実行時関数より下の境界となる関数。

ベストケースの上限:アルゴリズムの実行時間を最小化する入力がアルゴリズムに与えられた場合に、アルゴリズムの実行時関数の上の境界となる関数。

ケースバウンドの例

これらのそれぞれに気を配る時期の具体例を挙げましょう。

最悪の場合の下限:ここでの典型的な例は、比較ベースの並べ替えです。これは、最悪の場合、Ω(n log(n))として有名です。どのアルゴリズムを考案しても、最悪の場合の入力のセットを選択できます。これにより、最も厳しい下限関数は対数線形になります。最悪の場合の限界を超えるアルゴリズムを作成することはできません。わざわざ試してはいけません。それは仕分けの地下室です。もちろん、最悪の場合には多くの下限があります。定数、線形、および劣線形はすべて下限です。ただし、対数線形の下限が最も厳しいため、これらは有用な下限ではありません。

ベストケースの下限挿入ソート リストをウォークスルーし、リストにある順序が正しくないものを適切な場所に挿入することで機能します。リストがソートされている場合、挿入を行わずにリストを1回だけウォークスルーする必要があります。これは、最良の場合の最も厳しい下限がΩ(n)であることを意味します。リスト(線形時間)をウォークスルーできる必要があるため、正確性を犠牲にすることなく、それ以上のことはできません。ただし、最良の場合の下限は、最悪の場合の下限よりも優れています。

最悪の場合の上限:最悪の場合にアルゴリズムがどれだけうまく実行できないかがわかるため、最悪の場合の厳密な上限を見つけることに関心があることがよくあります。挿入ソートの最悪のケースは、完全に順序が狂っている(つまり、正しい順序から完全に逆になっている)リストです。新しいアイテムを見つけるたびに、それをリストの先頭に移動し、後続のすべてのアイテムを前方にプッシュする必要があります(これは線形時間演算であり、線形回数実行すると2次動作になります)。ただし、この挿入動作は、最悪の場合はO(n2)であり、最悪の場合の厳密な上限として機能します。これは素晴らしいことではありませんが、上限よりも優れています。たとえば、指数または階乗の境界です。もちろん、これらは最悪の場合の有効な上限ですが、2次が厳密な上限であることを知るほど有用ではありません。

ベストケースの上限:アルゴリズムが最良の時間に実行できる最悪の事態は何ですか?リスト内の要素を見つける前の例では、最初の要素が目的の要素でしたが、上限はO(1)です。最悪の場合、それは線形でしたが、最良の場合、起こり得る最悪の事態は、それがまだ一定であるということです。私の意見では、この特定のアイデアは通常、最悪の場合の上限ほど重要ではありません。なぜなら、私たちは通常、最良の場合ではなく、最悪の場合に対処することに関心があるからです。

これらの例のいくつかは、実際には、OとΩだけでなく、Өです。他の場合には、タイトではないが、それでも有用であるのに十分近似している下限または上限関数を選択することができました(タイトでない場合は、そこから引き出すための無限の井戸があることを忘れないでください!)。組み合わせにはさまざまな有用性があるため、さまざまなケース/バインドされた組み合わせの説得力のある例を見つけるのは難しい場合があることに注意してください。

誤解と用語

多くの場合、これらの定義について 誤解のある人 が表示されます。実際、多くの完全に優れたコンピューターサイエンティストは、これらの用語を大まかに同じ意味で使用します。ただし、ケースと境界の概念は明確であり、それらを確実に理解することをお勧めします。これは、違いがあなたの日々に現れることを意味しますか?いいえ。ただし、いくつかの異なるアルゴリズムから選択する場合は、ケースと境界についての詳細を読みたいと思います。彼らのアルゴリズムにはO(1)のベストケース上界があると言っている人は、おそらくあなたの目に羊毛を引っ張ろうとしているでしょう-ワーストケース上界が何であるかを彼らに尋ねてください!

1