数据结构之最小生成树

数据结构之最小生成树

目录

数据结构之最小生成树

1. 引言

2. Prim算法

3. Kruskal算法

4. 性能分析与最佳实践


1. 引言

在图论中,最小生成树(Minimum Spanning Tree, MST)是一种在无向连通图中寻找一棵包含所有顶点的树,使得树的边权值之和最小的算法。最小生成树问题在实际中有广泛的应用,例如网络设计、交通规划等领域。本文将深入探讨两种著名的最小生成树算法:Prim算法和Kruskal算法。

2. Prim算法

2.1 基本原理

Prim算法是一种贪心算法,它从一个顶点开始,逐步扩展已选取的顶点集合,直到覆盖所有顶点。在每一步中,都选择一条连接已选取顶点集合与未选取顶点集合的最短边,并将其加入最小生成树中。

 2.2 算法步骤

1. 初始化一个空的最小生成树和一个包含起始顶点的顶点集合。
2. 在所有连接已选取顶点集合与未选取顶点集合的边中,找到权值最小的边,并将其加入最小生成树。
3. 将该边的另一端点加入已选取顶点集合。
4. 重复步骤2和3,直到所有顶点都被选取。

2.3 代码示例


import heapq

def prim(graph):
    mst = []
    visited = [0]
    edges = [
        (cost, start, to)
        for start in range(len(graph))
        for to, cost in graph[start].items()
    ]
    heapq.heapify(edges)

    while edges:
        cost, start, to = heapq.heappop(edges)
        if to not in visited:
            visited.append(to)
            mst.append((start, to, cost))
            for to_next, cost2 in graph[to].items():
                if to_next not in visited:
                    heapq.heappush(edges, (cost2, to, to_next))

    return mst
```

3. Kruskal算法

 3.1 基本原理

Kruskal算法基于边的排序,首先将所有边按照权值从小到大排序,然后依次选择边加入最小生成树中,如果加入这条边不会形成环,则将其加入最小生成树,否则继续选择下一条边。

3.2 算法步骤

1. 将所有边按照权值从小到大排序。
2. 初始化一个空的最小生成树。
3. 遍历排序后的边列表,对于每条边,检查加入最小生成树后是否会形成环。
4. 如果不会形成环,将边加入最小生成树;否则继续遍历下一条边。
5. 重复步骤3和4,直到最小生成树包含所有顶点。

 3.3 代码示例


def kruskal(graph):
    def find(parent, i):
        if parent[i] == i:
            return i
        return find(parent, parent[i])

    def union(parent, rank, x, y):
        root_x = find(parent, x)
        root_y = find(parent, y)
        if root_x != root_y:
            if rank[root_x] > rank[root_y]:
                parent[root_y] = root_x
            else:
                parent[root_x] = root_y
                if rank[root_x] == rank[root_y]:
                    rank[root_y] += 1

    mst = []
    edges = [
        (cost, start, to)
        for start in range(len(graph))
        for to, cost in graph[start].items()
    ]
    edges.sort()

    parent = [i for i in range(len(graph))]
    rank = [0] * len(graph)

    for cost, start, to in edges:
        if find(parent, start) != find(parent, to):
            mst.append((start, to, cost))
            union(parent, rank, start, to)

    return mst
 

4. 性能分析与最佳实践

- Prim算法:适用于稠密图,因为它需要维护一个顶点集合,所以空间复杂度较高。在实际应用中,可以使用斐波那契堆等数据结构优化其性能。
- Kruskal算法:适用于稀疏图,因为它基于边的排序,所以时间复杂度较低。在实际应用中,可以使用并查集等数据结构优化其性能。

在选择合适的最小生成树算法时,需要根据具体问题的特点进行权衡。例如,在网络设计中,如果边的数量远大于顶点的数量,那么Kruskal算法可能更合适;而在交通规划中,如果顶点之间的连接较为复杂,那么Prim算法可能更合适。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/593910.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何进行Go语言的性能测试和调优?

文章目录 开篇一、性能测试1. 使用标准库中的testing包2. 使用第三方工具 二、性能调优1. 优化算法和数据结构2. 减少不必要的内存分配和垃圾回收3. 并发和并行 结尾 开篇 Go语言以其出色的性能和简洁的语法受到了广大开发者的喜爱。然而,在实际开发中,…

39.乐理基础-拍号-认识音符

拍号是一个分数的形式,如下图篮色的圈圈里的东西,但它的实际意义和分数没什么关系,只是外观上是一个分数的形式 单独拿出拍号,如下图: 然后接下来只要搞懂什么是 Y分音符、一拍、小节就可以了。 音符: 控…

Java | Leetcode Java题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; class Solution {public String addBinary(String a, String b) {StringBuffer ans new StringBuffer();int n Math.max(a.length(), b.length()), carry 0;for (int i 0; i < n; i) {carry i < a.length() ? (a.charAt(a.leng…

特征提取(Feature Extraction)常见统计特征笔记(三)

统计特征是描述数据集中值的一组量&#xff0c;通常用于了解数据的分布、集中趋势和变异程度。常见的统计特征包括均值、中位数、众数、标准差、方差等。下面会详细解释每个统计特征&#xff0c;并给出相应的Python代码。 1、均值&#xff08;Mean&#xff09;&#xff1a;所有…

分布式存储 Ceph 的演进经验

从 2004 年到今天&#xff0c;Ceph 的存储后端一直都在演变&#xff0c;从最开始基于 B 树的 EBOFS 演变到今天的 BlueStore&#xff0c;存储后端已经变得非常成熟&#xff0c;新的存储系统不仅能够提供良好的性能&#xff0c;还有着优异的兼容性。我们在这篇文章中将要简单介绍…

华为eNSP小型园区网络配置(上)

→跟着大佬学习的b站直通车← 目标1&#xff1a;dhcp分配ip地址 目标2&#xff1a;内网用户访问www.yzy.com sw1 # vlan batch 10 # interface Ethernet0/0/1port link-type accessport default vlan 10 # interface Ethernet0/0/2port link-type trunkport trunk allow-pass…

【Linux】网络连接配置——nmcli工具配置连接增删改查实例

nmcli工具配置连接增删改查实例 &#xff08;一&#xff09;网络连接配置基本项目1.网络接口配置2.主机名配置3.DNS服务器配置 &#xff08;二&#xff09;网络连接配置文件&#xff08;三&#xff09;网络配置方法&#xff08;四&#xff09;nmcli工具配置连接管理1.增2.查3.改…

prometheus+grafana的安装与部署及优点

一、Prometheus 的优点 1、非常少的外部依赖&#xff0c;安装使用超简单&#xff1b; 2、已经有非常多的系统集成 例如&#xff1a;docker HAProxy Nginx JMX等等&#xff1b; 3、服务自动化发现&#xff1b; 4、直接集成到代码&#xff1b; 5、设计思想是按照分布式、微服…

GPT-3

论文&#xff1a;Language Models are Few-Shot Learners&#xff08;巨无霸OpenAI GPT3 2020&#xff09; 摘要 最近的工作表明&#xff0c;通过对大量文本进行预训练&#xff0c;然后对特定任务进行微调&#xff0c;在许多NLP任务和基准方面取得了实质性进展。虽然这种方法…

stm32单片机开发二、定时器-内部时钟中断和外部时钟中断、编码器

定时器本质就是一个计数器 案例&#xff1a;定时器定时中断 内部时钟中断 Timer_Init(); //定时中断初始化 /*** 函 数&#xff1a;定时中断初始化* 参 数&#xff1a;无* 返 回 值&#xff1a;无*/ void Timer_Init(void) {/*开启时钟*/RCC_APB1PeriphClockCmd(RCC…

【AI】指定python3.10安装Jupyter Lab

家里电脑 13900K, bash 不识别pythoncmd可以,但是cmd似乎默认是python2.7这个是webrtc构建需要的.python3 则可以识别到但是版本是python3.12*多个版本如何通过制定的python3.10 的pip来安装软件,例如Jupyter Lab安装3.10 C:\Users\zhangbin\AppData\Roaming\Microsoft\Windo…

网络安全之从原理看懂XSS

01、XSS的原理和分类 跨站脚本攻击XSS(Cross Site Scripting)&#xff0c;为了不和层叠样式表(Cascading Style Sheets&#xff0c;CSS)的缩写混淆 故将跨站脚本攻击缩写为XSS&#xff0c;恶意攻击者往Web页面里插入恶意Script代码&#xff0c;当用户浏览该页面时&#xff0c…

【附poc】新中新中小学智慧校园信息管理系统存在SQL注入漏洞

新中新中小学智慧校园信息管理系统介绍&#xff1a;新中新利用云服务技术同时借鉴互联网模式&#xff0c;围绕基础教育信息化、智慧化建设&#xff0c;把线下业务和线上业务结合&#xff0c;为教育主管部门、校园管理者、教师、学生以及家长提供具有教务管理功能的平台化、移动…

基于TL431基准电压源的可调恒压恒流源的Multisim电路仿真设计

1、线性电源的工作原理 在我们日常应用里&#xff0c;直流电是从市电或电网中的交流电获取的。例如15V直流电压源、24V直流电压源等等。交流电变为直流电的过程大概分为一下几步&#xff1a; 首先&#xff0c;交流电通过变压器降低其电压幅值。接着&#xff0c;经过整流电路进…

八、Linux进程检测与控制

章节目标 了解进程和程序的关系了解进程的特点能够使用top动态查看进程信息能够使用ps静态查看进程信息能够使用kill命令给进程发送信号能够调整进程的优先级&#xff08;扩展&#xff09; 引言 在运维的日常工作中&#xff0c;监视系统的运行状况是每天例行的工作&#xff…

Spring IoCDI (1)

目录 一、IoC & DI入门 1、Spring是什么 &#xff08;1&#xff09;什么是容器&#xff1f; &#xff08;2&#xff09;什么是IoC&#xff1f; 二、IoC介绍 1、传统程序开发 2、解决方案 3、IoC程序开发 4、IoC优势 三、DI介绍 通过前面的学习&#xff0c;我们知…

分布式与一致性协议之ZAB协议(二)

ZAB协议 ZAB协议是如何实现操作地顺序性的&#xff1f; 如果用一句话解释ZAB协议到底是什么&#xff0c;我觉得它是能保证操作顺序性的、基于主备模式的原子广播协议。 接下来&#xff0c;还是以指令X、Y为例具体演示一下&#xff0c;帮助你更好地理解为什么ZAB协议能实现操作…

力扣每日一题113:路径总和||

题目 中等 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSu…

【R语言数据分析】函数

目录 自定义函数 apply函数 分类汇总函数aggregate 自定义函数 R语言中的自定义函数更像是在自定义一种运算规则。 自定义函数的语法是 函数名 函数体 } 比如 表示定义了一个名为BMI_function的函数&#xff0c;这个函数代表了一种运算规则&#xff0c;就是把传入的x和…

stm32开发之netxduo网口通讯,网线热插拔处理

前言 在使用netxduo组件时&#xff0c;如果在上电过程中&#xff0c;未插入网线&#xff0c;eth驱动使能过程中未正常初始化本次使用以下几种方式进行设置 问题原因 使用定时器事件回调方式 网络组件中进行调整 /** Copyright (c) 2024-2024&#xff0c;shchl** SPDX-Licen…
最新文章