この場合の木のような多くの種類の組み合わせオブジェクトをカウントするために、組み合わせオブジェクトの構築方法の説明からそのようなカウントを機械的に導出できる強力な数学ツール(シンボリックメソッド)があります。これには、関数の生成が含まれます。
優れた参考文献は、故フィリップフラジョレットとロバートセッジウィックによる分析的組み合わせ論です。上記のリンクから入手できます。
故ハーバート・ウィルフの本生成機能学はもう一つの無料の情報源です。
そしてもちろん、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±1−4z2−−−−−−√2z
ここで、ニュートンの(一般化された)二項定理が必要です。
(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)=1−1−4z−−−−−√2z
係数利回りの抽出
[zn]B(z)=1n+1(2nn).
クラスおよびは、内部ノードを持つバイナリツリーには個のリーフがあり、合計でノードがあるため、カウントに同意します。ABnn+12n+1
最後のケースでは、もう少し努力する必要があります。
これは、空でないプルーニングバイナリ試行の説明です。これを
CD={∙}∪({∙}×C)∪({∙}×C)∪({∙}×C×C)={ϵ}∪({∙}×C×C)
生成関数で書き換えます
C(z)D(z)=z+2zC(z)+zC2(z)=1+zC2(z)
二次方程式を解く
C(z)D(z)=1−2z−1−4z−−−−−√2z=1−1−4z−−−−−√2z
そして再び取得
[zn]C(z)=1n+1(2nn)n≥1[zn]D(z)=1n+1(2nn)n≥0
ことに注意してくださいカタロニア生成機能があります
E(z)=1−1−4z−−−−−√2
一般的な木のクラスを列挙します。これは、ノードの次数に制限のないツリーです。
E={∙}×SEQ(E)
「一般的な木のクラスのオブジェクトは、一般的な木の空のシーケンスが続くノードです。」
E(z)=z1−E(z)
ラグランジュ-Bürmann反転式我々が得ます
[zn]E(z)=1n+1(2nn)
そのため、一般的なツリーがバイナリツリーと同じ数だけあることを証明しました。一般木と二分木の間に全単射があるのも不思議ではありません。全単射は回転対応(リンクされた記事の最後に説明されています)として知られ、すべての一般的なツリーを2進ツリーとして2つ保存できます。
クラスで左と右の兄弟を区別しない場合、さらに別のクラスのツリー得られることに注意してください。CT
単項二分木。
生成関数もあります
ただし、それらの係数は異なります。モッツキン数取得し
T={∙}×SEQ≤2(T)
T(z)=1−z−1−2z−3z2−−−−−−−−−−√2z
[zn]T(z)=1n∑k(nk)(n−kk−1).
ああ、関数の生成が気に入らない場合は、他にも多くの証明があります。ここを参照してください。バイナリツリーのエンコーディングをDyckワードとして使用し、再帰定義から再帰を導出できるものがあります。その後、その再発を解決することも答えを与えます。ただし、シンボリックメソッドを使用すると、組み合わせオブジェクトの設計図を直接操作できるため、最初に繰り返しを思い付くことがなくなります。