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

假设我有以下数据:

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

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

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

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

我不是在寻找答案,我而是想要一些关于如何实现这一点的指导,甚至可能是一些链接。

有帮助吗?

解决方案

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

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

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

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

如果集合不是很密集,则开始使用“稀疏边缘数据结构”。根据您的申请,您可能:

  1. 任何 S 对象都有一个它的 L 列表。{ 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 并以某种方式对其进行索引。这就是我们所说的“让您的数据库完成工作”。

也可以看看 关系的数据结构

其他提示

好了,不给你一个答案,想想可以用2维数组进行,并考虑从存储关于边的信息的角度看问题。

此闻起来像关系数据库问题我。你所描述的是两个表有许多一对多的关系。不管这个答案是合适的,将取决于很多关于你的数据实际上是什么样子。让每个对象先前的建议包含其他对象的名单是一种方式,但让我们实话实铁锹,这是一个关系型数据库。考虑使用技术,如ADO.Net实体框架或LINQ来定义你的数据作为一个关系型数据库,并使用LINQ查询数据。

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

每个类可以具有其他类型的列表。你不除非您使用的值类型的重复数据这种方式。该交叉引用可以使内存泄漏。

什么乔说是在正确的轨道上。每笔贷款将有安全情况的列表,每个安全将有贷款实例列表。关键是要确保你永远不会有认为它是涉及到安全性助学贷款但保安不同意。我建议允许添加或只对删除的操作,以确保它们在平行大功告成。我不认为这会如何导致内存泄漏,因为GC是足够聪明地处理这个问题。引用计数,与此相反,不能没有一些技巧处理这个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top