4

所以,我需要一些方法来在 C# 中实现一个无向网络(我认为这是正确的术语)

假设我有以下数据:

Foo1 <-> Bar1
Foo2 <-> Bar1
Foo2 <-> Bar2
Foo2 <-> Bar3
Foo3 <-> Bar2
Foo3 <-> Bar3

我将如何实现可以支持这一点的东西?

一种方法是创建一个包含 Foo 和 Bar 的类,在我的示例中,我将拥有其中的 6 个,每种可能的组合,但是这会使数据加倍。

有了这些数据,我需要能够根据它所指向的 Bar 点数以及 Foo 的 Bar 点数等对 Foo1 执行计算。

我不是在寻找答案,我更愿意就如何实现这一点提供一些指导,甚至可能是几个链接。

4

5 回答 5

1

好吧,不给你答案,想想二维数组能做什么,从存储边信息的角度来思考这个问题。

于 2009-09-04T00:28:39.337 回答
1

这对我来说就像一个关系数据库问题。您所描述的是两个具有多对多关系的表。这个答案是否合适在很大程度上取决于您的数据实际上是什么样的。之前的建议是让每个对象包含另一个对象的 List 是一种方法,但我们直言不讳,这是一个关系数据库。考虑使用 ADO.Net Entity Framework 或 LINQ 等技术将数据定义为关系数据库,并使用 LINQ 查询数据。

你提到你担心内存加倍。同样,这取决于您的真实数据是什么样的,但除非您拥有大量数据,否则这可能不会成为问题。唯一浪费的内存是空内存。使用记忆,如果它(a)使问题更容易解决或(b)给你更多的灵活性。除非您遇到性能问题,否则不要优化。

于 2009-09-04T00:41:04.313 回答
1

您基本上已经概述了一个图模型,传统上被认为是“节点”和“边”。但证券/贷款有效。

这类事情有两个经典答案。

这取决于您希望能够对数据提出哪些问题、您希望存储数据的效率以及数据的密集程度。

例如,如果证券和贷款之间存在 30% 的可能关系,那么密集的数据结构肯定会得到回报。只需保留一个大矩阵:X 上的证券。Y 上的贷款。(X,Y)表示贷款存在。

如果集合不是很密集,那么您开始使用“稀疏边缘数据结构”。根据您的应用程序,您可以:

  1. 任何 S 对象都有其 Ls 的列表。 { S->L,L,L; S->L; S->L,L,L }. 很容易找到 S 的邻居,但很难找到 L 的邻居

  2. S 对象有一个 Ls 的列表,Ls 有一个 S 的列表:(S->L,L,LL->S,S,S)。使用更多空间,但为您提供双向查询。

  3. 存储一组只是 ( S,L) 对。非常糟糕,除非您主要需要问“这个 S 和那个 L 是否相关?”

  4. 存储两者的列表S,LL,S以某种方式对其进行索引。这就是我们所说的“让您的数据库完成工作”的意思。

另见关系的数据结构

于 2009-09-04T01:11:30.090 回答
0

每个类都可以有另一个类型的列表。除非您使用值类型,否则您不会以这种方式复制数据。交叉引用可能导致内存泄漏。

于 2009-09-04T00:31:06.627 回答
0

乔说的是在正确的轨道上。每个 Loan 都有一个 Security 实例列表,每个 Security 都有一个 Loan 实例列表。诀窍是确保您永远不会有认为它与证券相关但证券不同意的贷款。我建议只允许对对进行添加或删除操作,以确保它们是并行完成的。我看不出这会如何导致内存泄漏,因为 GC 足够聪明来处理这个问题。相比之下,引用计数在没有一些技巧的情况下无法处理这个问题。

于 2009-09-04T00:59:05.083 回答