我有List<>
个一维细分,每个细分由struct
表示,包含开头和结尾(x1
,x2
)。细分可以重叠。该列表按开头(x1
)排序。
如何有效地找到包含特定点x
的最短片段?
目前,我使用list.BinarySearch
查找x
&gt; = x1
的第一个段,这是有效的。然后我一次继续列表一个段,直到x
&lt; x1
,找到x1
&lt; = x
&lt; x2
的最短段{{1}},效率不高。
如何提高此算法的速度以获得更好的速度?我觉得可以,但我被卡住了。
此问题与Shortest distance between a point and a line segment不重复。
答案 0 :(得分:3)
如果您允许自己的O(n log n)预处理时间,您可以构建一个数据结构,以便在任何查询点的O(log n)时间内给出答案。对间隔的所有端点进行排序(跟踪它们对应的间隔),并从左到右处理端点。还维护按间隔长度排序的间隔的自平衡二叉搜索树。每次遇到左端点时,都要在树中添加间隔,每次遇到右端点时,都要从树中删除间隔。此外,对于您遇到的每个端点,记录包含端点和前一个端点之间的子区间的最短间隔(树中最左侧的节点)。 (如果没有间隔,则记录“无”)所以最后你将得到一个2n-1个子区间的数组,这些子区间在分类中知道是否有一个覆盖子区间的区间,如果是,那么最短区间是什么。然后给出一个点,您可以二进制搜索结构以找到包含该点的子区间,并报告是否存在包含该点的区间,如果是,则表示最短区间是什么。
答案 1 :(得分:1)
查看间隔树(http://en.wikipedia.org/wiki/Interval_tree)和细分树(http://en.wikipedia.org/wiki/Segment_tree)。
这些支持有效的查询来报告跨越给定点的所有间隔。
我不知道有效报告最小间隔的解决方案。