簡體   English   中英

我可以更快地找到比數組更多的索引嗎?

[英]Can I speed finding indexes of an array more than what I have?

我將頂點保留在列表中,我只想將頂點添加到列表中(如果尚未包含頂點)。 如果不包含它,我將其添加到列表中,然后將索引添加到名為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]);
    }
}

目前,您正在為每個項目執行兩個哈希表操作。 您可以保存一個:

Dictionary<Vector3, int> vertIndexes;
...

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

TryGetValue同時測試是否存在並返回存儲的值。

使用自定義哈希表可能會更快。 Dictionary有一些一般性所需的開銷,而您不需要。 例如,它使用的模運算符非常昂貴,並且不需要哈希碼就可以了。 但是,這超出了此答案的范圍。

容器種類繁多,並且它們都有不同的性能,資源和利用率特征。

列表不是最快的查找容器。 字典或哈希集可能更好。 但這取決於您需要如何使用它。

如果需要通過鍵查找頂點,請使用字典。 如果頂點本身就是鍵,則也可以使用哈希表。 然后,您就不需要索引的單獨哈希表。

您實際上需要計數嗎? 如果不是,則僅對頂點使用哈希表,如果需要計數,則使用帶有count的字典鍵入頂點。 Dictionary<Vertex3,int>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM