空間と時間の複雑さを判断するのに問題があります。たとえば、分岐係数bを持ち、最大で深さdを持つツリーがある場合、時間と空間の複雑さをどのように計算できますか?それらがO(b ^ d)とO(bd)であることは知っていますが、私の問題はこれらの値を取得する方法です。
2 に答える
時間
ツリー内のすべてのノードは、ある時点で一度生成する必要があり、ノードを生成するのに一定の時間がかかると想定c
されています (一定の時間は変化する可能性があり、c
任意のノードを生成するための最高の一定の時間を選択できます) 。 . 順序はアルゴリズムによって決定され、ノードを繰り返し展開する必要がなくなります。
nodes b=2 b=3
b^0 * *
/ \ / | \
b^1 * * * * *
/ \ / \ / | \ / | \ / | \
b^2 * * * * * * * * * * * * *
... ...
図でわかるようにc*b^0
、最初のレベルを正確に計算するにはコストがかかりますc
。ツリーの次のレベルにはb^1
ノードが含まれc*b^1 = c*b
、2 番目のレベルを生成するにはコストがかかります。第 3 レベルではb
、第 2 レベルのすべてのノードに対して再びノードが存在します。これは、b*b^1 = b^2$
ノードと のコストを意味しc*b^2
ます。
深さのツリーの最も深いレベルにはノードd
がありb^d
、そのレベルでの作業は ですc*b^d
。この時点までに行われた総作業量は ですc*b^0 + c*b^1 + ... + c*b^d
。複雑さについては、最も急速に上昇する用語のみを見て、定数を削除して、次のようにします。
O(c + c*b + ... + c*b^d) = O(c*b^d) = O(b^d)
.
本質的に: 時間は関数f(d) = SUM(i=1..d){c*b^i}
であり、O(f(d)) = O(b^d)
.
スペース
この図は、 のさまざまな段階でのアルゴリズムを示していますb=3
。*
は現在展開されているノードを?
示し、不明なノードを+
示し、スコアが完全に計算されたノードを示します。
branching factor b = 3 space
* * * * b
/ | \ / | \ / | \ / | \
* ? ? * ? ? + * ? + + * b
/ | \ / | \ / | \ / | \
* ? ? + + * + * ? + + * b
/ | \ / | \ / | \ / | \
* ? ? + * ? + * ? + + * b
ノードのスコアを計算するには、ノードを展開し、子を選択して、深さでリーフ ノードに到達するまで再帰的に展開しますd
。子ノードが完全に計算されると、次の子ノードに進みます。すべてのb
子ノードが計算されると、子ノードに基づいて親スコアが計算され、その時点で子ノードをストレージから削除できます。これは上の図に示されています。ここでは、アルゴリズムが 4 つの異なる段階で示されています。
いつでも 1 つのパスを展開し、c*b
すべての子ノードをすべてのレベルに格納するためのストレージが必要です。ここでも、ノードごとに一定量のスペースが必要であるという前提があります。重要なのは、どのサブツリーもそのルートで要約できることです。パスの最大長は であるため、d
最大限のスペースが必要c*b*d
になります。上記のように、定数項を削除すると、 が得られO(c*b*d) = O(b*d)
ます。
スペースの複雑さは、「このアルゴリズムに割り当てる必要のあるメモリの量」に相当します。時間計算量は、「(抽象的な意味で)実行にかかる時間」に相当します。
分岐係数bと深さdのツリーには、ゼロ番目のレベルに1つのノード、最初のレベルにbノード、2番目のレベルにb * b = b ^ 2ノード、3番目のレベルにb ^ 2 * b = b^3があります。レベルなど。これらの4つのレベル(深さ3)には、1 + b + b ^ 2 + b^3があります。複雑さの観点から、通常は最上位の項のみを保持し、乗算定数を削除します。したがって、スペースの複雑さのためにO(b ^ d)の複雑さになります。
時間計算量では、カウントするのはノードの数ではなく、アルゴリズムが完了するのにかかるループまたは再帰呼び出しの数です(最悪の場合)。
手足に出て、IDDFSについて話していると仮定します。O(b ^ d)とO(bd)がどこから来たのかについての説明は、このwikiの記事でうまく説明されています。