存储快速查询范围的最佳数据结构是什么?

时间:2012-05-18 20:20:54

标签: algorithm data-structures intervals

我遇到这种情况,我有 N 时间轴,每个时间轴都包含块。这些块包含具有特定索引的标记,并且知道它们的最大和最小标记索引。还有一个索引映射块的第一个索引到(时间轴,块)对。这是一个例子:

Timeline 1: [1 2 5 8 9 11] [14 17 18 21] [22 23 25 26] ...
Timeline 2: [3 4 6 7 10 12] [13 15 16 19 20 24] [27 28 34 45] ...

Index:
  1 -> timeline 1, block 1
  3 -> timeline 2, block 1
  13 -> timeline 2, block 2
  14 -> timeline 1, block 2
  22 -> timeline 1, block 3
  27 -> timeline 2, block 3

如您所见,没有遗失的令牌(没有间隙)。

这些数据结构是我最初的。 优化特定令牌索引查询的最佳替代数据结构是什么?我想要检索令牌19.现在我要做的是:在索引中进行二分法搜索以找到好处每个时间轴的块,然后在每个块内进行完整搜索。使用令牌19,二分搜索将产生可以包含19的块(1,2)和(2,2),然后进行完全线性搜索以找到令牌19(由于令牌具有令牌,因此在块内不可进行二分搜索各种尺寸,尚未包含在任何数据结构中。)

谢谢!

编辑:我正在考虑使用包含所有时间轴间隔的间隔树。问题是查询仍会导致许多间隔。另外,与二进制搜索相比,它没有太多优化。

3 个答案:

答案 0 :(得分:0)

你可以有一个 t t 指针指向对象的指针,这些对象包含指向令牌,时间轴和块的指针。如果您可以使用您的语言所喜欢的任何机制来保存数组中的引用。如果您不能在块内进行二进制搜索,我不确定您可以做什么。

答案 1 :(得分:0)

最简单的方法(如果不占用大量内存空间)是创建一个blob值数组,其中index是您的查询标记(在您的示例中为19),值为blob部分与之相对应。数组应该是好的,因为你没有空隙。构造该数组是O(n)并且搜索有O(1)。但是,只有当查询量相对较大时,这才会带来一些好处,因为现有结构也已经很好地优化了。 (实际上应该在这里进行测试,哪种方式更快。)

构建数组:

array = []
foreach ( timeline in timelines ){
  foreach ( block in timeline){
    foreach( token in block ){
      array[token.index] = token.value
    }
  }    
}

如果费用过高,请尝试仅保存令牌的时间轴编号。这样,当查询到来时,您不必搜索每个时间轴。您所要做的就是采用时间轴,二进制搜索块,以及块内的普通向前搜索。

答案 2 :(得分:0)

也许你可以使用稀疏空间填充曲线?当你有索引时,它是一个减少维度的函数。空间填充曲线是相同的,但它也会向索引添加空间信息。空间填充曲线或空间索引的另一种数据结构是四叉树。因此,您可以使用四叉树或kd树进行搜索。