C# 如何有效地存储/检索有关栅格边的数据?

C# 如何有效地存储/检索有关栅格边的数据?,c#,C#,如果这是一个错误的stackexchange网站,请告诉我其他地方 我有一个规则的二维节点网格。我还想存储有关网格节点之间的边的数据,但我不确定如何以有效的方式实现这一点 我立刻想到的三个想法都有缺点,我不确定哪一个更可取,或者,确实,是否有更好的方法 将边缘数据存储在二维数组中。由于图形节点基本上形成二维数组,因此可以简单地将边缘数据存储在普通二维数组中——0,0是左下角节点,1,0在其右侧,0,1在其正上方,等等 此方法的问题是数据重复-关于0,0和0,1之间边缘的数据存储在两个不同的位置。

如果这是一个错误的stackexchange网站,请告诉我其他地方

我有一个规则的二维节点网格。我还想存储有关网格节点之间的边的数据,但我不确定如何以有效的方式实现这一点

我立刻想到的三个想法都有缺点,我不确定哪一个更可取,或者,确实,是否有更好的方法

  • 将边缘数据存储在二维数组中。由于图形节点基本上形成二维数组,因此可以简单地将边缘数据存储在普通二维数组中——0,0是左下角节点,1,0在其右侧,0,1在其正上方,等等
  • 此方法的问题是数据重复-关于0,0和0,1之间边缘的数据存储在两个不同的位置。每当需要更新数据时,您都需要在两个位置对其进行更新,当然,您还需要额外的内存开销,因为您可能需要保存两倍的数据(即使有一半数据是重复的)

  • 仅存储2d数组中的“顶部”和“左侧”边。这是方法1的扩展,可避免存储冗余数据。但是,这使得检索和存储数据更加困难,因为现在需要3个调用来收集或设置节点的所有边(x,y;x+1,y;和x,y-1)

  • 使用
    字典
    字典(点元组)存储和检索关于图中两个节点之间的边的数据。

  • 这避免了冗余,但字典查找比数组慢,并且不可能一次获取所有4条边(接收节点并返回4条边的字典可以解决后者,但会重新引入冗余问题)。出于我的目的,我主要感兴趣的是一小群节点之间所有可能的边,因此不检索所有节点不是一个大问题

    现在,我倾向于方法1,只是吸收和处理冗余数据。是否有更好的方法来存储/检索有关边的数据,或者这是最好的方法

    示例-在边缘中存储颜色:


    另一种选择是制作一个大的1D边对象列表,然后将它们适当地链接到节点。例如,节点类可以有
    TopEdge
    LeftEdge
    BottomEdge
    RightEdge
    成员,每个成员都是对边缘列表中某个对象的引用

    这在初始设置时可能会稍微复杂一些,但可以避免数据重复,并提供从节点轻松访问适当边缘的功能


    如果您想要一个更正式的解决方案,您可能还需要仔细阅读。

    假设所有内容都适合内存,并且您的边不是非常稀疏,我会选择“在2d数组中仅存储“顶部”和“左侧”边”,因为它可能具有您列出的选项中最好的缓存性能

    但是,这使得检索和存储数据更加困难,因为现在需要3个调用来收集或设置节点的所有边(x,y;x+1,y;和x,y-1)


    我不明白你这是什么意思。所有内容都应该封装在一个类中,以便于使用。如果您发现自己需要设置一个节点的所有边,那么就编写一个方法来设置它。

    Hm。我想存储值数据(一个边结构)。我对传递结构引用有点冒险。不过,它应该仍然可以工作。是的,如果你想做structs,那么这可能不太好。为什么不使用类呢?如果您关心性能,我会先用一种简单的方法编写代码,然后做一些分析,看看它是否适合您。这是一个很好的建议。无论如何,我可能会这么做,但谢谢你指出,打3个电话并不一定是件坏事。出于好奇,如果边缘稀疏,你会有什么建议?@ravendramer,我真的不知道。如果它们不能放入数组,可能会使用字典。