我有一组时间间隔 In =(an,bn)。我需要运行大量的查找,我有时间 t 并需要快速返回包含 t 的时间间隔,例如,这些时间间隔一个< = t< = bn 。
对此有什么好的数据结构或算法?
如果重要,在我的情况下, 和 bn 是整数。
答案 0 :(得分:17)
您要找的是Interval Tree(Range Tree的类型)。
它们具有与其他树结构(例如RB树)类似的对数查找时间,因此您应该看到使用类似Java TreeMap或STL映射的可比性能。
答案 1 :(得分:2)
这基本上是一个空间分区问题。你有一个带有容器的大空间和那个空间中的特定点,它接触的容器是什么?许多游戏必须解决这个问题,所以从那里开始并不是一个坏主意。寻找有关“宽相碰撞检测”的文章。
最简单的方法是将您的数字空间划分为不变的数量。每个部分都知道哪些集合与之相交,每当添加新集合时您都会计算出这些集合。现在,您只需要检查点所在的部分中包含的集合,而不是在有点时测试每个集合。
使用的另一种通用且有效的算法是二进制空间分区。此算法将您的空间细分为两侧。每一方都知道哪些集合与之相交。您可以递归地重复此过程以达到所需的精度(尽管创建小于最小集合范围的细分没有意义。)
答案 2 :(得分:2)
欢迎您查看完全解决此问题的C# implementation I've posted on CodePlex for IntervalTree。
伊多。
答案 3 :(得分:0)
你的问题只是一维的,所以它比大多数游戏中的空间分区问题要简单一些。 你可以只有一个简单的BST,并在每个叶子中记住叶子左边的间隔列表。
如果您有间隔A(0,10)和B(5,15),那么树的叶子将是(0表示空列表),(5表示A),(10表示A,B)和(15与B)。