我遇到这种情况,我有 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(由于令牌具有令牌,因此在块内不可进行二分搜索各种尺寸,尚未包含在任何数据结构中。)
谢谢!
编辑:我正在考虑使用包含所有时间轴间隔的间隔树。问题是查询仍会导致许多间隔。另外,与二进制搜索相比,它没有太多优化。
答案 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树进行搜索。