だから、ここに私の小さな問題があります。
それぞれ L <= c 0 ... c n < H の項目を含むバケット a 0 ... a nのリストがあるとします。LとHのリミットを決めることができます。あまり役に立たないとは思いますが、動的に更新することもできます。
バケットの順序は重要です。私は行ってそれらを交換することはできません。
ここで、次のようにこれらのバケットにインデックスを付けたいと思います。
- アイテムの総数を知っている
- i番目の要素を検索できます
- 任意のバケットからアイテムを追加/削除し、インデックスを効率的に更新できます
簡単そうですよね?これらの基準を見て、私はすぐにフェンウィック ツリーについて考えました。それが彼らが本当に意図していることです。
ただし、ユースケースについて考えると、他のいくつかのユースケースが忍び寄ります。
- バケツの数が L を下回った場合、バケツは消える必要があります (まだ項目について心配する必要はありません)。
- バケット数が H に達すると、新しいバケットがいっぱいになるため、新しいバケットを作成する必要があります
フェンウィック ツリーを効率的に編集する方法がわかりません。ツリー全体を再構築せずにノードを削除/追加します...
もちろん、L = 0 に設定して、削除が不要になるようにすることもできますが、アイテムの追加は実際には避けられません。
だからここに質問があります:
このインデックスのより良い構造または Fenwick Tree を更新する方法を知っていますか?
主な関心事は効率です。私はそれを実装する予定があるため、キャッシュ/メモリの考慮事項は心配する価値があります。
背景:
私は、B ツリーやランク付けされたスキップ リストに多少似た構造を考え出そうとしていますが、ローカライズされたインデックスを使用しています。これら 2 つの構造の問題は、インデックスがデータに沿って保持されることです。これは、キャッシュの観点から非効率的です (つまり、メモリから複数のページをフェッチする必要があります)。データベースの実装では、インデックスを実際のデータから分離したままにしておくと、キャッシュが使いやすくなり、効率が向上することが示唆されています。