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

时间:2012-12-30 03:46:45

标签: c#

如果这个问题的stackexchange网站错误,请指示我到其他地方!

我有一个常规的2维节点网格。我还想存储关于网格节点之间边缘的数据,我不知道如何以有效的方式做到这一点。

我立即想到的三个想法都有缺点,我不确定哪个更好,或者确实有更好的方法。

  1. 将边缘数据存储在2d数组中。由于图形节点基本上形成2d数组,因此您可以简单地将边数据存储在普通的二维数组中 - 0,0是左下方的节点,1,0在它的右边,0,1直接在“它上面”,等等。
  2. 此方法的问题是数据重复 - 有关0,0和0,1之间边缘的数据存储在两个单独的位置。每当需要更新数据时,您需要在两个地方更新它,当然,您需要额外的内存开销,因为您需要保留两倍的数据(即使其中一半是重复的)

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

    2. 使用dictionary<<<x,y>,<x,y>>,Edge>字典(点数元组)来存储和检索有关图表中两个节点之间边缘的数据。

    3. 这避免了冗余,但字典查找比数组慢,并且不可能同时获得所有4个边(一个接收节点并返回4个边的字典将解决后者,但重新引入冗余问题)。出于我的目的,我主要关注一小组节点之间的所有可能边缘,因此不检索所有节点不是一个大问题。

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

      示例 - 在Edge中存储颜色:

      enter image description here

2 个答案:

答案 0 :(得分:1)

另一种选择是创建一个大的边缘对象列表,然后将它们适当地链接到节点。例如,您的节点类可以包含TopEdgeLeftEdgeBottomEdgeRightEdge成员,每个成员都可以引用边列表中的某个对象。

初始设置可能会稍微复杂一些,但会避免数据重复,并且可以从节点轻松访问相应的边缘。

如果您想要更正式的解决方案,您也可以阅读graph theory

答案 1 :(得分:1)

假设一切都适合内存并且你的边缘不是非常稀疏,我会选择“只存储2d数组中的”顶部“和”左“边缘”因为它可能有您列出的选项的最佳缓存性能。

  

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

我不明白你的意思。应该将所有内容封装在一个易于使用的接口中。如果您发现自己需要设置节点的所有边缘,那么请编写一个方法来执行此操作。

相关问题