二分木を数える


28

(私は数学的な背景を持つ学生で、特定の種類の二分木の数を数える方法を知りたいです。)

バイナリツリーの Wikipediaページを見ると、サイズルート化バイナリツリーの数はこのカタロニア語番号であるというこの主張に気付きました: C_n = \ dfrac {1} {n + 1} {2n \ choose n}n

Cn=1n+1(2nn)

しかし、私は自分でそのような結果をどのように思い付くことができるのか理解できませんか?この結果を見つける方法はありますか?

さて、サブツリーの順序(左、右)が考慮されない場合はどうなりますか?たとえば、私の観点から、これら2つのツリーは同じであると考えています。

   /\   /\
  /\     /\

同様の方法を適用して、これらのオブジェクトのうち正確にnノードを持つオブジェクトの数をカウントすることは可能でしょうか?


ポリアの根付き2進木の定理はここに適用できますか?
ニコラス

回答:


35

この場合の木のような多くの種類の組み合わせオブジェクトをカウントするために、組み合わせオブジェクトの構築方法の説明からそのようなカウントを機械的に導出できる強力な数学ツール(シンボリックメソッド)があります。これには、関数の生成が含まれます。

優れた参考文献は、故フィリップフラジョレットとロバートセッジウィックによる分析的組み合わせ論です。上記のリンクから入手できます。

故ハーバート・ウィルフの本生成機能学はもう一つの無料の情報源です。

そしてもちろん、GKPによるコンクリート数学は宝庫です。


バイナリツリーの場合、次のようになります。まず、ツリーの明確な定義が必要です。

バイナリツリーは、すべての非リーフノードが次数2を正確に持っているルート付きツリーです。

次に、ツリーのサイズと呼ぶものに同意する必要があります。

ここに画像の説明を入力してください

左側では、すべてのノードが等しくなっています。中央では、葉と非葉を区別します。右側には、葉が削除された剪定された二分木があります。2つのタイプ(左と右)の単項ブランチがあることに注意してください!

次に、これらの組み合わせオブジェクトがどのように構築されるかの説明を導き出す必要があります。二分木の場合、再帰的な分解が可能です。

してみましょう、その後象徴我々が持っている第一のタイプのすべてのバイナリ木の集合であります: Aここに画像の説明を入力してください

「バイナリツリーのクラスのオブジェクトは、ノードまたはノードとそれに続く2つのバイナリツリーのいずれかです。」これは、セットの方程式として記述できます。

A={}({}×A×A)

組み合わせオブジェクトのこのクラスを列挙する生成関数を導入することにより、セット方程式を生成関数を含む方程式に変換できます。A(z)

A(z)=z+zA2(z)

すべてのノードを均等に扱い、ツリー内のノードの数をそのサイズの概念として採用するという選択は、変数ノードを「マーク」することで表されます。z

我々は今、二次方程式を解くことができるのためにとを取得、生成関数の明示的な閉形、二つの溶液、通常どおり。zA2(z)A(z)+z=0A(z)

A(z)=1±14z22z

ここで、ニュートンの(一般化された)二項定理が必要です。

(1+x)a=k=0(ak)xk

及び級数に生成関数バックの閉形式を展開します。これを行うのは、係数がサイズ組み合わせオブジェクトの数であり、通常はとして記述されるためです。しかし、ここではツリーの「サイズ」の概念により、係数を探す必要があります。二項関数と階乗を少し調整した後、次の結果が得られます。a=1/2x=4z2znn[zn]A(z)z2n+1

[z2n+1]A(z)=1n+1(2nn).

サイズの2番目の概念から始めると、再帰的分解は次のようになります。

ここに画像の説明を入力してください

組み合わせオブジェクトの異なるクラスを取得します。「バイナリツリーのクラスのオブジェクトは、リーフまたは2つのバイナリツリーが後に続く内部ノードです。」B

同じアプローチを使用して、を変換できます。。今回だけ、変数はリーフではなく内部ノードのみをマークします。これは、「サイズ」の定義がここでは異なるためです。異なる生成関数も取得します。B={}({}×B×B)B=1+zB2(z)z

B(z)=114z2z

係数利回りの抽出

[zn]B(z)=1n+1(2nn).

クラスおよびは、内部ノードを持つバイナリツリーには個のリーフがあり、合計でノードがあるため、カウントに同意します。ABnn+12n+1

最後のケースでは、もう少し努力する必要があります。

ここに画像の説明を入力してください

これは、空でないプルーニングバイナリ試行の説明です。これを

C={}({}×C)({}×C)({}×C×C)D={ϵ}({}×C×C)

生成関数で書き換えます

C(z)=z+2zC(z)+zC2(z)D(z)=1+zC2(z)

二次方程式を解く

C(z)=12z14z2zD(z)=114z2z

そして再び取得

[zn]C(z)=1n+1(2nn)n1[zn]D(z)=1n+1(2nn)n0

ことに注意してくださいカタロニア生成機能があります

E(z)=114z2

一般的な木のクラスを列挙します。これは、ノードの次数に制限のないツリーです。

E={}×SEQ(E)

「一般的な木のクラスのオブジェクトは、一般的な木の空のシーケンスが続くノードです。」

E(z)=z1E(z)

ラグランジュ-Bürmann反転式我々が得ます

[zn]E(z)=1n+1(2nn)

そのため、一般的なツリーがバイナリツリーと同じ数だけあることを証明しました。一般木と二分木の間に全単射があるのも不思議ではありません。全単射は回転対応(リンクされた記事の最後に説明されています)として知られ、すべての一般的なツリーを2進ツリーとして2つ保存できます。

クラスで左と右の兄弟を区別しない場合、さらに別のクラスのツリー得られることに注意してください。CT

ここに画像の説明を入力してください

単項二分木。 生成関数もあります ただし、それらの係数は異なります。モッツキン数取得し

T={}×SEQ2(T)
T(z)=1z12z3z22z
[zn]T(z)=1nk(nk)(nkk1).

ああ、関数の生成が気に入らない場合は、他にも多くの証明があります。ここを参照してください。バイナリツリーのエンコーディングをDyckワードとして使用し、再帰定義から再帰を導出できるものがあります。その後、その再発を解決することも答えを与えます。ただし、シンボリックメソッドを使用すると、組み合わせオブジェクトの設計図を直接操作できるため、最初に繰り返しを思い付くことがなくなります。


SedgewickとFlajoletの「Introduction to the Analysis of Algorithms」(aofa.cs.princeton.edu)は、「Analytic Combinatorics」の本と同じ内容を多くカバーしていますが、よりアクセスしやすい形式であることに注意してください。
フォンブランド

7

関数の生成は非常に強力で非常に便利な魔法の杖です。最初の質問に対する次の解決策(ツリーがある理由)は、やや魔法的ではありません。したがって、かわいい。Cn

例。ツリーを生成するために我々が順序で開始したノード発生した回、そして起こる回。たとえば、。最小の(および負の可能性のある)合計を持つ接頭辞のうち、最も長いものを選択します。この場合、。このプレフィックスを先頭から取得し、末尾に配置します。この場合、ます。次に、を、をます。この場合、を取得します。先頭からを削除し、追加し5+15+115+++++++++++++++++TETTETETTETEETE最後に; この場合、を取得しTETETTETEEEます。これはツリーの説明ですT(E,T(E,T(T(E,T(E,E)),E)))。以下に、これが全単射である理由の説明があります。それを確信したら、カウントは簡単です。あるの配列我々はで割った、、我々は可能な巡回置換のいずれかを選んだからです。(5+65)±15+6

最初の全単射。MLのツリーの一般的な定義は次のとおりですtype tree = T of tree * tree | E。つまり、ツリーには2つの(順序付けられた)サブツリーがあるか、空です。ツリーの構築方法は次のとおりT(T(E,E),T(T(E,E),T(E,E)))です。綿毛を落として、私たちは単に書くことができますTTEETTEETEE。そのような説明はすべてで終わるEため、冗長ですTTEETTEETE。(空の木が現在空の文字列に相当する。)これらの文字列は、各プレフィックスは、少なくともESとして多くTsと有すること性質を有しており、合計で彼らが持っている Tsとエスを、のノードの数でありますツリー。nnn

2番目の全単射。Tを+1に、Eを-1に置き換えます。したがって、値が+1で、値が-1で、すべての接頭辞合計を持つシーケンスを見ています。nn0

3番目の全単射。ここで、プレフィックスの要件を少し変更します。空でない各プレフィックスの合計がになるようにし。これを可能にするために、値を+ 1、値を-1にします。(それ以外の場合、文字列全体の合計は0になり、プレフィックスの条件を満たすことができません。)これらのシーケンスは+1で始まる必要があります。したがって、最初に+1がスタックしていることを除いて、実際は以前と同じです。>0n+1n

ラネープロパティ。シーケンスをしばらく忘れて、合計が1 である整数 、、有限シーケンスを検討します。すべての空でないプレフィックスが正の合計を持つ場合、このシーケンスの循環置換は同じプロパティを持ちません。どうして?さて、もすべての空でないプレフィックスが正であるようながあるとします。次に(から始まるシーケンスのプロパティ)および(から始まるシーケンスのプロパティ); したがって、x1xmk1xk,,xm,x1,,xk1x1++xk11x1xk++xm1xkx1++xm2、これはシーケンス全体の合計が1であるという仮定に矛盾します。

さらに、合計が1であるシーケンスが与えられた場合、空でないすべてのプレフィックスに正の合計を持たせる循環順列が常に存在します。(これは実数でも当てはまります。)

結論。次に、木を含む全単射にある+1と-1のシーケンスをカウントしましょう。個の数字のうち、に等しいを選択する必要があります。その他は-1になります。ありますそうする方法を。ただし、これまでにカウントされたシーケンスのうちだけが正のプレフィックスを持っています。したがって、ルート化され、順序付けられたバイナリツリーの数は次のとおりです。2n+1n+1(2n+1n+1)12n+1

12n+1(2n+1n+1)=12n+12n+1n+1(2nn)=1n+1(2nn)

非常に良い答えですが、次のステートメントにはいくつかの説明が必要です:「合計が1のシーケンスがある場合、空でないプレフィックスすべてが正の合計を持つ循環順列が常に存在する」....少なくとも証明のヒントはいいね
vog

1
@vog:合計が最小のプレフィックスを取得し、末尾に移動します。
rgrig

1
@vog:同じ最小合計を持つ複数のものがある場合、それは最長のプレフィックスであるべきです。最初に例を追加するために回答を編集しました。
rgrig
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.