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

标签 c#

如果这个问题的 stackexchange 网站是错误的,请指导我到别处!

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

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

  1. 将边数据存储在二维数组中。由于图节点本质上形成了一个二维数组,因此您可以简单地将边数据存储在普通的二维数组中——0,0 是左下角的节点, 1,0 在它的右边,0,1 在它的正上方,等等。

此方法的问题是数据重复 - 有关 0,0 和 0,1 之间边的数据存储在两个不同的位置。每当需要更新数据时,您都需要在两个地方进行更新,当然,您还有额外的内存开销,因为您可能需要保存两倍的数据(即使其中一半是重复的)

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

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

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

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

示例 - 在 Edge 中存储颜色:

enter image description here

最佳答案

假设所有内容都适合内存并且您的边缘不是非常稀疏,我会选择“仅将“顶部”和“左侧”边缘存储在二维数组中”,因为它可能具有您列出的选项的最佳缓存性能。

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).

我不明白你的意思。一切都应该封装在一个类中,以方便使用的接口(interface)。如果您发现自己需要设置节点的所有边,请编写一个方法来执行此操作。

关于c# - 如何有效地存储/检索有关网格边缘的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14088136/

相关文章:

C# 替代标准 Treeview?

c# - 如何使用 Azure 函数将数据附加到 Azure blob 中的 parquet 文件

c# - 如何在 WPF 中将 DatePicker 添加到 DataGridTextColumn

c# - 使用c#移动到excel中下一行的下一个单元格

c# - 如何以可移植的形式在 C# 应用程序中存储数据?

c# - WPF 我没有在 Label 和 Texblock 之间绑定(bind)工作

c# - 索引在修剪文本处超出数组边界

c# - 文本框中的 xml 在线提取

c# - 将异步任务切换为同步任务

c# - 解压并重新打包 .jar 文件