找到一个点所属的最短段

时间:2014-04-09 14:34:01

标签: c# algorithm optimization

我有List<>个一维细分,每个细分由struct表示,包含开头和结尾(x1x2)。细分可以重叠。该列表按开头(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不重复。

2 个答案:

答案 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)。

这些支持有效的查询来报告跨越给定点的所有间隔。

我不知道有效报告最小间隔的解决方案。