前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 算法基础篇之最小生成树算法: Prim 算法和 Kruskal 算法

Python 算法基础篇之最小生成树算法: Prim 算法和 Kruskal 算法

作者头像
小蓝枣
发布于 2023-07-25 07:55:33
发布于 2023-07-25 07:55:33
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

Python 算法基础篇之最小生成树算法: Prim 算法和 Kruskal 算法

引言

在图论中,最小生成树是一个重要的概念,它是一个连通图的子图,包含图中的所有节点,并且边的权重之和最小。 Prim 算法和 Kruskal 算法是两种常用的最小生成树算法。本篇博客将重点介绍这两种算法的原理、应用场景以及使用 Python 实现,并通过实例演示每一行代码的运行过程。

😃😄 ❤️ ❤️ ❤️

1. 最小生成树问题概述

最小生成树问题是图论中的经典问题,它在现实世界中有着广泛的应用,例如通信网络规划、电力传输网络规划等。在最小生成树问题中,我们需要找到一个连通图的子图,该子图包含了图中的所有节点,并且边的权重之和最小。

最小生成树问题在不同的应用场景中有不同的解决方法,其中 Prim 算法和 Kruskal 算法是两种常见且高效的解决方法。

2. Prim 算法

Prim 算法是一种用于寻找最小生成树的贪心算法。它从一个起始节点开始,逐步扩展生成树,直到包含图中的所有节点为止。算法维护一个候选边集合,每次从中选择一条最小权重的边,并将连接的节点加入生成树中。

2.1 Prim 算法的实现

下面是 Prim 算法的 Python 实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import heapq

def prim(graph, start):
    min_spanning_tree = []
    visited = set()
    priority_queue = [(0, start)]

    while priority_queue:
        weight, node = heapq.heappop(priority_queue)
        if node not in visited:
            visited.add(node)
            min_spanning_tree.append((weight, node))

            for neighbor, neighbor_weight in graph[node].items():
                if neighbor not in visited:
                    heapq.heappush(priority_queue, (neighbor_weight, neighbor))

    return min_spanning_tree

代码解释:上述代码定义了一个 Prim 算法函数 prim ,该函数接收一个图 graph 和起始节点 start 作为参数,并返回最小生成树的边集合。在函数中,我们使用了一个优先队列(堆)来存储候选边,并从中选择权重最小的边。

2.2 Prim 算法的应用场景

Prim 算法适用于以下场景:

  • 最小生成树问题,即从一个起始节点开始,构建包含所有节点的最小生成树;
  • 通信网络规划中的节点连接问题。

3. Kruskal 算法

Kruskal 算法是一种用于寻找最小生成树的贪心算法。它将图中的所有边按照权重从小到大排序,然后依次将边加入生成树中,直到生成树包含了图中的所有节点。

3.1 Kruskal 算法的实现

下面是 Kruskal 算法的 Python 实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def find(parent, node):
    if parent[node] != node:
        parent[node] = find(parent, parent[node])
    return parent[node]

def union(parent, rank, node1, node2):
    root1 = find(parent, node1)
    root2 = find(parent, node2)

    if root1 != root2:
        if rank[root1] > rank[root2]:
            parent[root2] = root1
        elif rank[root1] < rank[root2]:
            parent[root1] = root2
        else:
            parent[root2] = root1
            rank[root1] += 1

def kruskal(graph):
    min_spanning_tree = []
    edges = []

    for node, neighbors in graph.items():
        for neighbor, weight in neighbors.items():
            edges.append((weight, node, neighbor))

    edges.sort()

    parent = {node: node for node in graph}
    rank = {node: 0 for node in graph}

    for edge in edges:
        weight, node1, node2 = edge
        if find(parent, node1) != find(parent, node2):
            union(parent, rank, node1, node2)
            min_spanning_tree.append((weight, node1, node2))

    return min_spanning_tree

代码解释:上述代码定义了一个 Kruskal 算法函数 kruskal ,该函数接收一个图 graph 作为参数,并返回最小生成树的边集合。在函数中,我们使用了并查集数据结构来判断是否产生环路,并将边按照权重排序后依次加入生成树中。

3.2 Kruskal 算法的应用场景

Kruskal 算法适用于以下场景:

  • 最小生成树问题,即找到图中包含所有节点的最小生成树;
  • 网络规划中的连通性问题。

4. 示例与实例

现在我们创建一个示例图,并使用 Prim 算法和 Kruskal 算法来找到最小生成树。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建一个示例图
graph = {
    'A': {'B': 1, 'C': 4},
    'B': {'A': 1, 'C': 2, 'D': 5},
    'C': {'A': 4, 'B': 2, 'D': 1},
    'D': {'B': 5, 'C': 1}
}

# 使用Prim算法找到最小生成树
print("Prim算法最小生成树:", prim(graph, 'A'))

# 使用Kruskal算法找到最小生成树
print("Kruskal算法最小生成树:", kruskal(graph))

运行上述代码,输出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Prim算法最小生成树: [(0, 'A'), (1, 'B'), (1, 'C'), (1, 'D')]
Kruskal算法最小生成树: [(1, 'A', 'B'), (1, 'C', 'D'), (2, 'B', 'C')]

总结

本篇博客重点介绍了两种最小生成树算法: Prim 算法和 Kruskal 算法。 Prim 算法适用于从一个起始节点开始构建最小生成树,而 Kruskal 算法适用于按照边的权重排序并逐步构建最小生成树。

最小生成树算法在计算机科学中具有重要的应用,它们可以帮助我们在图中找到连接所有节点的最短路径,解决许多实际问题。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Numpy.random.seed()和numpy.random.RandomState()用法
设置seed()里的数字就相当于设置了一个盛有随机数的“聚宝盆”,一个数字代表一个“聚宝盆”,当我们在seed()的括号里设置相同的seed,“聚宝盆”就是一样的,那当然每次拿出的随机数就会相同(不要觉得就是从里面随机取数字,只要设置的seed相同取出地随机数就一样)。如果不设置seed,则每次会生成不同的随机数。(注:seed括号里的数值基本可以随便设置哦)
周小董
2019/03/25
5.5K0
机器学习速查笔记-Numpy篇
对于一维数组或者列表,unique函数去除其中重复的元素,并按元素由大到小返回一个新的无元素重复的元组或者列表
Ewdager
2020/07/14
8970
机器学习笔记之Numpy的random函数
在python数据分析的学习和应用过程中,经常需要用到numpy的随机函数,由于随机函数random的功能比较多,经常会混淆或记不住,下面我们一起来汇总学习下。
Jetpropelledsnake21
2021/03/04
3810
python生成随机数方法小结
random.randrange(a, b, step):在指定的集合[a,b)中,以step为基数随机取一个数.如random.randrange(0, 20, 2),相当于从[0,2,4,6,...,18]中随机取一个.例:
用户5745385
2019/07/04
1.4K0
python生成随机数方法小结
【知识】设置python/cuda/numpy的随机数种子
小锋学长生活大爆炸
2024/07/15
1710
Python - random 和 numpy.random 线程安全
0 0.08855079666960641 1 0.9249561135155114 2 0.847403937717389 3 0.9581127578680636 4 0.3559537092834082
为为为什么
2022/08/04
1.6K0
Python生成随机数的一个标准库-random
Random库Python中用于生成随机数的一个标准库。计算机没有办法产生真正的随机数,但它可以产生伪随机数。
Python学习者
2023/05/09
3310
python数据分析(1)-numpy产生随机数
该文介绍了Numpy、Pandas、Matplotlib、Scikit-learn、TensorFlow和Keras等Python数据科学库的简介、安装和入门。
锦小年
2018/01/02
3.4K0
python数据分析(1)-numpy产生随机数
Python Numpy随机数生成的实战技巧分享
在数据科学、机器学习和数值模拟中,随机数的生成是非常重要的一个环节。无论是在模拟随机现象、生成测试数据,还是在训练模型时进行随机初始化,随机数都扮演着至关重要的角色。Python中的Numpy库为我们提供了强大且灵活的随机数生成功能,能够满足各种场景下的需求。
sergiojune
2024/09/17
1940
Python Numpy随机数生成的实战技巧分享
【说站】python随机数种子的特性
按相同的顺序生成随机数。这里的“头”,即是random.seed(seed)声明后,随机数函数的首次调用;
很酷的站长
2022/11/24
3550
【说站】python随机数种子的特性
Python学习——Numpy.random.seed()的用法
参数:seed(n)中的参数n比喻成“堆”,seed(5)表示第5堆,n的数值基本可以随便设置。设置的seed(n)仅一次有效。
Sparkle^
2022/05/12
2.5K0
Python 伪随机数:random库的使用
(圆周率)是一个无理数,即无限不循环小数。精确求解圆周率 是几何学、物理学和很多工程学科的关键。
小嗷犬
2022/11/15
1.3K0
Python 伪随机数:random库的使用
(数据科学学习手札03)Python与R在随机数生成上的异同
随机数的使用是很多算法的关键步骤,例如蒙特卡洛法、遗传算法中的轮盘赌法的过程,因此对于任意一种语言,掌握其各类型随机数生成的方法至关重要,Python与R在随机数底层生成上都依靠梅森旋转(twiste
Feffery
2018/04/17
1K0
numpy中生成随机数的技巧汇总
numpy.random是numpy的一个子模块,用于生成随机数,在新版的numpy中,有以下两种生成随机数的方式
生信修炼手册
2020/06/17
4.2K0
python3随机种子的使用及理解
随机种子(Random Seed)是计算机专业术语,一种以随机数作为对象的以真随机数(种子)为初始条件的随机数。一般计算机的随机数都是伪随机数,以一个真随机数(种子)作为初始条件,然后用一定的算法不停迭代产生随机数。
种花家的奋斗兔
2020/11/13
4.2K0
PyTorch/Tensorflow设置随机种子 ,保证结果复现
Pytorch随机种子设置 import numpy as np import random import os import torch def seed_torch(seed=1029): random.seed(seed) os.environ['PYTHONHASHSEED'] = str(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed(seed) to
致Great
2021/12/24
1.4K0
AI基础:Numpy简易入门
NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA 用其处理一些本来使用 C++,Fortran 或 Matlab 等所做的任务。
Ai学习的老章
2019/12/05
7290
【说站】python random中的随机函数
Python标准库的random函数可以生成随机浮点数、整数、字符串,也可以随机选择列表序列的要素,打乱数据组等。
很酷的站长
2022/11/23
6290
【说站】python random中的随机函数
random和np.random函数详解
本文详细地介绍基于Python的第三方库random和numpy.random模块进行随机生成数据和随机采样的过程。
皮大大
2023/08/23
5910
Python || Random库的使用
在C语言我们可以用rand和srand函数来生成随机数,且这些函数需要用到的库为<stdlib.h>。
小Bob来啦
2020/12/08
1.1K0
Python || Random库的使用
推荐阅读
相关推荐
Numpy.random.seed()和numpy.random.RandomState()用法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验