O(…)とは何ですか。どのように計算しますか?


31

助けて!アルゴリズムまたはコードのBig-Oを分析する必要がある場所について質問があります。

  • Big-Oが何であるか、またはBig-OtaとBig-Thetaまたはアルゴリズムの複雑さを分析するその他の手段にどのように関連するかは正確にはわかりません。

  • Big-Oがコードを実行する時間を指すのか、それとも必要なメモリ量(スペース/時間のトレードオフ)を指すのかわかりません。

  • 私はコンピューターサイエンスの宿題を持っています。そこでは、いくつかのループ(おそらく再帰アルゴリズム)を使用し、そのためのBig-Oを考え出す必要があります。

  • 私は、既知のBig-Oを持つ2つのデータ構造またはアルゴリズムから選択できるプログラムに取り組んでおり、どちらを選択するかわからない。

Big-Oを計算してプログラム、宿題、またはコンピューターサイエンスの一般的な知識に適用する方法を理解するにはどうすればよいですか?

注:この質問は、コミュニティによって決定された他のBig-O質問の標準的なターゲットです。多くのBig-Oの質問に役立つ情報を大量に含めることができるのは、意図的に広いことです。これが広いという事実を、同様の質問が受け入れられることを示すものとして使用しないでください。


1
ただ、この質問はメタで議論されています
エンダーランド

2
始めるのに最適なリソースは、カーンアカデミーコースです(CLRSのトーマスコルメンは作家の1人です)。これは私にとってもCS卒業生としての素晴らしいリソースでした。 khanacademy.org/computing/computer-science/algorithms
スディップバンダリ

3
この質問にフラグを立てる人に:質問の下部にあるサブテキストを読んで、フラグを立てる、または投票に投票する前にそのリンクをたどってください。

回答:


22

O(...)はBig-O表記法を指します。これは、アルゴリズムが何かを行うために必要な操作の数を記述する簡単な方法です。これは時間の複雑さいます

Big-O表記では、アルゴリズムのコストは、多数の場合の最もコストのかかる操作によって表されます。アルゴリズムがステップを踏んだ場合、O(n 3n3 + n2 + n)でます。リスト内の各アイテムをカウントするアルゴリズムは、線形時間と呼ばれるO(n)時間で動作します。

ウィキペディアの名前と古典的な例のリスト:一般的な機能の順序

関連資料:


6
注:ビッグOは本質的に時間やスペース、または特定のものを測定しません。関数の漸近的な成長の上限(定数まで)にすぎません。その関数は、その入力長の関数としてのアルゴリズムの時間、空間などである可能性があり、最も一般的にはCSコンテキストでは時間ですが、必ずしもそうではありません。
モニカを

23

漸近関数とは何ですか?とにかく、漸近線とは何ですか?

サイズ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)-指数(定数mnに引き上げられます)。多くの再帰アルゴリズムおよびグラフアルゴリズムがこのカテゴリに分類されます。

  • Θ(n!)-階乗。特定のグラフおよび組み合わせアルゴリズムは、階乗の複雑さです。

これは、ベスト/アベレージ/ワーストケースと関係がありますか?

いいえ 。Big-Oとその表記法は、特定の数学関数について説明しています。これらは、アルゴリズムの効率を特徴付けるのに役立つ数学ツールですが、ベスト/平均/ワーストケースの概念は、ここで説明する成長率の理論とは無関係です。

アルゴリズムのBig-Oについて話すには、有用な意味で入力の「サイズ」を記述する1つのパラメーターのみを使用して、アルゴリズムの特定の数学モデルにコミットする必要がありますn。しかし、現実の世界では、入力は単なる長さよりもはるかに多くの構造を持っています。これはソートアルゴリズムだった場合、私は文字列で養うことができ"abcdef""fedcba"または"dbafce"。それらはすべて長さ6ですが、そのうちの1つは既にソートされており、1つは逆になっており、最後はランダムな寄せ集めです。入力が既にソートされている場合、一部のソートアルゴリズム(Timsortなど)の方がうまく機能します。しかし、この不均一性を数学モデルにどのように組み込むのでしょうか?

典型的なアプローチは、入力がランダムで確率的な分布から来ると単純に仮定することです。次に、lengthを使用して、すべての入力についてアルゴリズムの複雑度を平均しますn。これにより、アルゴリズムの平均ケース複雑度モデルが得られます。ここから、通常のBig-O /Θ/Ω表記を使用して、平均的なケースの動作を説明できます。

しかし、サービス拒否攻撃が心配な場合は、もっと悲観的にならなければならないかもしれません。この場合、唯一の入力はアルゴリズムに最大の悲嘆を引き起こすものであると仮定する方が安全です。これにより、最悪の場合のアルゴリズムの複雑性モデルが得られます。その後、最悪のモデルのBig-O /Θ/Ωなどについて話すことができます。

同様に、ベストケースモデルに到達するためのアルゴリズムのトラブルが最も少ない入力のみに関心を集中し、Big-O /Θ/Ωなどを調べることもできます。


これは良い答えですが、Big-OとBig-Ωは最悪の場合と最高の場合にはほとんど関係がありません。これらは上限と下限ですが、どちらの場合にも適用できます。たとえば、挿入ソートは、最良の場合、時間の複雑さϴ(n)(Big-OとBig-Ωの両方)を持ち、最悪の場合、時間の複雑さϴ(n²)(Big-OとBig-Ωの両方)。
ポール

また、空のアルゴリズムを除くすべてのアルゴリズムΩ(1)は、最良、最悪、および平均の場合ですが、それは下限であり、アルゴリズムの実際の最良のケースとは関係がないためです。
ポール

どんな場合でも、最高または最悪のケースとは関係ありません。これはよくある誤解です。それらは、決定論的関数が他の関数と比較してより速く、より遅く、または同じ速度で成長するかどうかを述べるための単なる方法です。ベスト/ワーストケースの概念は、実際のアルゴリズムの時間/空間の複雑さについて話し始めた場合にのみ存在します。この場合、非決定的要因が発生し、入力の確率分布を考慮する必要があります。それでも、最良/最悪の場合は、big-O / Omegaに直交する軸にあります。
ラッフルウィンド

@Rufflewindをもっとうまく説明できると思うなら、先に進んでください。これはコミュニティのwikiの答えだということを知っていますか?

「まず、非公式文学では、「Big-O」はしばしばBig-Θの同義語として扱われることに注意してください」->非公式文学だけではありません。大学に戻った私の複雑性の最初の学期は、Big-OがBig-ΘであるかのようにBig-Oの定義を教えてくれました。(私たちの教科書はその定義を使用していました!)Complexity IIに行ったとき、それは私の地獄を混乱させました。
T.サー-復帰モニカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.