有效地查询包含多维数据的B + Tree

时间:2012-09-20 22:52:44

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

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

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

查询示例:

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

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

不可接受的解决方案包括对数据进行顺序扫描,这可能太慢了。

4 个答案:

答案 0 :(得分:2)

我认为,您需求的最合适的数据结构是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章)。

答案 1 :(得分:0)

您是说您不知道如何查询z次序曲线? Wikipedia page描述了您如何进行范围搜索。

z曲线将您的空间划分为嵌套的矩形,其中键中的每个附加位将空间分成两半。要搜索一个点:

Start with the largest rectangle that might contain your point.

    Recursively:

        Create a result set of rectangles    

    For each rectangle in your set        
        If the rectangle is a single point, you are done, it is what you are looking for.
        Otherwise, divide the rectangle in two (specify one additional bit of the z-curve)
            If both halves contain a point
                If one half is better 
                    Add that rectangle to your result set of rectangles
                Otherwise
                    Add both rectangles to your result set of rectangles
            Otherwise, only one half contains a point
                    Add that rectangle to your result set of rectangles

    Search your result set of rectangles

当然,最糟糕的情况表现不佳。您可以通过更改构建z顺序索引的方式来调整它。

答案 2 :(得分:0)

我正在设计一个数据结构,它本质上是一个“堆叠”的B +树(或 d +树,其中 d 是维数)对于多维数据。我相信它非常适合您的数据,并且专为您的用例而设计。

基本理念是:

每个维度都是B +树,并链接到下一个维度的B +树。通常搜索第一维,一旦到达叶子,它就包含一个指向下一个B +树的根的指针,该树属于下一个维度。第二个B +树中的所有内容都属于相同的x值。

原计划只存储每个维度的唯一值及其计数。这采用了一种非常简单的压缩算法(如果你甚至可以称之为),同时仍允许表示整个数据集。这种“链接”维度方案可以允许稍后添加额外的维度,因为它们只是添加到B +树的堆栈中。

2个维度的总插入/搜索/删除时间与此类似:

log b(card(x)) + log b(card(y))

其中 b 是每个B +树的基础,卡(x)将是 x 维度的基数。

我希望这是有道理的。我仍然在努力实现,但是随时可以使用甚至扩充这个想法。

答案 3 :(得分:0)

http://fallabs.com/tokyocabinet/

  

Tokyo Cabinet是一个用于管理数据库的例程库。数据库是一个包含记录的简单数据文件,每个记录都是一对键和一个值。每个键和值都是可变长度的串行字节。二进制数据和字符串都可以用作键和值。既没有数据表的概念,也没有数据类型。记录按哈希表,B +树或固定长度数组进行组织。

     

Tokyo Cabinet是用C语言编写的,并提供为C,Perl,Ruby,Java和Lua的API。 Tokyo Cabinet适用于符合C99和POSIX标准的A​​PI平台。 Tokyo Cabinet是根据GNU宽通用公共许可证授权的免费软件。

你可以轻松嵌入吗?