我有下表:
块|开始|结束
1 | 1 | 4
2 | 5 | 9
3 | 10 | 20
4 | 21 | 50
..........
n | 1000 | 2000
当给变量c赋值时,我必须搜索哪个块包含c(start< c< end)。例如,当c = 1001时,c在块n中。 什么数据结构最有效?
答案 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 tree或segment tree可行。从本质上讲,您可以通过二进制搜索间隔来查找包含相关点的内容。由于Segment Tree在刺伤查询方面更胜一筹,因此它是我第一次尝试。
如果您使用的是Java,我之前已经在java中实现了它们。您可以找到interval tree here和segment tree here。
答案 2 :(得分:1)
我认为interval tree非常适合这个问题。实现它比表更难实现,如果你不需要动态添加你的块,我建议你只需要保持一个表并使用简单的二进制搜索来找到你的块。这应该达到与间隔树相同的效率,没有所有可怕的编码痛苦(只要你不必添加间隔)。
答案 3 :(得分:0)
我不确定你要的是什么
我相信有很多方法可以实现这样的块, personnaly我会有一个ordrer列表,包含每个块的结尾并运行它直到结束大于值,索引给我块的数量
答案 4 :(得分:0)
对于此特定示例,您可以将start存储在数组中(按排序顺序)并执行二进制搜索以获取相应的块。
编辑解释示例:
在开始数组中你有1,5,10,21,1000所以对于c = 3你知道它在块1中,因为5是块2的起始索引。
出于某种原因,如果您还想查看结尾,那么您可以将其存储在另一个数组中,并从二进制搜索获得的索引中访问一个开头的结尾。