Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 搜索直线附近点的更快方法_Algorithm_Line_Distance_Point_Nearest Neighbor - Fatal编程技术网

Algorithm 搜索直线附近点的更快方法

Algorithm 搜索直线附近点的更快方法,algorithm,line,distance,point,nearest-neighbor,Algorithm,Line,Distance,Point,Nearest Neighbor,我在二维空间中有一组点和一条线。我需要找到距离直线D范围内的所有点。有没有一种方法可以让我不用计算所有点到直线的距离di?有比线性搜索更好的解决方案吗 编辑:我需要在同一点集中搜索不同的线多次。点总是恒定的,但在每次搜索过程中,线会不同。通常,点集的数量级为数万(~50k) 此搜索不能比线性搜索更快完成,因为输入数据和结果填充具有相同的复杂性。此搜索不能比线性搜索更快完成,因为输入数据和结果填充具有相同的复杂性。至于查询: 如果使用这些点创建kd树,并在直线上使用几个等距点(可能在d点附近),则

我在二维空间中有一组点和一条线。我需要找到距离直线D范围内的所有点。有没有一种方法可以让我不用计算所有点到直线的距离di?有比线性搜索更好的解决方案吗


编辑:我需要在同一点集中搜索不同的线多次。点总是恒定的,但在每次搜索过程中,线会不同。通常,点集的数量级为数万(~50k)

此搜索不能比线性搜索更快完成,因为输入数据和结果填充具有相同的复杂性。

此搜索不能比线性搜索更快完成,因为输入数据和结果填充具有相同的复杂性。

至于查询:

如果使用这些点创建kd树,并在直线上使用几个等距点(可能在d点附近),则应该能够使用修改后的最近邻查询来查找直线上d约为O(k+log(N))的所有点。kd树需要进行O(N log N)预处理,因此,如果使用相同的点集(可能略有不同,因为可以在O(log N)中从kd树添加/删除点)和不同的线,则效果更好。唯一的问题是kd树实际上并不适用于线条。我肯定有类似的东西可以更好地用于生产线,但我不熟悉

注意:误报和漏报是可能的,这取决于事物的排列方式,因为您实际上是在查询与直线上某个点的距离,而不是直线上的距离。这在很大程度上取决于线路长度与d之间的比率。因此,你要么会得到相当数量的假阳性,要么会得到假阴性,除非大多数点都在直线附近。一般来说,这可能不会有太大的问题,因为即使有误报,k也应该比N小,除非d相对较大

经过一点检查,我注意到查询是针对一条直线而不是线段的。但是,可以通过使线段以最小/最大x/y为边界将其转换为一条直线。我想可能还有一种更有效的方法来使用kd树进行查询。

至于查询:

如果使用这些点创建kd树,并在直线上使用几个等距点(可能在d点附近),则应该能够使用修改后的最近邻查询来查找直线上d约为O(k+log(N))的所有点。kd树需要进行O(N log N)预处理,因此,如果使用相同的点集(可能略有不同,因为可以在O(log N)中从kd树添加/删除点)和不同的线,则效果更好。唯一的问题是kd树实际上并不适用于线条。我肯定有类似的东西可以更好地用于生产线,但我不熟悉

注意:误报和漏报是可能的,这取决于事物的排列方式,因为您实际上是在查询与直线上某个点的距离,而不是直线上的距离。这在很大程度上取决于线路长度与d之间的比率。因此,你要么会得到相当数量的假阳性,要么会得到假阴性,除非大多数点都在直线附近。一般来说,这可能不会有太大的问题,因为即使有误报,k也应该比N小,除非d相对较大


经过一点检查,我注意到查询是针对一条直线而不是线段的。但是,可以通过使线段以最小/最大x/y为边界将其转换为一条直线。我想可能还有一种更有效的方法来使用kd树进行此操作。

点是静态的吗?你只需要做一次还是经常做?如果您只需要这样做一次,恐怕没有更好的解决方案。计算不是很复杂:您可以通过查找距离直线的平方小于D^2的点来节省一些时间。听起来这可能是一个查询,在其中,保持同一条线但搜索多个点集,或者保持同一点集并使用不同的线。对于前者,O(N)是最好的选择,而对于后者,似乎可以选择O(k)或O(k log(N)),其中k是返回的点数。如果有大量点不在直线附近,则可以使用包含椭圆的矩形,该椭圆表示距离直线d的空间。计算需要一点时间,但任何检查点是否在该矩形内的操作只需要8次比较,这可能比计算距离便宜。虽然你可能需要至少几百万点,如果不是几十亿点的话,它才有价值。这些点是静态的吗?你只需要做一次还是经常做?如果您只需要这样做一次,恐怕没有更好的解决方案。计算不是很复杂:您可以通过查找距离直线的平方小于D^2的点来节省一些时间。听起来这可能是一个查询,在其中,保持同一条线但搜索多个点集,或者保持同一点集并使用不同的线。对于前者,O(N)是最好的选择,而对于后者,似乎可以选择O(k)或O(k log(N)),其中k是返回的点数。如果有大量点不在直线附近,则可以使用包含椭圆的矩形,该椭圆表示距离直线d的空间。计算需要一点时间,但任何检查点是否在该矩形内的操作只需要8次比较,这可能比计算距离便宜。虽然你可能需要至少数百万点,如果不是数十亿点的话