2


0

10個の要素があり、空のツリーで始まる場合、big-O表記で10個の要素を赤黒に挿入する複雑さは何ですか?

要素を挿入するたびに要素の適切な位置を検索し、先祖ノードと子ノード間で一連のローテーションを実行する必要があるため、O(log 10)を超えることはありませんか。 それで、もし私がN個の要素を持っていて赤黒木にN回挿入するなら、それはそれをO(n log n)にしないでしょうか?

助けてくれてありがとう。

3 Answer


9


O(10)はO(1)またはO(128291)とまったく同じであるため、big-Oを定数(1を除く)と組み合わせて使用​​することは絶対にありません。

それでは、最初に空のRBツリーにK個の項目を挿入することの最大の利点を見てみましょう。 最初の挿入は一定時間なので、O(1)と呼びます。 X個のアイテムがあるときに挿入すると、X 1stがO(log(X))になります(各ステップを下に回転させる必要がある場合でも、log(X)に比例した最悪のケースです。なぜなら、「層」の数、すなわち「レベル」は、Xと対数的にしか成長しないからである。なぜなら、KレベルのRBツリーは、2のK乗で成長するノードの数を有するからである。

そのため、Xのlog(X)の2からNまで(プラスコスタント)の合計を求めます。これは偶然Nの階乗の対数に等しくなります。 スティルリングの近似式によると、それはN log(N) - Nについてです。


2


@Justiceと@Alexが実際に注目しているのは、複雑さを表すO(f(N))尺度が制限的な振る舞いについて話すことです(例: Nが無限大になる傾向があるので、実行する時間、比較の数、何でも。

彼らは、あなたがNに特定の値を代入した場合、「O」という用語はもはや意味がなくなると言っています。

彼らがしなかったというもう一つのポイントがあります。 つまり、Nが小さいときに何が起きるのかを伝えるためにO(…​)記法の文を使うことはできません。 定義上、 "big O"表記は、その場合に何が起こるかについてあなたに何も伝えません。

これは単なる歩兵ではありません。 例えば、コスト関数「F(N)= 1,000,000 * N N 2」は「O(N 2)」ですが、最初の項は1,000未満のNの値に対して支配的です。 この場合、推定量として `O(N ** 2)`測度を使おうとすると、まったく間違った答えを得るでしょう。


1


単一の要素をRBツリーに挿入することの時間的な複雑さは、 `O(log n)`です。

したがって、空のRBツリーにn個の要素を挿入することの時間的複雑さは、O(n log n)である。

空のRB木に「10」個の要素を挿入することの時間的複雑さは一定であり、すなわち「O(1)」である。 ツリーが空から始まり、挿入される要素の数が固定されているため、ここには可変要素はありません。