algorithm - 高效查询持有多维数据的 B+ 树

标签 algorithm data-structures multidimensional-array b-tree

我有一组构成我的数据集的 64 位整数元组 (x,y)。比如说,我有数万亿个这样的元组;将数据集保存在地球上任何机器的内存中都是不可行的。但是,将它们存储在磁盘上是很合理的。

我有一个磁盘存储(B+ 树),允许在单个维度中快速、并发地查询数据。但是,我的一些查询依赖于这两个维度。

查询示例:

  • 找到 x 大于或等于某个给定值的元组
  • 找到 x 尽可能小的元组 s.t. y 大于或等于某个给定值
  • 找到 x 尽可能小的元组 s.t. y 小于或等于某个给定值
  • 执行维护操作(插入一些元组,删除一些元组)

我发现最好的选择是 Z 顺序曲线,但我似乎无法弄清楚如何根据我的二维数据集进行查询。

Not Acceptable 解决方案包括数据的顺序扫描,这可能太慢了。

最佳答案

我认为,最适合您要求的数据结构是 R-tree及其变体(R*-tree、R+-tree、Hilbert R-tree)。 R-tree类似于B+-tree,但也允许多维查询。

其他相关的数据结构是优先搜索树。它适用于您的示例 1 .. 3 之类的查询,但如果您需要频繁更新或磁盘存储,则效率不高。详情见this paper或者这本书:"Handbook of Data Structures and Applications" (第 18.5 章)。

关于algorithm - 高效查询持有多维数据的 B+ 树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12522070/

相关文章:

php - 获取给定字符串的唯一 8 位数字

javascript - 树结构未按预期构建

arrays - append() 如何在导致这种情况的幕后工作?

c++ - 我不知道如何存储表示为字符串的大量大数字

arrays - Kotlin 中二维数组的展平迭代器

c - 如何对二维数组中的元素求和?

algorithm - A* 搜索算法的最坏情况是什么?

algorithm - 计算在基于瓦片的游戏中哪些瓦片被点亮 ("raytracing")

数组比较(逐个元素)

Javascript:如何通过顶级索引删除二级数组?