所以,这是我的小问题。
假设我有一个桶列表 a 0 ... a n分别包含 L <= c 0 ... c n < H 项目。我可以决定 L 和 H 的限制。我什至可以动态更新它们,尽管我认为这不会有太大帮助。
桶的顺序很重要。我不能去交换它们。
现在,我想索引这些存储桶,以便:
- 我知道物品的总数
- 我可以查找第 i 个元素
- 我可以从任何存储桶中添加/删除项目并有效地更新索引
看起来很容易吧?看到这些标准,我立即想到了一棵芬威克树。这就是他们真正的意义所在。
但是,当您考虑用例时,会出现一些其他用例:
- 如果桶数低于 L,桶必须消失(不要担心项目)
- 如果存储桶计数达到 H,则必须创建一个新存储桶,因为该存储桶已满
我还没有弄清楚如何有效地编辑 Fenwick 树:删除/添加节点而不重建整个树...
当然,我们可以设置 L = 0,这样删除就变得不必要了,但是添加项目并不能真正避免。
所以这是一个问题:
您是否知道该索引的更好结构或如何更新 Fenwick 树?
主要关注的是效率,因为我确实计划实现它缓存/内存考虑值得担心。
背景:
我正在尝试提出一种类似于 B-Trees 和 Ranked Skip Lists 但具有本地化索引的结构。这两种结构的问题是索引是沿着数据保存的,这在缓存方面效率低下(即您需要从内存中获取多个页面)。数据库实现表明,将索引与实际数据隔离开来对缓存更友好,因此效率更高。