web-dev-qa-db-ja.com

O(log n)+ O(log n)= O(n)ですか?

バイナリ検索はBig O表記でO(log n)をとることがわかっていますが、O(log n)のアルゴリズムを2回実行する必要がある場合、同じになりますO(n)時間の複雑さとして?

たとえば、重複してソートされた配列内の数値の最初の出現を計算する方法と、最後の出現を計算する別の方法があるとします。どちらの方法も実行にO(log n)が必要なので、最後に両方の方法を使用して配列内の特定の数の発生数を知りたい場合はO(2 log n)、そうですか? O(2 log n)O(n)以下であると推測できますか?

5
Walter R

いいえ、O(log n) + O(log n)O(n)ではありません。まだO(log n)です。 big-O式に定数を掛けた場合、 掛けた定数なしの値と同じ になります。そう:

_O(k * g) = O(g)
_

ここで、kは定数の非ゼロ係数であり、gは境界関数です。

O(log n)演算は、nで表される、入力のサイズの対数(底は定数係数に寄与する)に比例した数のステップを実行する演算です。同じbig-O順序の複数の演算がある場合、同じようにそれらを追加して、O(2 * log n)のようなものを作成できますが、big-O表記は定数の乗法因子に関係しません。したがって、2を無視してO(log n)を記述します。

一定の要因を考慮しない理由* 入力サイズに基づいてアルゴリズムが成長する可能性を調査しているということです。正確なステップ数の計算には使用せず、ステップ数がどのように増加するかを確認するだけです。

数学的に抽象化されていない例を示すために、いくつかの実数を見てみましょう。 O(log n)時間で実行され、正確にlogを取るアルゴリズムがあります2(n)ステップ。サイズ8の入力で1回実行するメソッドがあります。完了するには3つのステップが必要です。これを2回実行する別の方法があるため、完了するには6つのステップが必要です。ただし、これは重要な比較ではありません。 成長について知りたい。入力サイズ16で最初のメソッドを再度実行します。完了するには4ステップ、+ 33%多いステップが必要です。入力サイズ16で2番目のメソッドを実行します。完了するには8ステップかかります+ 33%追加のステップ。ステップ数は異なりますが、関数間の成長は同じであることがわかります。 成長率は、何回呼び出されてもO(log n)です、そして、私たちが興味を持っているのは、成長率です。


* また、成長率の低いバウンディング関数部分についても考慮していないため、O(n + log n)O(n)と同等です。

14
cbojar

O(log n)とO(2 log n)はどちらもO(n)のサブセットです。また、どちらもO(log n)と等しくなります。

O(log n)はsetであることを覚えておく必要があります。これは(非公式に)「f(x)より速く成長しないすべての関数のセットです。ログx "。したがって、次のすべてが当てはまります

  • O(log n) = O(2 log n)
  • O(log n) ⊂ O(n)
  • O(2 log n) ⊂ O(n)
  • ∀f:f∈O(2 log n)⇒f∈O(n)

O(g)の定義に関数を挿入することで簡単に確認できます。

残念ながら、これに関しては、表記法の乱用がたくさんあります。たとえば、f∈O(g)は、意味がなくてもf = O(g)と書かれることがよくあります。fは関数、O(g)は関数のセット。 Appleを一連のリンゴと等しくすることはできません。同様に、実際に意味するのはO(f) often O(g)である場合、しばしばO(f) = O(g)と書かれます。そして最後に、人々は時々f(n) = 2nはO(n)の要素であるがO(n²)の要素ではないと主張することがありますが、これは誤りです。 O(n)はO(n²)のサブセットであるため、O(n)にある関数はすべてO(n²)にもあります。

5
Jörg W Mittag

Nの値が大きい場合、Big O表記では定数は無視されます。

したがって

O(log n)+O(log n)=O(2log n)->O(log n)

0
Temp Id