将相同的函数应用于C中的数组中的每个元素

时间:2014-06-02 13:53:01

标签: c arrays algorithm closest-points

假设我需要找到从一个(x,y)坐标到百万坐标数组中每个坐标的欧氏距离,然后选择距离最小的坐标。

目前我通过百万元素数组循环,计算最小距离保持跟踪。有没有办法,我可以做得更好,更快。

由于

3 个答案:

答案 0 :(得分:3)

您可以使用更复杂的数据结构(例如k-d tree)来显着改进算法。如果你期望做的只是搜索一次最近的邻居,你可能不会比迭代所有点更好。

可以做什么,虽然是优化计算距离的函数,并且(如评论中所述)你可以省略平方根,因为比较两个非负整数的平方只是与比较值相同。

答案 1 :(得分:2)

我从这个问题中理解的是,你想要找到最接近的一点。有一个算法Closest pair of points problem来解决这个问题。

enter image description here

最近一对点:

  
      
  • 通过行l将该组划分为两个大小相等的部分,并递归计算每个部分的最小距离。
  •   
  • d成为两个最小距离中的最小距离。
  •   
  • 消除远离l
  • 之后的d点   
  • 根据其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的距离是否<=比您存储的最后距离(平方),您可以节省相当多的时间。如果这是真的,那么你继续计算距离(平方)。当然,您保存的时间取决于点的分布方式。