距离近似?

时间:2011-10-27 08:41:28

标签: performance algorithm distance

我正在2D网格上进行寻路。

我需要计算距离作为我的启发式算法之一。

此外,如果找不到完整路径,我需要返回最近的位置。

计算到双精度的精确距离似乎是不必要的开销。有没有我可以使用的快速近似值,它仍然足够准确以满足我的需求? (在1的舍入精度内)

顺便说一下,路径长度通常只有5-30个节点,因此在最后使用更准确的功能是不值得的。

3 个答案:

答案 0 :(得分:10)

  

如果找不到完整路径,我需要返回最近的位置。

在这种情况下,您可以跳过距离计算中的平方根运算,即仅使用dy * dy + dx * dx比较平方距离。

这是因为 a 2 < b 2 当且仅当 a< b 两个任意距离 a b

在2D网格中,这将完全用整数实现。

如果您需要非整数值,我可能会使用double s,直到证明是瓶颈为止。

答案 1 :(得分:2)

如果是2D网格,您可以考虑使用Manhattan distance。这将允许您始终以网格单位工作并避免使用平方根。正如aioobe所说,这可能是微观优化。

答案 2 :(得分:2)

略高于曼哈顿距离,几乎同样快:

unsigned int fastDist(unsigned int dx, unsigned int dy) {
    if ( dy < dx ) return (dx + (dy >> 1));
    else return (dy + (dx >> 1));
}

当dx或dy为零时确切。对角线上的误差约为6%,最大误差约为12%。

这可以通过添加另一个术语来改进:

unsigned int fastDist(unsigned int dx, unsigned int dy) {
    unsigned int w;
    if ( dy < dx ) {
        w = dy >> 2;
        return (dx + w + (w >> 1));
    }
    else {
        w = dx >> 2;
        return (dy + w + (w >> 1));
    }
}

最大误差小于7%,对角线误差小于3%。