【问题标题】:What is the best data structure to store ranges for fast queries?存储快速查询范围的最佳数据结构是什么?
【发布时间】:2012-05-18 20:20:53
【问题描述】:

我有这种情况,我有 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(这里不可能在块内进行二分搜索,因为令牌有各种大小,尚未包含在任何数据结构中)。

谢谢!

编辑:我正在考虑使用包含所有时间线间隔的间隔树。问题是查询仍然会产生许多间隔。另外,与二分搜索相比,它并没有优化太多。

【问题讨论】:

  • 查询数据时的预期结果是什么?例如,查询是 19 - 结果是什么?是时间线编号、区块和区块中的位置吗?
  • @Draco:没错。块是一个大块,在其中寻找第 n 个标记的唯一方法是从第一个标记开始并按顺序读取。
  • @eepp 你不能在块的开头移动块中令牌的索引吗?如果您需要搜索特定值,例如 '\0' 以了解令牌何时结束,它可以工作,并且它将搜索减少到仅 N 个时间线之一
  • @eepp 还有一些关于这里的数字是多少的数据可能是相关的:N,块数,令牌的总大小?适当的优化将取决于此信息
  • 你可能想看看这个video中的区间树解释

标签: algorithm data-structures intervals


【解决方案1】:

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

【讨论】:

  • 我不能保留与数据结构(如数组)中的标记一样多的引用,因为标记太多。如果我只有几个令牌,这个问题很容易解决。
【解决方案2】:

我认为最简单的方法(如果它不占用大量内存空间)是创建一个 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
    }
  }    
}

如果成本太高,请尝试仅保存令牌的时间线编号。这样,当查询到来时,您就不必搜索每个时间线。您所要做的就是获取时间线,对一个块进行二进制搜索,然后在一个块内进行简单的前向搜索。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 2015-08-19
      • 1970-01-01
      相关资源
      最近更新 更多