この回答は、質問に対する私のコメントの一部を組み合わせて展開します。
赤黒木の部分範囲操作は、最悪の場合のO(log n)時間で実行できます。ここで、nは元のツリーの要素の数です。結果のツリーは元のツリーといくつかのノードを共有するため、このアプローチは、ツリーが不変である場合(またはツリーは変更可能ですが、元のツリーは不要になった場合)にのみ適しています。
最初に、サブレンジ操作は2つの分割操作で実装できることに注意してください。ここで、分割操作は赤黒ツリーTとキーxを取り、Lがxより小さいTのすべての要素とRがxより大きいTの要素で構成されるような2つのツリーLとRを生成します。したがって、今の目標は、最悪の場合のO(log n)時間で赤黒木に分割操作を実装することです。
O(log n)時間に赤黒木で分割操作を実行するにはどうすればよいですか?さて、よく知られた方法があることがわかりました。(私はそれを知りませんでしたが、私は、データ構造のない専門家ではありません。)考えてみましょう参加 Lのすべての値がRのすべての値よりも小さくなるように、2つのツリーのLとRを取り、から成る木を生成し、操作し、すべてのLおよびRの値。結合操作は最悪の場合に実装できますO(| r L −r R | +1)、ここでr Lおよびr RそれぞれLとRのランク(つまり、ルートから各リーフへのパス上の黒いノードの数)です。分割操作は、結合操作をO(log n)回使用することで実装でき、合計の最悪の場合の時間は、テレスコープの合計を考慮すると、まだO(log n)です。
Tarjanの本[Tar83]のセクション4.1および4.2は、最悪の場合の時間O(log n)で赤黒木に結合および分割操作を実装する方法を説明しています。これらの実装は元のツリーを破壊しますが、ノードを変更する代わりにコピーすることにより、それらを不変の機能的な実装に簡単に変換できます。
サイドノートとして、Objective CamlのSetおよびMapモジュールは、(不変の)バランスの取れたバイナリ検索ツリーでの分割操作と他の標準操作を提供します。それらは赤黒木を使用しませんが(左高さと右高の差が最大2であるという制約のある平衡二分探索木を使用します)、実装を調べることも有用です。これがSetモジュールの実装です。
参照資料
[Tar83]ロバート・エンドレ・タージャン。 データ構造とネットワークアルゴリズム。1983年、SIAMの応用数学におけるCBMS-NSF地域会議シリーズの第44巻。