C# 我应该在非基于栅格的*算法中存储2d点之间的距离吗

C# 我应该在非基于栅格的*算法中存储2d点之间的距离吗,c#,dictionary,unity3d,2d,a-star,C#,Dictionary,Unity3d,2d,A Star,我正在实现A*算法。任何节点都可以连接到任何其他节点,前提是没有任何东西阻碍路径,这种情况很少发生。通过这种方式,找到的路径通常包含少量节点(甚至可能只有2个),但从一个节点移动到另一个节点的选项多得惊人。在基于网格的A*算法视频中,我听说存储这些距离是个好主意,而不是反复计算它们,但这里是这样吗?节点的位置没有绑定到网格,在我看来,计算距离的字典会变得太大而无法使用(搜索关键字)。不应该有太多的节点(30到500个),那么字典中搜索相应值的499个引用比较会花费比每次计算距离更长的时间吗?如果

我正在实现A*算法。任何节点都可以连接到任何其他节点,前提是没有任何东西阻碍路径,这种情况很少发生。通过这种方式,找到的路径通常包含少量节点(甚至可能只有2个),但从一个节点移动到另一个节点的选项多得惊人。在基于网格的A*算法视频中,我听说存储这些距离是个好主意,而不是反复计算它们,但这里是这样吗?节点的位置没有绑定到网格,在我看来,计算距离的字典会变得太大而无法使用(搜索关键字)。不应该有太多的节点(30到500个),那么字典中搜索相应值的499个引用比较会花费比每次计算距离更长的时间吗?如果不是,那么这个字典搜索时间对节点的数量有多大影响? 下面是我使用的类的框架代码

class Node
{
    private Vector2 position;
    public Vector2 Position 
    {
        get 
        {
            return position;
        }
        set 
        {
            position = value; 
            calculatedDistances.Clear();
        }
    }
    private Dictionary<Node, float> calculatedDistances;

    public float DistanceTo(Node to)
    {
        float dist;
        if (calculatedDistances.TryGetValue(to, out dist))
        {
            return dist;
        }
        else
        {
            dist = Vector2.Distance(this.Position, to.Position);
            calculatedDistances.Add(to, dist);
            return dist;
        }
    }
}
类节点
{
私有向量2位置;
公共向量2位置
{
得到
{
返回位置;
}
设置
{
位置=值;
计算的距离。清除();
}
}
专用字典计算距离;
公共浮点距离到(节点到)
{
浮动距离;
if(计算的距离.TryGetValue(到,出距离))
{
返回距离;
}
其他的
{
距离=矢量2.距离(此位置到位置);
计算距离。添加(到,距离);
返回距离;
}
}
}

性能特征始终在很大程度上取决于您的实际数据集。你几乎不应该依赖你认为会更快的东西:配置文件。C#
秒表
类在这方面非常有用

尽管如此,以下是对您的案例的一些想法:

  • 一本字典很可能无法进行499个参考文献的比较。根据C#Dictionary的具体实现(根据MSDN,它使用哈希表),您可以获得接近O(1)的查找,而不是O(n)(用于线性扫描)或O(log(n))(用于二进制搜索)
  • 使用*,不需要使用节点之间的实际距离。任何用作“度量”的东西都可以。为了成为一个度量,它只需要始终为正(除非比较相同的两个点,在这种情况下,它必须为0),并且到a->B->C的距离必须大于或等于a->C。具体地说,您可以使用距离的平方,而不是距离。当您关心性能时,这将为您节省昂贵的平方根计算

Dictionnary
HashTable
使用散列计算正在查找的元素,以准确知道它将在内存中的位置。因此,它比像普通列表或普通数组那样查看每个元素要快得多。