回答:
ワーキングセットプロパティを持つバイナリ検索ツリーを探しているようです。これは、動的最適性よりも少し弱いです。実際、2013年6月のIaconoの「動的最適性の推測の追求」によると、動的最適性を持つ既知のバイナリ検索ツリーはありません。
しかし、より単純なワーキングセットプロパティを探している場合は、運がいいです。ワーキングセットプロパティは、アイテムにアクセスする時間は、が最後にアクセスされてからアクセスされたアイテムの数のログに比例することです。
ワーキングセットプロパティにはさまざまな構造があります。バイナリツリーであるものさえあり、償却ケースだけでなく、対数の最悪のケースの境界とワーストケースのワーキングセットプロパティの両方に適合します:Bose et alの「Layered Working-Set Trees」。
私はあなたがあなたのデータ構造で何を達成したいのかよくわかりません。確かに、スプレーツリーはクールなデータ構造です。それらは静的最適性特性を持つことが知られています。つまり、事前に検索クエリの分布を知っていて、この分布に最適なバイナリ検索ツリーを構築した場合、スプレイツリー(分布を知らなくても)は、バイナリ検索ツリーと同様に漸近的に実行されます。もちろん、二分探索木は再調整できないため、これは不正行為と言えるかもしれませんが、それでも非常に印象的な特性です。人々はまた、スプレイツリーが自己調整データ構造(動的最適推論として知られている)と同じくらい優れていることを期待していますが、これはデータ構造の領域で最も顕著な未解決の問題の1つです。
質問に戻ります。スプレイツリーは静的に最適であるため、何かを犠牲にする必要があります。これは、低い確率で要素にアクセスする場合、より拡張的な操作を実行する必要があることを意味します。ただし、要素が要求されることはめったにないため、これは正当化されます。静的な最適データ構造はすべてこの動作を示します。もちろん、いつでもバランスのとれた二分探索木を使用できますが、静的な最適性は失われます。
この手順はどうですか(静的BSTでのみ機能します)。
すべてのノードで、そのノードをルートとするサブツリーに存在する別のノードへのポインターを維持します。ポインタとともに、ポイントされているノードのレベル番号も(レベル番号とともに)維持します。ルートはレベル0であり、ツリーを下に行くにつれてレベルが高くなります。最初は、ノードのポインターはノード自体を指しています。不変条件は、ノードのレベル番号以下のレベルのノードのみを指すことです。
ツリーで要素を検索すると、次のいずれかになります。
1. Be found at its location in the BST, or
2. Be found along a path to its location because some node along the node to root path has a pointer to this node, or
3. Not be found at all.
どちらの場合も、最初にノードを見つけるためにフォワードパスを作成し、見つかった場合は、見つかったノードのルートからノードへのパスに沿って、ポイントされたノードをバブリングします。ケース2の結果としてノードが見つかった場合は、ターゲットノードを指しているノードまでバブルダウンするだけです(これにより、最近アクセスしたノードをすばやく検索できます)。
ノードがノード自体よりも高いレベルまでバブリングされる場合は、そのノードをマッピングセットから削除します。
マッピングのないノードにアクセスする場合は、そのノードの新しいマッピングを作成し、ノードに存在するマッピングを置き換えるように設定して、徐々にバブルアップします。
ノードがアクセスされると、そのノードは一番上まで泡立ちます。