正式な定義を検討してください:
f(n) = O(g(n))
なぜそうではないのですか:
f(n) = O(f(n))
または
f(n) = O(c*f(n))
big O分析では、f(n)=2n
とg(n)=n
は同じですか?
別の関数を使用している関数f(n)
に混乱しています。
なぜ次のような定義ではないのですか?
f(n) <= c*abs(g(n))
正式なO(g(x))
は定義に何を追加しますか?複雑すぎるようです。
これは非常に奇妙な定義であり、実際には私にとっては新しいものです。バックマンとランダウによって定義されたシンボルは、そのように定義されていません。
残念ながら、ドイツのウィキペディアが唯一の情報源です。現時点では正確にこれを見つけることができますが、あまり翻訳しなくてもわかると思います。 次のように定義されます 。
(注意: フランス語版ウィキペディア には次のような同様の定義があります f(n)はf)とはまったく異なるものであるため、間違っていると思いますが、基本的に同じことを述べていると思います。
別の質問への回答で説明したように、 Oは「順序」を意味します 、つまりO(g)は実際にはすべての関数のセットであり、 gと同じ順序。次のように言うのは意味があります。
そのため、(形式化の楽しい部分である)ニッチピッキングのために、批判する定義が実際に間違っていると言えるでしょう。
Wikipedia には、大きなO表記の正式な定義があります。あれは:
f(x) = O(g(x))
正の実数Mと実数x0が存在する場合に限り、
|f(x)| <= M * |g(x)| for all x > x0
Big-Oh表記は、2つの関数f
とg
を関連付けるために使用されます。したがって、定義には2つの関数が必要です。
私たちが書くとき
_f(n)=O(g(n))
_
we 定義しない関数f
(すでに知られている)であり、_=
_は「等しい」という意味ではありません。この表記は、「f(n)
は(ある意味で)g(n)
以下である」、またはセットが好きな場合は「f(n)
はセットO(g(n))
"に属しています。
それは言った:
_f(n) = O(f(n))
f(n) = O(n*f(n))
_
両方とも常に trueです。
別の関数を使用して関数f(n)を定義することに混乱しています
混乱しないでください、それは実際にはかなり単純です。大きなO表記は不等式です。つまり、f(n)の複数の上限を見つけることができ、それでも正しいので、f(n) = O(f(n))正解ですが、f(n)によっては、表現しようとしているものではないことがよくあります。
それは成長率の尺度です。 f(n) = 2nはf(n) = nより速く成長しません。両方の成長は線形です。
f(n) = O(n*f(n))
私はあなたが2番目のnが定数cであることを意味したと仮定します。
Big Oの定義により、この定数はすでに不等式にあります。したがって、通常のf(n)がBig O(g(n))と等しい場合、実際にはabs(f(n)) <= c * abs(g(n))
と記述します。 Big Oの定義、不等式はすでにそれを処理しており、g(n)はf(n)の上限と見なされるため、定数係数を見つけることができれば、それについて言及する必要はありません。 )。
たぶん、一般的な言い回しがあなたを助けることができます:f(n) = O(g(n))は、関数f
がg
、ただし定数係数c
を除いて。
Big oh状態の正式な定義を参照してください。f(n)= O(g(n))は、0 <= f(n)<= cg(n)(n> = k)となる正の定数cおよびkがあることを意味します。
これは、任意のn> = kのf(n)の値が、g(n)に定数を掛けた値以下)であることを意味します。両方のケースをカバーします。
この定義で言いたいのは、関数g(n)は、常にf(n)以上)が存在するということです。特定のn。f(n)には、超えられない特定の制限があることがわかります。これは、特定のプログラムがそのプログラムよりも時間がかかることはないことを示しているため、BigOh表記の本質的な必要性です。大きなああ表記。
Jpalecekが言ったように、f(n)= O(g(n))表記はセットを意味し、f(n)はセットO(g(n)に属します)。これは集合O(g(n))に属します。そのため、BigOh分析には2つの関数が必要です。
f(n)= O(f(n))は些細なステートメントです。基本的にはx = xであり、f(n)から情報を取得しません。 = O(f(n))。Big-O表記の要点は、複雑な関数をはるかに単純な関数と比較して、その長期的な動作をよりよく理解することです。