web-dev-qa-db-ja.com

二分木探索の複雑さ

データ構造内の二分木の順序、後順序、および前順序走査の時間の複雑さは何ですか? O(n)またはO(log n)またはO(n ^ 2)??

33
Mishthi

順序通り、予約順、および順序後の走査は、深さ優先の走査です。

グラフの場合、深さ優先走査の複雑さはO(n + m)です。ここで、nはノードの数、mはエッジの数です。

バイナリツリーもグラフであるため、ここでも同じことが当てはまります。これらの深さ優先の各走査の複雑さはO(n + m)です。

バイナリツリーの場合、ノードから生成できるエッジの数は2に制限されているため、バイナリツリーの合計エッジの最大数はn-1で、nはノードの合計数です。

複雑さはO(n + n-1)、つまりO(n)になります。

79
Vig

O(n)。各ノードを1回走査するため。むしろ-各ノードで行う作業量は一定です(残りのノードに依存しません)。

26
Vilx-

O(n)、と言います。私はすべての樹木に適用可能なバランスのとれた樹木のためにやっています。再帰を使用すると仮定すると、

T(n) = 2*T(n/2) + 1 ----------> (1)

左のサブツリーの場合はT(n/2)、右のサブツリーの場合はT(n/2)、ベースケースを検証する場合は '1'。

Simplifying(1)では、トラバース(順序順、事前順、または後順)が順序O(n)であることを証明できます。

8
rajiv_

Travesalは、任意の順序でO(n)です。各ノードを1回押すためです。ルックアップは、O(n)ツリーには、ある種の整理スキーマ(つまり、バイナリ検索ツリー)があります。

5
Assaf

前書き

こんにちは

今日、クラスでこの質問をされましたが、それは良い質問です!ここで説明し、できれば間違った箇所についてより正式な回答をレビューまたは修正してほしい。 :)

以前の回答

@Assafによる観測も正しいです。これは、バイナリツリートラバーサルが再帰的に移動して各ノードに1回ずつアクセスするためです。

しかし、これは再帰的なアルゴリズムであるため、多くの場合、実行時のパフォーマンスを分析するためにより高度な方法を使用する必要があります。順次アルゴリズムまたはforループを使用するアルゴリズムを扱う場合、多くの場合、合計を使用するだけで十分です。したがって、好奇心がある人のためのこの分析のより詳細な説明は次のとおりです。

再発

前述のように、

T(n)= 2 * T(n/2)+ 1

ここでT(n)は、トラバーサルアルゴリズムで実行された操作の数です(順序、順序、順序は違いはありません。

再発の説明

2つのT(n)があります。これは、インオーダー、プレオーダー、およびポストオーダーのトラバーサルがすべて、左および右の子ノードで自分自身を呼び出すためです。したがって、各再帰呼び出しをT(n)と考えてください。言い換えると、** left T(n/2) + right T(n/2) = 2 T(n/2) **。「1」は、ノード値の出力など、関数内の他の定数時間操作から取得されます(正直なところ、1または任意の定数と漸近的な実行時間である可能性がありますそれでも同じ値に計算されます。説明は次のとおりです。

分析

この再発は、マスターの定理を使用して大きなシータを使用して実際に分析できます。そこで、ここで適用します。

T(n)= 2 * T(n/2)+定数

ここで、constantは何らかの定数です(1またはその他の定数)。

マスターズの定理 を使用すると、T(n)= a * T(n/b)+ f(n)が得られます。

したがって、a = 2、b = 2、f(n) = constantsincef(n)= n ^ c = 1、次にc = 0 sincef(n )は定数です。

ここから、a = 2 andb ^ c = 2 ^ 0 = 1。だから、a> b ^ cまたは2> 2 ^ 0。だから、c <logb(a)または0 <log2(2)

ここからT(n) =BigTheta(n ^ {logb(a)})= BigTheta(n ^ 1)= BigTheta(n)

BigTheta(n)に慣れていない場合は、O(n)に「似ている」(私に耐えてください)が、「より厳しい」またはより厳しいランタイムの近似値。したがって、BigTheta(n)は両方ともワーストケースO(n)とベストケースBigOmega(n)ランタイム。

これがお役に立てば幸いです。気を付けて。

2
jerome

T(n)= 2T(n/2)+ c

T(n/2)= 2T(n/4)+ c => T(n) = 4T(n/4)+ 2c + c

同様にT(n) = 8T(n/8)+ 4c + 2c + c

....

....

最後のステップ... T(n) = nT(1)+ c(0からhまでの2の累乗の合計(木の高さ)))

複雑さはO(2 ^(h + 1)-1)

ただし、h = log(n)

したがって、O(2n-1)= O(n)

0
GiridharaSPK