在C#

时间:2018-08-29 16:56:48

标签: c# graph-theory adjacency-matrix adjacency-list

我正在用C#生产一些简单的网络绘图软件(为了清楚起见,我将写“网络”而不是“图形”)。网络最终可能在某些顶点/节点之间具有多个有向边。我为此软件设计了如下数据结构:

    每个节点和边缘都有一个相应的“可交互”对象,用于确定可视化和处理输入,例如针对这些可见对象的单击。这些对象可以存储有关我选择的各个对象的任何数量的数据,目前,它们包含边缘的端点,例如,每个对象的整数标识符。
  • 节点(及其之间的边缘)分为相连的组件。我想实现一些例程,这些例程在添加边时合并这些组件,并在删除边或节点时检测断开连接。
  • 现在应仅在INetwork接口的一个实例中表示网络的总体数据,该数据现在仅记录每对节点之间的边数,而忽略方向,其中包含诸如添加和删除节点和边,确定顶点的邻居等例程。

那么,我的问题是如何实际实现此IMatrix接口。可以使实现随图的稀疏度而变化,但是我想知道在内存,处理速度等方面最有效的方法。

更确切地说,我知道我可以为每个组件生成一个邻接矩阵,或者类似地生成一个邻接表,但是哪种类型最适合C#中的这些角色,请记住我的节点具有整数标识符,我希望它们在整个过程中最好保持不变?

Dictionary<int,Dictionary<int,int>>曾经是实现邻接计数以有效删除条目的好方法吗?给定节点索引,大型二维数组是否可以工作?如果我改为将矩阵存储为1-dim'l数组,例如将其存储为int[],并使用一些方法将该矩阵视为2维或3维数组,那么以任何有意义的方式会更好吗? >

当然,每种实现都有优点和缺点,但是我希望最繁琐的例程始终是检查边缘消除是否导致网络断开连接的例程。因此,我希望我使用的任何实现都能快速检查:

  1. 是否已移除的边是其一对顶点之间的最后一条边。
  2. 如果是这样,则能够连续快速地识别每个节点的邻居,从而识别出哪些节点位于哪个生成的组件中。

在此先感谢您提出任何建议。万一有人怀疑,选择C#是因为我依赖Unity游戏制作引擎进行渲染和(可能是稍后)物理功能。

0 个答案:

没有答案