如果这是此问题的错误 stackexchange 网站,请在其他地方指导我!
我有一个规则的二维节点网格。我还想存储有关网格节点之间边缘的数据,但我不确定如何以有效的方式执行此操作。
我立即想到的三个想法都有缺点,我不确定哪个更可取,或者是否确实有更好的方法。
- 将边缘数据存储在二维数组中。由于图节点本质上是一个二维数组,你可以简单地将边数据存储在一个普通的二维数组中——0,0 是左下节点,1,0 是它的右边,而 0,1 是直接“上面”它等等。
这种方法的问题是数据重复——关于 0,0 和 0,1 之间的边的数据存储在两个不同的位置。每当需要更新数据时,您都需要在两个地方都更新它,当然,您有额外的内存开销,因为您可能需要保存两倍的数据(即使其中一半是重复的)
仅将“顶部”和“左侧”边缘存储在二维数组中。这是方法 1 的扩展,可避免存储冗余数据。但是,这使得检索和存储数据变得更加困难,因为您现在需要 3 次调用来收集或设置节点的所有边(x,y;x+1,y;和 x,y-1)。
使用
dictionary<<<x,y>,<x,y>>,Edge>
字典(点元组)来存储和检索关于图中两个节点之间的边的数据。
这避免了冗余,但字典查找比数组慢,并且不可能一次获得所有 4 条边(接受一个节点并返回 4 条边的字典可以解决后者,但会重新引入冗余问题)。出于我的目的,我主要对一小组节点之间所有可能的边感兴趣,因此不检索所有节点并不是一个大问题。
现在,我倾向于方法#1,只是吸收和处理冗余数据。有没有更好的方法来存储/检索有关边缘的数据,或者这是最好的方法。
示例 - 在 Edge 中存储颜色: