コンピュータサイエンスにおいて、最適二分探索木(Optimal BST)は、重みバランス二分木とも呼ばれ、[ 1 ]与えられたアクセスシーケンス(またはアクセス確率)に対して最小の検索時間(または期待検索時間)を提供する二分探索木です。最適BSTは一般的に静的と動的の2種類に分類されます。
静的最適性問題では、ツリーは構築後に変更できません。この場合、与えられたアクセス確率に対して最小の期待探索時間を提供する、ツリーのノードの特定の配置が存在します。要素のアクセス確率に関する情報に基づいて、静的に最適なツリーを構築または近似するためのさまざまなアルゴリズムが存在します。
動的最適性問題では、ツリーはいつでも変更可能であり、通常はツリーの回転を許可することによって変更されます。ツリーは、ルートから始まるカーソルを持ち、それを移動したり、変更を実行したりできるものとみなされます。この場合、カーソルがターゲットアクセスシーケンス内のすべてのノードを順番に訪問するような、これらの操作の最小コストシーケンスが存在します。スプレッドツリーは、動的に最適化されたツリーと比較して、すべての場合において一定の競争比率を持つと推測されていますが、これはまだ証明されていません。
Knuth [ 2 ]によって定義された静的最適性問題では、n個の順序付き要素の集合と、確率。要素を次のように表します。を通してそして確率を通してそしてを通して。要素の検索が行われる確率は(または検索成功)。[ 3 ]、要素の検索が行われる確率はそして(または検索失敗)、[ 3 ]要素の検索が行われる確率は、、 そして要素の検索が行われる確率は、。 これら確率は考えられるすべての検索を網羅しているため、合計すると1になります。
静的最適性問題は、与えられた条件の下で期待探索時間を最小化する二分探索木を見つける最適化問題です。確率。n個の要素の集合上の可能な木の数は[ 2 ]これはnに対して指数関数的であるため、総当たり探索は通常実行可能な解決策ではありません。
1971年、クヌースは、静的に最適な木をわずかO ( n² )の時間で構築できる比較的単純な動的計画法アルゴリズムを発表した。 [ 2 ]この研究において、クヌースは1958年にエドガー・ギルバートとエドワード・F・ムーアによって導入された動的計画法アルゴリズムを拡張および改良した。[ 4 ]ギルバートとムーアのアルゴリズムは、時間と空間があり、検索の失敗確率のみを考慮する最適な二分探索木の構築(最適なアルファベット木問題[ 5 ]として知られる)の特定のケース用に設計されています。クヌースの研究は、次の洞察に基づいていた。静的最適性問題は最適部分構造を示す。つまり、ある木が与えられた確率分布に対して静的に最適であれば、その左部分木と右部分木も、それぞれの分布の適切な部分集合に対して静的に最適でなければならない(根の単調性として知られている)。
これを理解するには、クヌースが「重み付きパス長」と呼ぶ木のものを考えてみましょう。n個の要素を持つ木の重み付きパス長は、すべての要素の長さの合計です。考えられる探索経路を、それぞれの確率で重み付けしたグラフ。重み付けされた経路長が最小となる木が、定義上、静的に最適である。
しかし、重み付きパス長には興味深い性質があります。二分木の重み付きパス長を E、左部分木の重み付きパス長をE L 、右部分木の重み付きパス長をE Rとします。また、W を木内のすべての確率の合計とします。いずれかの部分木が根に接続されると、その各要素(したがって各探索パス)の深さが 1 増加することに注意してください。また、根自体の深さは 1 であることにも注意してください。これは、木とその 2 つの部分木の間の重み付きパス長の差が、木内のすべての確率の合計と正確に一致することを意味し、次の漸化式につながります。
この反復により、自然な動的計画法による解が得られます。a iとa jの間のすべての値に対する静的に最適な探索木の重み付きパス長を とします。その木の総重量をとし、はルートのインデックスとする。アルゴリズムは以下の式を用いて構築できる。
このアルゴリズムの単純な実装では実際にはO ( n³ )の時間が必要ですが、Knuthの論文には、 O ( n² )の時間しかかからない修正アルゴリズムを作成するために使用できる追加の観察が含まれています。
クヌースは、動的計画法アルゴリズムに加えて、ほぼ最適な二分探索木を生成するための2つのヒューリスティック(またはルール)を提案した。ほぼ最適な二分探索木を研究する必要があったのは、クヌースのアルゴリズムの時間計算量と空間計算量が、かなり大きい。[ 6 ]
クヌースの法則は、以下のように解釈できる。
クヌースのヒューリスティクスは、ほぼ最適な二分探索木を実装しています。時間と空間。クヌースのヒューリスティクスが最適値からどれだけ離れているかについての分析は、カート・メルホルンによってさらに提案された。[ 6 ]
Knuthのアルゴリズムが要するO ( n² )の時間は、総当たり探索に必要な指数関数的な時間よりも大幅に優れているものの、ツリー内の要素数が非常に多い場合には、実用的とは言えないほど遅い。
1975年、クルト・メルホルンはクヌースのルールに関する重要な性質を証明する論文を発表した。メルホルンの主な結果は、クヌースのヒューリスティックのうち、ほぼ最適な二分探索木を生成するのはルールIIのみであるというものである。一方、ルート最大ルールは、次の単純な議論に基づいて、非常に「悪い」探索木につながることが多い。[ 6 ]
させて
そして
重み付き経路長を考慮すると前述の定義に基づいて構築されたツリーについては、以下のようになります。
したがって、ルート最大ルールによって得られるツリーは、右側のみで成長するツリー(ツリーの最深レベルを除く)となり、左側には常に終端ノードが存在する。このツリーのパス長は、また、バランスのとれた探索木(パスが制限されている)と比較すると、)は、同じ周波数分布に対して著しく劣ったパフォーマンスを示すだろう。[ 6 ]
さらに、メーホルンはクヌースの研究を改良し、ルールIIを使用するはるかに単純なアルゴリズムを導入し、静的に最適なツリーのパフォーマンスをわずかでほぼ近似した。時間。 [ 6 ]このアルゴリズムは、左と右のサブツリーの合計重みを(確率的に)最もバランスのとれるように木のルートを選択することで、二分ルールと同じ考え方に従います。そして、この戦略は各サブツリーに再帰的に適用されます。
この戦略が優れた近似値を生成することは、任意のパスに沿った部分木の重みが幾何級数的に減少する数列に非常に近いものを形成することに注目すれば直感的に理解できる。実際、この戦略によって生成される重み付きパスの長さは最大で
ここで、H は確率分布のエントロピーです。最適な二分探索木は重み付きパス長よりも優れた結果を出すことは決してないため、
この近似は非常に正確である。[ 6 ]
すべての値がゼロの場合、最適な木は時間内に見つけることができますこれは、1971 年にTC HuとAlan Tuckerが発表した論文で最初に証明されました。後に Garsia と Wachs によって簡略化されたGarsia–Wachs アルゴリズムは、同じ比較を同じ順序で実行します。このアルゴリズムは、各葉の最適な高さを持つ木を構築するために貪欲アルゴリズムを使用し、順序がバラバラになっているため、同じ高さの別の二分探索木を構築することで機能します。[ 7 ]
以下のコードスニペットは、キーのセットと、そのキーが検索キーである確率値が与えられた場合に、最適な二分探索木を決定します。
public static float calculateOptimalSearchTree(int numNodes, float[] probabilities, int[][] roots) { float[][] costMatrix = new float[numNodes + 2][numNodes + 1]; for (int i = 1; i <= numNodes; i++) { costMatrix[i][i - 1] = 0; costMatrix[i][i] = probabilities[i]; roots[i][i] = i; roots[i][i - 1] = 0; } for (int diagonal = 1; diagonal <= numNodes; diagonal++) { for (int i = 1; i <= numNodes - diagonal; i++) { int j = i + diagonal; costMatrix[i][j] = findMinCost(costMatrix, i, j) + sumProbabilities(probabilities, i, j); // 注: roots[i][j] の代入がありません。これを修正する必要があります。 // ツリーを再構築します。 } } return costMatrix[1][numNodes]; }動的最適性にはいくつかの異なる定義があり、実行時間に関しては定数係数を除いて実質的にすべて同等です。[ 8 ]この問題は、スレーターとタージャンがスプレッドツリーに関する論文で暗黙的に最初に導入しましたが、[ 9 ]デメインらはそれを非常に優れた形式的な形で記述しています。[ 8 ]
動的最適性問題では、キー 1, ..., n に対するアクセスのシーケンス x 1 , ..., x mが与えられます。各アクセスに対して、BST のルートへのポインタが与えられ、そのポインタを使用して以下のいずれかの操作を実行できます。
(アクセス中にツリーを再配置する4番目の操作が存在するため、これは動的最適性問題となる。)
各アクセスにおいて、ポインタが最終的に目的値 x iを含むノードに到達する限り、BST アルゴリズムは上記の操作の任意のシーケンスを実行できます。特定の動的 BST アルゴリズムが一連のアクセスを実行するのにかかる時間は、そのシーケンス中に実行される操作の総数に等しくなります。任意の要素セットに対する任意のアクセスシーケンスが与えられた場合、それらのアクセスを実行するために必要な操作の総数は最小値となります。私たちはこの最小値に近づけたいと考えています。
アクセスシーケンスが正確に何であるかを事前に知らなければ、この「神のアルゴリズム」を実装することは不可能ですが、アクセスシーケンス X に対して実行する操作の数として OPT(X) を定義することができ、任意の X に対して、アルゴリズムが時間O (OPT(X))で X を実行する場合(つまり、一定の競争比を持つ場合)、アルゴリズムは動的に最適であると言えます。[ 8 ]
この性質を持つと推測されるデータ構造はいくつか存在するが、いずれも証明されていない。このモデルにおいて動的に最適なデータ構造が存在するかどうかは未解決の問題である。
スプレッドツリーは、1985年にダニエル・スレーターとロバート・タージャンによって考案されたバイナリサーチツリーの一種で、標準的なサーチツリー操作が実行されます。償却時間。[ 10 ]必要な意味で動的に最適であると推測されている。つまり、スプレーツリーは、十分に長いアクセスシーケンス X を O(OPT(X)) の時間で実行すると考えられている。[ 9 ]
タンゴツリーは、2004年にErik D. Demaine、Dion Harmon、John Iacono、およびMihai Pătrașcuによって提案されたデータ構造であり、十分長いアクセスシーケンスXを時間内に実行できることが証明されています。これは動的に最適ではないが、競争比率はn の妥当な値に対しては、依然として非常に小さい。[ 8 ]
2013年、ジョン・イアコノは、バイナリサーチツリーの幾何学を利用して、バイナリサーチツリーアルゴリズムが動的に最適であれば動的に最適となるアルゴリズムを提供する論文を発表しました。 [ 11 ]ノードは2次元の点として解釈され、最適なアクセスシーケンスは、それらの点の最小の樹状充足スーパーセットです。スプレーツリーやタンゴツリーとは異なり、イアコノのデータ構造は、アクセスシーケンスステップごとに定数時間で実装できることが知られていないため、動的に最適であっても、他のサーチツリーデータ構造よりも非定数係数で遅くなる可能性があります。
インターリーブ下限は、動的最適性の漸近的な下限である。