web-dev-qa-db-ja.com

n個の異なる要素にわたる二分探索木の数

N個の異なる要素からいくつの二分探索木を構築できますか?そして、数学的に証明された式をどのように見つけることができますか?

例: 3つの異なる要素、たとえば1、2、3がある場合、5つの二分探索木があります。

Binary search trees over elements 1, 2, 3

15
siddstuff

N個の要素が与えられると、それらの要素から作成できる二分探索木の数は、n番目で与えられます カタラン数 (Cで示されます)n)。これは等しい

enter image description here

直感的に、カタラン数は、次の方法で作成されたn個の要素から構造を作成できる方法の数を表します。

  • 要素を1、2、3、...、nのように並べ替えます。
  • ピボット要素として使用する要素の1つを選択します。これにより、残りの要素が2つのグループに分割されます。要素の前にあるグループと後のグループです。
  • これらの2つのグループから構造を再帰的に構築します。
  • これらの2つの構造を、削除した1つの要素と組み合わせて、最終的な構造を取得します。

このパターンは、n個の要素のセットからBSTを構築する方法と完全に一致します。ツリーのルートとして使用する要素を1つ選択します。小さい要素はすべて左に移動し、大きい要素はすべて右に移動する必要があります。そこから、左右の要素から小さなBSTを構築し、それらをルートノードと融合して全体的なBSTを形成できます。 n個の要素でこれを行うことができる方法の数はCによって与えられますn、したがって、可能なBSTの数は、n番目のカタラン数で与えられます。

お役に立てれば!

41
templatetypedef

この質問は、数式を使って数えるだけではないと確信しています。少し時間を取って、プログラムとその計算の背後にある説明やアイデアを書きました。

再帰と動的計画法の両方でそれを解決してみました。お役に立てれば。

式は前の回答にすでに存在しています:

したがって、ソリューションの学習とアプローチの理解に興味がある場合は、いつでも私の記事を確認できます N個の一意の要素から作成されたバイナリ検索ツリーを数える

9
dharam

T(n)をn個の要素のbstの数とします。

1からnまでの番号が付けられたn個の異なる順序付けられた要素が与えられた場合、ルートとしてiを選択します。

これにより、(1..i-1)がT(i-1)の組み合わせの場合は左側のサブツリーに残り、(i + 1..n)がT(n-i)の組み合わせ。

したがって:

T(n) = sum_i=1^n(T(i-1) * T(n-i))

そしてもちろんT(1) = 1

1
Andrew Tomazos