给出n个线段和pt。我想找到pt所在的线段。线段用x [start]和x [ending]表示。可以假设所有线段都在x轴上。线段也可以重叠。有没有比O(n)更好的解决方案。 我认为如果片段不是重叠排序和二元搜索会完成这个技巧。有很多pts,我想在每个线段上找到pts的数量
答案 0 :(得分:1)
它不能比O(n)
更好。你必须检查每个细分。排序更糟糕 - O(N log N)
。
答案 1 :(得分:1)
我相信你这样问,因为你想查询多个pt。
考虑所有n
段包含pt,如果您想要确切地找出哪些段包含pt,则不能优于O(n)
。
但是,如果您只想计算数字,可以使用一些数据结构来优化查询。与binary indexed tree
类似,您可以O(nlog)
为一个查询做准备和O(log)
。
答案 2 :(得分:0)
如果我正确理解了这个问题,可以假设所有的线段都在x轴上。你的意思是说你有一组(重叠)间隔并用点查询它们,这是正确的吗?
如果是这样,我会提出以下方法:
{(0, 2), (1, 3)}
,将其转换为{(0, 1)=>1, (1, 2)=>2, (1, 3)=>1}
。我刚才写了关于如何处理重叠间隔的another answer。你的问题不一样,但方法是一样的。给定n
个时间间隔,您可以在O(n log n)
时间内执行第一步。您最终会得到O(n)
个新区间,因此构建细分树也需要O(n log n)
次。然后可以在O(log n)
时间内完成查询。