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

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

我有一个常规的2维节点网格.我还想存储有关网格节点之间边缘的数据,我不确定如何以有效的方式执行此操作.

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

>将边缘数据存储在二维阵列中.由于图形节点基本上形成一个二维数组,你可以简单地将边数据存储在一个普通的二维数组中 – 0,0是左下方的节点,1,0是它的右边,0,1是直接的“以上“它等

此方法的问题是数据重复 – 有关0,0和0,1之间边缘的数据存储在两个单独的位置.每当需要更新数据时,您需要在两个地方更新它,当然,您需要额外的内存开销,因为您需要保留两倍的数据(即使其中一半是重复的)

>仅在“2d”阵列中存储“顶部”和“左侧”边缘.这是方法1的扩展,它避免了存储冗余数据.但是,这使得检索和存储数据变得更加困难,因为您现在需要3次调用来收集或设置节点的所有边(x,y; x 1,y;和x,y-1).
>使用字典<<< x,y>,< x,y>>,Edge>字典(点的元组),用于存储和检索有关图中两个节点之间边缘的数据.

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

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

示例 – 在Edge中存储颜色:

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

However, this makes retrieving and storing the data even more difficult, since you now need 3 calls to collect or set all the edges of a node (x,y; x+1,y; and x,y-1).

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

点赞