假设一切都适合记忆,你的边缘不是非常稀疏,我会选择 “仅在”2d数组中存储“顶部”和“左”边缘“ 因为它可能具有您列出的选项的最佳缓存性能。
但是,这使得检索和存储数据变得更加困难,因为您现在需要3次调用来收集或设置节点的所有边(x,y; x + 1,y;和x,y-1)。
我不明白你的意思。应该将所有内容封装在一个易于使用的接口中。如果您发现自己需要设置节点的所有边缘,那么请编写一个方法来执行此操作。
另一种方法是制作一个大的边缘对象列表,然后将它们适当地链接到节点。例如,您的节点类可以具有 TopEdge , LeftEdge , BottomEdge ,和 RightEdge 成员,每个成员都是对边缘列表中某个对象的引用。
TopEdge
LeftEdge
BottomEdge
RightEdge
初始设置可能会稍微复杂一些,但可以避免数据重复,并提供从节点轻松访问适当的边缘。
您也可以阅读 图论 如果你想要一个更正式的解决方案。