C# 中的 Graph 库
假设你有一个项目,你现在必须处理活动依赖关系的网络表示;在这个项目上工作的最佳方式是什么?答案是图。
在这种情况下,图非常方便,并且它们还具有几个基本功能,使你的工作变得更加简单。
C#
中的图是什么
当你想到图
时,你可能会想到那些代表数值的长竖条,你曾经在学校的数学书中看到过那种(也许现在仍然如此)。
但这些不是我们在这里讨论的图;相反,想想一个蜘蛛网状的结构,其相互连接的部分代表一个整体。
那么,让我们深入研究一下图是什么;通常,图有两个基本组件,称为 Node
和 Edge
。Nodes
使用 Edges
连接;前两个 Nodes
使用 Edges
连接;那么,节点
可以连接任意数量。
因此,图非常出色,因为当你想要表示某些概念或实体之间的关系时它们的结构方式。你可以使用不同的表示类型、算法和数据结构。
不只有一种类型的图。有几种类型的图。类型取决于许多区分因素,图中边和节点的功能通常定义其类型。
例如,一种称为树
的类型,其中任何节点都可以通过一条路径连接到任何其他节点。
许多系统的复杂性只能通过计算机科学中的网络来解释;因此,图论非常有用。
C#
中的数据结构
既然你已经定义并确定了你的项目需要使用图,那么你现在需要做的是为你的项目选择一个数据结构。
由于数据结构因你的需求而异,因此请仔细确定你的数据结构以最有效地使用图。决定使用何种数据结构的最重要因素是内存和时间复杂度。
C#
中的算法
其次,你应该在图中包含算法;这将大大简化你的任务。你可能永远不需要创建一些新颖的算法,因此请记住你需要的常用算法并在图中使用它们。
让自己对现有的图库感到满意。你可以在图库中找到的算法针对时间和内存复杂性进行了很好的优化。
因此,在使用图时,它们是你最好的选择!
C#
图中使用的工具
以下工具将用于图,因此请熟悉它们。
- 使用算法查询和变异
- 序列化/反序列化
- 可视化
C#
中的 QuickGraph
库是什么
QuickGraph
由 Jonathan ‘Peli’ de Halleux 于 2003 年创建,是 C# 的图结构和算法的 .NET
库。它提供直接/间接图数据结构。
它的算法是深度优先
搜索、呼吸优先
搜索、A*
搜索、最短路径
、k-最短路径
和最大流量
。
它使用的一些平台是 .NET Standard 1.3+
、.NET Core 1.0+
、.NET Framework 3.5+
(和其他)。
QuickGraph
是免费的开源软件,允许你在 .NET
中构建数据结构和算法。它还提供基本的序列化/反序列化支持和一些可视化功能,尽管它们并不稳定。
QuickGraph
的算法库非常通用,几乎包括你需要的任何东西;它在可用性方面很少达不到要求,并且数据结构涵盖了很多领域,并且会在大多数情况下为你提供所需的东西。
QuickGraph
的主要缺陷是其极其不正确的文档;它几乎没有用,在某些情况下,根本不正确,非常简单且缺乏多样性。API 发生了变化,而文档在许多情况下不遵守此更改。
这将使你依赖手动检查库源,从而使过程复杂化;因此非常令人沮丧。
造成这种情况的主要原因可能是维护不善,因为该项目仍停留在其 3.6 版本,而此更新是在 2011 年中期,即十多年前!对开发商的许多赞赏;但是,保养必须更好。
尽管如此,尽管它有所下降,但它仍然是最好的选择。
C#
中图的反序列化
反序列化意味着将图的格式从一种更改为另一种;当你需要将图导出到其他应用程序、更新其上下文并根据你的需要使用时,这一点很重要。
尽管 QuickGraph
为你提供了序列化为 GraphML
的选项,但你需要为许多其他格式自行编写序列化代码,因为有许多格式,例如 XML 和 CSV。
C#
中的图中的 GraphDB
GraphDB
允许你将节点和边视为记录或值,而不是表之间的隐式关系,就像关系数据库一样。
这为你提供了更自然、更实用的图数据处理。
C#
中的图可视化
可视化是任何过程中最重要的方面之一,因为为代码提供图表示使其更易于理解和交互。它使工作更加流畅和快捷。
有各种可用的可视化工具,其中之一是 yEd 图编辑器
。这个应用程序太棒了,它甚至更好,因为它是免费的!
它的布局引擎以及随附的自定义工具非常棒。
然后是 GraphViz
,它是开源的,在学术界广泛用于图可视化;使用 DOT 语言脚本。它允许你将原理图保存为图片(例如 SVG)。
然后是 Microsoft Automatic Graph Layout
。这类似于 GraphViz
,但更基本且与 Windows 和 .NET
生态系统兼容。
最后,Gephi
是一个非常复杂的工具,不仅可以用于可视化。它也是免费和开源的。
它提供了广泛的插件支持。它是最有效的可视化工具。
I'm a Flutter application developer with 1 year of professional experience in the field. I've created applications for both, android and iOS using AWS and Firebase, as the backend. I've written articles relating to the theoretical and problem-solving aspects of C, C++, and C#. I'm currently enrolled in an undergraduate program for Information Technology.
LinkedIn