什么数据结构最好检查值是否在a和b之间定义块边界

时间:2012-07-05 14:53:40

标签: algorithm data-structures

我有下表:

块|开始|结束

  

1 | 1 | 4

     

2 | 5 | 9

     

3 | 10 | 20

     

4 | 21 | 50

     

..........

     

n | 1000 | 2000

当给变量c赋值时,我必须搜索哪个块包含c(start< c< end)。例如,当c = 1001时,c在块n中。 什么数据结构最有效?

5 个答案:

答案 0 :(得分:1)

如果整数范围仅为1..2000,您可以将数据视为如下表:

n   block
1   1
2   1
3   1
4   0
5   0
6   2
.
.
.

您将实现为2000个元素的向量。在向量中简单查找元素n将告诉您哪个块n所在(除非您选择使用基于0的索引的语言实现,在这种情况下,元素n告诉你整数n+1是哪个块)。在这里,我用0来表示“没有阻止”。

与其他一些答案相比,这会占用时间空间,但这通常是可接受的权衡。

答案 1 :(得分:1)

interval treesegment tree可行。从本质上讲,您可以通过二进制搜索间隔来查找包含相关点的内容。由于Segment Tree在刺伤查询方面更胜一筹,因此它是我第一次尝试。

如果您使用的是Java,我之前已经在java中实现了它们。您可以找到interval tree heresegment tree here

答案 2 :(得分:1)

我认为interval tree非常适合这个问题。实现它比表更难实现,如果你不需要动态添加你的块,我建议你只需要保持一个表并使用简单的二进制搜索来找到你的块。这应该达到与间隔树相同的效率,没有所有可怕的编码痛苦(只要你不必添加间隔)。

答案 3 :(得分:0)

我不确定你要的是什么

我相信有很多方法可以实现这样的块, personnaly我会有一个ordrer列表,包含每个块的结尾并运行它直到结束大于值,索引给我块的数量

答案 4 :(得分:0)

对于此特定示例,您可以将start存储在数组中(按排序顺序)并执行二进制搜索以获取相应的块。

编辑解释示例:

在开始数组中你有1,5,10,21,1000所以对于c = 3你知道它在块1中,因为5是块2的起始索引。

出于某种原因,如果您还想查看结尾,那么您可以将其存储在另一个数组中,并从二进制搜索获得的索引中访问一个开头的结尾。