假设我需要找到从一个(x,y)坐标到百万坐标数组中每个坐标的欧氏距离,然后选择距离最小的坐标。
目前我通过百万元素数组循环,计算最小距离保持跟踪。有没有办法,我可以做得更好,更快。
由于
答案 0 :(得分:3)
您可以使用更复杂的数据结构(例如k-d tree)来显着改进算法。如果你期望做的只是搜索一次最近的邻居,你可能不会比迭代所有点更好。
你可以做什么,虽然是优化计算距离的函数,并且(如评论中所述)你可以省略平方根,因为比较两个非负整数的平方只是与比较值相同。
答案 1 :(得分:2)
我从这个问题中理解的是,你想要找到最接近的一点。有一个算法Closest pair of points problem来解决这个问题。
最近一对点:
- 通过行
l
将该组划分为两个大小相等的部分,并递归计算每个部分的最小距离。- 让
d
成为两个最小距离中的最小距离。- 消除远离
之后的d点l
- 根据其y坐标
对剩余点进行排序- 扫描y顺序中的剩余点,并计算每个点与其五个邻居的距离。
- 如果这些距离中的任何距离小于
d
,则更新d
。
整个算法最近对需要O(logn*nlogn)
= O(nlog
2
n)
时间。
我们可以通过减少在步骤4中实现y坐标排序所需的时间来略微改进此算法。这是通过要求步骤1中计算的递归解按其y坐标返回排序顺序来完成的。 。这将产生两个排序的点列表,这些点仅需要在步骤4中合并(线性时间操作)以产生完整的排序列表。因此,修订后的算法涉及进行以下更改:
- 步骤1:将集合划分为...,并递归计算每个部分的距离,按照y坐标按排序顺序返回每个集合中的点。
- 步骤4:在
O(n)
时间内将两个已排序的列表合并为一个已排序的列表。
因此,合并过程现在由线性时间步骤支配,从而产生O(nlogn)
算法,用于找到平面中一组点的最近对。
答案 2 :(得分:1)
通过首先检查沿x和y的距离是否<=比您存储的最后距离(平方),您可以节省相当多的时间。如果这是真的,那么你继续计算距离(平方)。当然,您保存的时间取决于点的分布方式。