B+ ツリーを実装する必要があります。
そして、次のメソッドを作成する必要があります。
- 挿入 (x) - 0 (log_t(x))。
- 検索 - 検索成功 - O(log_t(x))。検索の失敗 - O(1) {可能性が高いフード}
そこで、Insert(x) の実装から始めました。葉がいっぱいになるたびに、それを 2 つの別々の葉に分割したいと考えています。中央値キー以下のキーを持つ 1 つのリーフには、中央値よりも高い値を持つキーが含まれます。
実行時間を損なうことなく、この中央値を見つけるにはどうすればよいですか?
私は考えました:
- 内部ノードと葉のそれぞれをより小さな B+ ツリーとして表しますが、中央値は、ツリーが完全にバランスが取れている場合にのみルート (またはルート内の要素の 1 つ) になります。
- 内部ノードと葉のそれぞれを二重にリンクされたリストとして表します。入力が挿入されている間に中央値キーを取得しようとしていますが、それで動作しない入力があります。
- 配列として表すと中間になるかもしれませんが、それを分割すると、キーを新しい配列に挿入するには少なくとも O(n/2) が必要です。
私に何ができる?
検索については、アイデア的には、成功した検索と失敗した検索の違いは、葉の検索に関するものですが、キーがツリーにあるかどうかを判断するために、ツリーのさまざまなキーを「実行」する必要があります。では、どうすれば O(1) になるのでしょうか?