如果这个问题的stackexchange网站错误,请指示我到其他地方!
我有一个常规的2维节点网格。我还想存储关于网格节点之间边缘的数据,我不知道如何以有效的方式做到这一点。
我立即想到的三个想法都有缺点,我不确定哪个更好,或者确实有更好的方法。
此方法的问题是数据重复 - 有关0,0和0,1之间边缘的数据存储在两个单独的位置。每当需要更新数据时,您需要在两个地方更新它,当然,您需要额外的内存开销,因为您需要保留两倍的数据(即使其中一半是重复的)
仅在“2d”阵列中存储“顶部”和“左侧”边缘。这是方法1的扩展,可避免存储冗余数据。但是,这使得检索和存储数据变得更加困难,因为您现在需要3次调用来收集或设置节点的所有边(x,y; x + 1,y;以及x,y-1)。
使用dictionary<<<x,y>,<x,y>>,Edge>
字典(点数元组)来存储和检索有关图表中两个节点之间边缘的数据。
这避免了冗余,但字典查找比数组慢,并且不可能同时获得所有4个边(一个接收节点并返回4个边的字典将解决后者,但重新引入冗余问题)。出于我的目的,我主要关注一小组节点之间的所有可能边缘,因此不检索所有节点不是一个大问题。
现在,我倾向于方法#1,只是吮吸并处理冗余数据。有没有更好的方法来存储/检索有关边的数据,或者这是最好的方式。
示例 - 在Edge中存储颜色:
答案 0 :(得分:1)
另一种选择是创建一个大的边缘对象列表,然后将它们适当地链接到节点。例如,您的节点类可以包含TopEdge
,LeftEdge
,BottomEdge
和RightEdge
成员,每个成员都可以引用边列表中的某个对象。
初始设置可能会稍微复杂一些,但会避免数据重复,并且可以从节点轻松访问相应的边缘。
如果您想要更正式的解决方案,您也可以阅读graph theory。
答案 1 :(得分:1)
假设一切都适合内存并且你的边缘不是非常稀疏,我会选择“只存储2d数组中的”顶部“和”左“边缘”因为它可能有您列出的选项的最佳缓存性能。
然而,这使得检索和存储数据变得更加困难,因为您现在需要3次调用来收集或设置节点的所有边(x,y; x + 1,y;和x,y-1)
我不明白你的意思。应该将所有内容封装在一个易于使用的接口中。如果您发现自己需要设置节点的所有边缘,那么请编写一个方法来执行此操作。