我可以加快查找数组索引的速度吗?

时间:2014-02-27 15:56:07

标签: c# performance list indexing

我将顶点保留在列表中,我只想在列表中添加一个顶点(如果它还没有包含它)。如果它不包含它我将它添加到列表然后将索引添加到名为tris的列表。但是,如果列表确实包含顶点,则应找到其所在位置的索引,然后将该索引添加到tris列表中。这是我发现的最快的方法。有更快的方法吗?

Hashtable vertIndexes;
List<Vector3> verts;
List<int> tris;

foreach (var vert in vertsOutput)
{
    Vector3 p = point + vert;
    if(!vertIndexes.Contains(p))
    {
        vertIndexes.Add(p, verts.Count);
        tris.Add(verts.Count);
        verts.Add(p);
    }
    else
    {
        tris.Add((int)vertIndexes[p]);
    }
}

2 个答案:

答案 0 :(得分:3)

目前,您正在为每个项目执行两次哈希表操作。你可以保存一个:

Dictionary<Vector3, int> vertIndexes;
...

int index;
if(vertIndexes.TryGetValue(p, out index))
 //present at given index
else
 //not present

TryGetValue同时测试存在并返回存储的值。

使用自定义哈希表可能会更快。 Dictionary有一些开销需要通用性而且你不需要。例如,它使用的模数运算符非常昂贵,并且具有良好的哈希码是不必要的。但这超出了这个答案的范围。

答案 1 :(得分:1)

容器种类繁多,它们都具有不同的性能,资源和利用率特性。

List不是查找的最快容器。字典或Hashset可能更好。但这取决于你需要如何使用它。

如果需要通过键查找顶点,则使用字典。如果顶点本身就是键,那么也可以使用哈希表。然后,您不需要索引的单独哈希表。

你真的需要点数吗?如果没有,那么只需对顶点使用哈希表,如果需要计数,则使用带有计数的顶点键入的字典。 Dictionary<Vertex3,int>