图形实现和表示据/h1>
图形是二进制关系。它提供了一个强大的可视化,作为由行(称为边)或箭头(称为弧)连接的一组点(称为节点)。在这方面,该图是树数据模型的泛化。像树木一样,图表有几种形式:定向,无向和标记。据/p>
有向图与无向图据/h2>
一种据strong>und据/strong>图的意思是两个节点之间沿一条边的关系是双向的,也就是说,它可以是任意方向的。一种据strong>指导据/strong>图形意味着这种关系只能是一种方式。据span class="image-caption center">
图形数据类型的最小描述据/h2>
作为一种抽象类型,我们可以将图视为存储在图的边和节点(节点有时也称为顶点)上的元素集合。我们处理图的基本方法如下:据/p>
1 2 3 4 5 6 7据/pre> |
|
如前所述,有两种表示图的标准方法:邻接表和邻接矩阵实现。我们将在本节中考虑这些表示。据/p>
邻接列表实施据/strong>
使用邻接列表实现图形的常用方法是使用阵列作为值的哈希表,或者使用链接列表作为值的Hashtable。由于Python组合了数组和链接列表的想法,因此我们可以使用带有节点的字典作为键和列表来轻松实现此表示。据/p>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 21 22 23 23 22 32 29 29 30 31 32 32 34 35据/pre> |
|
绩效考虑因素据/h2>
正如我们已经讨论过的,实现图的两种最常见的方法是使用邻接矩阵和使用邻接表。当图是邻接矩阵时,我们倾向于使用邻接矩阵据E.m>稠密据/em>,即边的数目接近于可能的最大数目,即据span class="katex">
最小生成树据/h2>
一种据E.m>生成树据/em>对于一个无向图据span class="katex"> 是节点据span class="katex"> 与边缘的子集一起据span class="katex"> 那据/p>
- 连接节点,即,在生成树中仅使用边缘之间存在任何两个节点之间的路径;据/li>
- 形成一个未加速的无序树,即,没有(简单)的周期。据/li>
找出下面图的所有生成树。据span class="image-caption center">
通过简单的观察,我们发现4个跨越树。据span class="image-caption center">
现在假设图的边缘具有权重或长度。树的重量只是其边缘的权重的总和。显然,不同的跨越树具有不同的长度。这是问题:“你怎么能找到最小长度的树木?”据/p>
求下面加权图的最小生成树。据span class="image-caption center">
请记住,最小生成树是生成树,最小化边缘的总和。通过观察,我们看到以下是最小的生成树:据span class="image-caption center">
Kruskal的跨越树算法最小据/h2>
有几种用于查找最小跨越树的算法。我们将考虑一个特定的一个叫做据strong>Kruskal的算法据/strong>。算法如下执行:据/p>
克鲁斯卡算法据/strong>
- 设置空集据code>a = {}据/code>和据code>F = E据/code>, 在哪里据code>E.据/code>是所有边的集合。据/li>
选择边缘据code>E.据/code>在据code>F据/code>最小重量,并检查是否添加据code>E.据/code>到据code>一种据/code>创建一个循环。据/p>
- 如果它确实,请删除据code>E.据/code>从据code>F据/code>。据/li>
- 如果没有,移动据code>E.据/code>从据code>F据/code>到据code>一种据/code>。据/li>
如果据code>f = {}据/code>,停止并输出最小生成树据code>(v,a)据/code>。据/p>
kruskal的算法是一个很好的例子据E.m>贪婪算法据/em>,我们制作了一系列决策,每次都在做什么似乎最有时。本地决定是哪个边缘添加到形成的生成树。在每种情况下,我们通过完成周期选择不违反生成树的定义的最少标签的边缘。通常,局部最佳解决方案的整体效果不是全球最佳的。但是,Kruskal的算法是一种不正确的情况。据/p>
表明kruskal算法的运行时间是据span class="katex">