C# 如何有效地存储/检索有关栅格边的数据?
如果这是一个错误的stackexchange网站,请告诉我其他地方 我有一个规则的二维节点网格。我还想存储有关网格节点之间的边的数据,但我不确定如何以有效的方式实现这一点 我立刻想到的三个想法都有缺点,我不确定哪一个更可取,或者,确实,是否有更好的方法C# 如何有效地存储/检索有关栅格边的数据?,c#,C#,如果这是一个错误的stackexchange网站,请告诉我其他地方 我有一个规则的二维节点网格。我还想存储有关网格节点之间的边的数据,但我不确定如何以有效的方式实现这一点 我立刻想到的三个想法都有缺点,我不确定哪一个更可取,或者,确实,是否有更好的方法 将边缘数据存储在二维数组中。由于图形节点基本上形成二维数组,因此可以简单地将边缘数据存储在普通二维数组中——0,0是左下角节点,1,0在其右侧,0,1在其正上方,等等 此方法的问题是数据重复-关于0,0和0,1之间边缘的数据存储在两个不同的位置。
字典
字典(点元组)存储和检索关于图中两个节点之间的边的数据。另一种选择是制作一个大的1D边对象列表,然后将它们适当地链接到节点。例如,节点类可以有
TopEdge
、LeftEdge
、BottomEdge
和RightEdge
成员,每个成员都是对边缘列表中某个对象的引用
这在初始设置时可能会稍微复杂一些,但可以避免数据重复,并提供从节点轻松访问适当边缘的功能
如果您想要一个更正式的解决方案,您可能还需要仔细阅读。假设所有内容都适合内存,并且您的边不是非常稀疏,我会选择“在2d数组中仅存储“顶部”和“左侧”边”,因为它可能具有您列出的选项中最好的缓存性能 但是,这使得检索和存储数据更加困难,因为现在需要3个调用来收集或设置节点的所有边(x,y;x+1,y;和x,y-1)
我不明白你这是什么意思。所有内容都应该封装在一个类中,以便于使用。如果您发现自己需要设置一个节点的所有边,那么就编写一个方法来设置它。Hm。我想存储值数据(一个边结构)。我对传递结构引用有点冒险。不过,它应该仍然可以工作。是的,如果你想做structs,那么这可能不太好。为什么不使用类呢?如果您关心性能,我会先用一种简单的方法编写代码,然后做一些分析,看看它是否适合您。这是一个很好的建议。无论如何,我可能会这么做,但谢谢你指出,打3个电话并不一定是件坏事。出于好奇,如果边缘稀疏,你会有什么建议?@ravendramer,我真的不知道。如果它们不能放入数组,可能会使用字典。