【发布时间】:2020-03-02 02:00:22
【问题描述】:
我正在寻找最优雅、最快和最有效的方法来存储 Point 类的多个对象,并在任何类型的集合中使用索引/键。
Point 包含index、posX、posY、area、neighborPoints[]、AdjacentTriangles[] 等属性,用于创建 Delaunay-Triangulation 和 Voronoi-Mesh。
出于选择的原因,单点应该在集合中具有索引,但不需要排序。
在进行三角测量时,我正在创建和删除点。我也想循环集合中的所有点。因此,应针对这些操作优化集合类型。
一开始我使用List<Point> 来存储点,并且列表中的出现与点的索引相同。如果删除列表中的一个点,我必须减少较高点的所有索引。这对我来说听起来很不方便而且很耗时。
这就是我后来尝试Dictionary<int, Point> 的原因。这里的索引是固定的,如果我删除例如第二个点,那么所有更高的点,可能Point[5] 保持Point[5],只是Point[1] 不再存在(返回是null)。然而,我的运行时间现在甚至更长(见图),尽管我不再需要进行索引移动。 (为什么是这样?)
使用Hashmap 对我来说毫无意义,从那以后我将无法使用像Point.posX 这样的调用(错误代码CS1061),因为在Hashmap 中没有设置数据类型。
您对性能更快的高效收集类型有什么建议吗?
【问题讨论】:
-
您真的需要字典来获得密钥访问权限吗?这可能会对您有所帮助:HashSet vs. List performance 和 HashSet vs List vs Dictionary. HashSet,
-
我很难理解只有 5000 分的字典如何需要这么长时间来处理。您能否发布一个简单版本的代码,以便我们诊断发生了什么?
-
@Slothario 或多或少是来自 Wikipedia en.m.wikipedia.org/wiki/Bowyer%E2%80%93Watson_algorithm 伪代码的 Bowyer-Watson 算法我有一个用于所有点的集合,一个用于所有三角形的集合
标签: c# list dictionary hashmap delaunay