【问题标题】:Can I speed finding indexes of an array more than what I have?我可以比现有的更快地查找数组的索引吗?
【发布时间】:2014-03-31 04:28:45
【问题描述】:

我将顶点保存在一个列表中,我只想将一个顶点添加到列表中,如果它还没有包含它。如果它不包含它,我会将它添加到列表中,然后将索引添加到名为 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]);
    }
}

【问题讨论】:

  • 我读到使用带有索引的for 比foreach 快。除此之外,您可以使用Dictionary&lt;Vector3&gt;,这使得找到顶点 O(1)。
  • @ThorstenDittmar - Hashtable 也有 O(1),只是它不像 Dictionary 那样通用,所以你要为装箱/拆箱付费。此外,哈希表(或字典)的容量应大于实际填充 - 根据我的个人经验,1/3 比例是最好的。
  • 我同意@ThorstenDittmar,但我会选择HashSet&lt;Vector3&gt;而不是字典
  • @SpookKruger 我首先尝试了 HashSet,唯一的问题是我无法从中获取索引,因此无法将索引放入 tri 列表中

标签: c# performance list indexing


【解决方案1】:

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

Dictionary<Vector3, int> vertIndexes;
...

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

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

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

【讨论】:

  • 我没有注意到使用它有多大的性能提升,稍后我会尝试自定义哈希表,也许还有其他东西会减慢它的速度?
  • 很有可能。分析代码,或者只是暂停调试器 10 次以查看它最常停止的位置。也许您经常考虑添加到 dict 的情况。使用自定义哈希表,您可以编写自定义操作,将所有操作组合到一个查找中。使用二次方数组大小,以便您可以快速计算正确的存储桶索引为hashCode &amp; (length - 1)。比模数快得多。
【解决方案2】:

容器有很多种,它们都有不同的性能、资源和利用特性。

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

如果您需要通过键查找顶点,请使用字典。如果顶点本身就是键,那么也为此使用哈希表。那么你就不需要单独的索引哈希表了。

你真的需要计数吗?如果没有,那么只需对顶点使用哈希表,如果您需要计数,则使用在带有计数的顶点上键入的字典。 Dictionary&lt;Vertex3,int&gt;

【讨论】:

  • 最后我只需要两个数组,一个带有vector3s,另一个带有指向向量的索引以创建三角形
  • @Shredder2500 - 我对 3D 渲染知之甚少,但为什么需要将索引数组放入不同的数组中?这是序数还是实际引用?因为如果是实际引用,那与实际的顶点列表有何不同?
  • Unity 会遍历三角形数组,获取该三角形列表中的索引,并在顶点数组中找到顶点。顶点可以是任何顺序,但 tris 顺序告诉它如何渲染三角形
  • 再次......这些是序数索引吗?还是它们是参考?
猜你喜欢
  • 1970-01-01
  • 2011-07-07
  • 2011-09-08
  • 2019-01-19
  • 2016-07-22
  • 1970-01-01
  • 2011-08-25
  • 2014-01-13
  • 2019-03-07
相关资源
最近更新 更多