算法导论23章最小生成树习题—23.2练习

news2024/12/25 12:14:11

23.2-1对于同一个输人图,Kruskal 算法返回的最小生成树可以不同。这种不同来源于对边进行排序时,对权重相同的边进行的不同处理。证明:对于图G的每棵最小生成树T,都存在一种办法来对G的边进行排序,使得Kruskal算法所返回的最小生成树就是T。

假设我们想选择 T 作为最小生成树。然后,为了使用 Kruskal 算法获得此树,我们将首先按边的权重对边进行排序,然后通过选取包含在最小生成树中的一条边来解决边权重中的连接,并将所有不在T中的边权视为稍大,即使它们具有相同的实际权重。 通过这种排序,我们能够找到与所有最小生成树w(T)具有相同权重的树。但是,由于我们优先考虑在T中的边,因此我们将选择T中的边,而不是其他最小生成树中可能存在的任何其他边。
书上的kruskal:
在这里插入图片描述
在这里插入图片描述

23.2-2假定 我们用邻接矩阵来表示图G=(V, E)。请给出Prim算法的一种简单实现,使其运行时间为O(V2)。

在算法的每一步,我们将从到目前为止创建的树中的顶点添加一个边到不在树中的顶点,这样这条边的权重最小。因此,对于不在树中的每个顶点,知道从该顶点到树中某个权重最小的顶点的边将是有用的。我们将这些信息存储在数组 A 中,其中 A[u] = (v, w) , w 是 (u, v) 的权重,并且在从 u 到目前为止构建的树中的某个顶点 v 的边权重中最小。我们将使用 A[u].1 访问 v,使用 A[u].2 访问 w。

PRIM-ADJ(G, w, r)
#r为起点,G为图,w(r,i)为r到i的权值
    initialize A with every entry = (NIL,)
    T = {r}
    for i = 1 to V
        if Adj[r, i] != 0 #不为0说明r到i有边
            A[i] = (r, w(r, i))
    for each u in V - T#prim每次选择一个不在当前生成树中的最小权边加入树
        k = min(A[i].2)#连接k和树中结点所有边中最小边的权重
        T = T ∪ {k}
        k.π = A[k].1#k在树T中的父结点
        for i = 1 to V
            if Adj[k, i] != 0 and Adj[k, i] < A[i].2
                A[i] = (k, Adj[k, i])

书上的prim:
在这里插入图片描述

23.2-3对于稀疏图G=(V, E),这里|E| =Θ(V),使用斐波那契堆实现的Prim算法是否比使用二叉堆实现的算法更快?对于稠密图又如何呢?| E|和 |V|必须具备何种关系才能使斐波那契堆的实现在渐近级别上比二叉堆的实现更快?
用二进制堆实现的 Prim 算法的运行时为 O ( ( V + E ) lg ⁡ ( V ) ) O((V + E) \lg(V)) O((V+E)lg(V)),在稀疏情况下,它只是 O ( V lg ⁡ ( V ) ) O(V \lg(V)) O(Vlg(V))
斐波那契堆的实现是
O ( E + V lg ⁡ ( V ) ) O(E + V \lg(V)) O(E+Vlg(V)) = O ( V + V lg ⁡ ( V ) ) O(V + V \lg(V)) O(V+Vlg(V)) = O ( V lg ⁡ ( V ) ) O(V \lg(V)) O(Vlg(V))
因此,在稀疏图情况下,这两种算法具有相同的渐近运行时。
在稠密图的情况下,我们有二进制堆实现的运行时
O ( ( V + E ) lg ⁡ ( V ) ) O((V + E) \lg(V)) O((V+E)lg(V)) = O ( ( V + V 2 ) lg ⁡ ( V ) ) O((V + V 2 ) \lg(V)) O((V+V2)lg(V)) = O ( V 2 lg ⁡ ( V ) ) O(V^2 \lg(V)) O(V2lg(V))
然而,斐波那契堆实现的运行时为
O ( E + V lg ⁡ ( V ) ) O(E +V \lg(V)) O(E+Vlg(V)) = O ( V 2 + V lg ⁡ ( V ) ) O(V 2 +V \lg(V)) O(V2+Vlg(V)) = O ( V 2 ) O(V^2 ) O(V2)
因此,在稠密图的情况下,我们发现斐波那契堆实现渐近更快。
只要 E = ω ( V ) E = ω(V) E=ω(V),斐波那契堆实现就会渐近更快。假设我们有一些比线性增长更快的函数,比如 f , E = f ( V ) f,E = f(V) fE=f(V)
二进制堆实现将具有运行时
O ( ( V + E ) lg ⁡ ( V ) ) O((V + E) \lg(V)) O((V+E)lg(V)) = O ( ( V + f ( V ) ) lg ⁡ ( V ) ) O((V + f(V))\lg(V)) O((V+f(V))lg(V)) = O ( f ( V ) lg ⁡ ( V ) ) O(f(V ) \lg(V)) O(f(V)lg(V))
但是,我们有斐波那契堆实现的运行时将具有运行时
O ( E + V lg ⁡ ( V ) ) O(E + V \lg(V)) O(E+Vlg(V)) = O ( f ( V ) + V lg ⁡ ( V ) ) O(f(V ) + V \lg(V)) O(f(V)+Vlg(V))
这个运行时间是 O ( f ( V ) ) O(f(V)) O(f(V)) O ( V lg ⁡ ( V ) ) O(V \lg(V)) O(Vlg(V)),这取决于 f ( V ) f(V) f(V)的增长速度是否分别比 V lg ⁡ ( V ) V \lg(V) Vlg(V)快或慢。
无论哪种情况,我们的运行时间都比 O ( f ( V ) lg ⁡ ( V ) ) O(f(V )\lg(V)) O(f(V)lg(V))快。

23.2-4假定图中 的边权重全部为整数,且在范围1~|V|内。在此种情况下,Kruskal 算法最快能多快?如果边的权重取值范围在1到某个常数W之间呢?

如果边权重是 1 到 |V | 范围内的整数,我们可以通过使用计数排序在线性时间内按权重对边进行排序,使 Kruskal 算法在 O ( E α ( V ) ) O(E_α(V)) O(Eα(V)) 时间内运行。如果边权重是由常量限定的整数,采取相同的方法,因为运行时由决定边是否加入不相交森林的任务主导,这与边权重无关。

23.2-5假定图 中边的权重取值全部为整数,且在范围1~|V|内。Prim 算法最快能多快?如果边的权重取值范围在1到某个常数W之间呢?
如果边权重都在 1、. . . 、|V |,那么,我们可以想象将边添加到列表数组中,其中权重 i 的边进入数组索引 i 中的列表。然后,要减少一个元素,我们只需将其从当前包含它的列表中(常量时间)中删除,并将其添加到与其新值(也是常量时间)对应的列表中。为了提取最小的边缘,我们在包含非空列表的所有索引中维护一个链表,也可以只用恒定的额外工作来维护。由于所有这些操作都可以在恒定时间内完成,因此我们有一个总运行时间 O ( E + V ) O(E+V) O(E+V)。 如果边权重都位于某个有界范围中,假设在 1 到 W 的范围内。然后,我们可以只在第 20 章中给出的 vEB 树结构中在时间 O ( l g ( l g ( l g ( W ) ) ) O(lg(lg(lg(W))) OlglglgW中执行两个必需的操作,这意味着总运行时间可以设为 O ( ( V + E ) l g ( l g ( W ) ) ) O((V + E) lg(lg(W))) OV+ElglgW

23.2-6 假定一个图中所有的边权重均匀分布在半开区间[0,1)内。Prim算法和Kruskal算法哪一个可以运行得更快?
对于从均匀分布中提取的输入,使用带有 Kruskal 算法的桶排序,用于按权重对边进行预期的线性时间排序。这将实现预期的运行时 O ( E α ( V ) ) O(E_\alpha(V)) O(Eα(V))
 由于Prim算法时间主要耗费在维护优先级队列的性质上,加速的方法是使用更加复杂的数据结构,比如基数堆,斐波那契堆。

23.2-7 假定图G的一棵最小生成树已经被计算出来。如果在图中加入一个新结点及其相关的新边,我们需要多少时间来对最小生成树进行更新?

我们首先将所有边添加到新顶点。然后,我们预制一个根植于该顶点的DFS。当我们向下时,我们会跟踪自DFS中每个顶点以来迄今为止看到的最大权重边缘。我们从练习 23.3-6 中知道,在有向图中,我们不需要考虑交叉边缘或前向边缘。然后,我们检测到的每个循环都将由后边缘形成。因此,我们只是删除自我们处于后边缘将要到达的顶点以来看到的最大重量的边缘。然后,我们将继续前进,直到我们删除的顶点比我们添加的许多边的度数少一个。这最终将是线性时间,因为我们可以重用在检测每个周期之前已经计算的部分 DFS。

23.2-8 Borden 教授提出了一个新的分治算法来计算最小生成树。该算法的原理如下:给定图G=(V, E),将V划分为两个集合V1和V2,使得|V1|和|V2|的差最多为1。设E1为端点全部在V1中的边的集合,E2为端点全部在V2中的边的集合。我们递归地解决两个子图G1=(V1,E1)和G2=(V2, E2)的最小生成树问题。最后,在边集合E中选择横跨切割V1和V2的最小权重的边来将求出的两棵最小生成树连接起来,从而形成一棵最后的最小生成树。
请证明该算法能正确计算出一棵最小生成树,或者举出反例来明说该算法不正确。

博登教授错了。考虑具有 4 个顶点的图形:a、b、c 和 d。设边分别为 (a, b)、(b、c)、(c、d)、(d、a),权重分别为 1、5、1 和 5。设 V1 = {a, d} 和 V2 = {b, c}。然后每个树上只有一个边缘入射,因此我们必须在 V1 和 V2 上采用的树精确地由边缘 (a, d) 和 (b, c) 组成,总权重为 10。加上连接它们的权重 1 边缘,我们得到权重 11。但是,MST 将使用两个权重 1 边和仅使用权重 5 边中的一个,总权重为 7。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML+CSS+JS网页设计期末课程大作业——上海旅游景点(10页)web前端开发技术 web课程设计 网页规划与设计

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

离散化【带题讲解】

全文目录&#x1f914; 原理&#x1f615; 区间和&#x1f635;‍&#x1f4ab; 建立映射&#x1f635;‍&#x1f4ab; 查找映射的下标&#x1f635;‍&#x1f4ab; 代码&#x1f914; 原理 离散化&#xff0c;把无限空间中有限的个体映射到有限的空间中去&#xff0c;以此提…

NVIDIA 安装 CUDA

名词解释&#xff1a;CUDA 是一个架构 该架构使GPU能够解决复杂的计算问题 此实战使用电脑为联想Y9000P 显卡型号为 3060 在安装 CUDA 之前需要先打开 NVIDIA 控制面板 一、准备工作 如图我这个显卡需要安装 CUDA 11.7 的版本 二、下载软件 进入官网下载 CUDA NVIDIA Deve…

解放军军官军衔(不含士兵军衔)分为3等10级

军衔&#xff0c;是国家最高权力机关授予军人的一种衔称。不同的级别有不同的军衔。对于军衔的认识&#xff0c;一些朋友或许只有片面的认识&#xff0c;下面&#xff0c;笔者就给大家来科普一下中国的军衔。 为了纪念中国人民解放军建军93周年&#xff0c;弘扬爱国主义精神&a…

被迫毕业,面试 30 家公司,终于上岸了!

大家好&#xff0c;我是君哥。今天分享一个老弟&#xff0c;被“毕业”后的求职经历。 在老东家干了 6 年&#xff0c;发展一般&#xff0c;很想出去&#xff0c;但是一直没有合适的机会&#xff0c;只好一边准备面试一边学习。让我没有想到的是&#xff0c;突然收到了“毕业”…

(1-线性回归问题)线性回归(Linear regression)Lasso回归和Ridge回归的区别

回归分析是机器学习中的经典算法之一&#xff0c;用途广泛&#xff0c;在用实际数据进行分析时&#xff0c;可能会遇到以下两种问题 过拟合, overfitting欠拟合, underfitting 在机器学习中&#xff0c;首先根据一批数据集来构建一个回归模型&#xff0c;然后在用另外一批数据…

Vue 中 (moment)操作日期的加减与展示

目录 基本语法 &#xff1a; 展示效果如下&#xff1a; 使用方式&#xff1a; 1、首先在 pacaage.json 中引入依赖 "moment": "^2.29.4" 2、然后命令行 install 安装 &#xff1a; 3、最后&#xff0c;在使用的页面引入moment 4、data 中我定义了一个…

python的Django项目中常见命令以及常错点(Linux环境下)

USE 数据库名 --------------- 切换数据库更新virtualenv库&#xff08;用于创建虚拟环境&#xff09;&#xff1a;sudo pip install -U virtualenv创建虚拟环境&#xff1a;virtualenv -p python venv(虚拟环境的目录名)激活虚拟环境&#xff1a;source venv/b…

利用Python处理excel表格,panda合并表格、合并多个excel、多个sheet

前言 记录一下&#xff0c;在使用pandas处理excel表格表格时候&#xff0c;关于分割(切分)表格这一块儿的操作。 这个系列会有三篇左右文章&#xff0c;这是第二篇&#xff0c;excel表格合并 我们常说的 excel文件&#xff0c; 在广义上&#xff0c;是指以 xls 或 xlsx 为后缀…

[1173]regexp_replace()和regexp_substr()函数的用法

文章目录REGEXP_REPLACE的使用方法命令格式&#xff1a;regexp_replace(source, pattern, replace_string, occurrence)参数说明返回值常用案例其他案例正则符号释义regexp_substr()函数的用法REGEXP_REPLACE的使用方法 命令格式&#xff1a;regexp_replace(source, pattern, r…

PF-Net基于深度学习的点云补全网络

1. 论文和代码 论文&#xff1a;https://openaccess.thecvf.com/content_CVPR_2020/papers/Huang_PF-Net_Point_Fractal_Network_for_3D_Point_Cloud_Completion_CVPR_2020_paper.pdfhttps://openaccess.thecvf.com/content_CVPR_2020/papers/Huang_PF-Net_Point_Fractal_Netw…

微信小程序开发 开启

小程序和普通网页开发的区别 1.运行环境不同 小程序是运行在微信环境中&#xff0c;而网页是运行在浏览器环境中。 2.API不同 由于运行环境不同&#xff0c;所以小程序中&#xff0c;无法调用DOM和BOM的API。 但是&#xff0c;小程序中可以调用微信环境提供的各种API&#…

Vue框架常用组件的快速构建项目Ctrl+c Ctrl+a Ctrl+v第十四课)

不管前方的路有多苦&#xff0c;只要走的方向正确&#xff0c;不管多么崎岖不平&#xff0c;都比站在原地更接近幸福。 在学习技术的道路上&#xff1a;落后又要被挨打。这是现实 常用到的组件库:下面的网站在自己空闲时间去看看 下面的资源只需要ctrlc ctrla ctrv Border 边框…

业务:财务软件之会计六要素

一、引言 会计六要素是资产、负债、所有者权益、收入、费用、利润。资产随处可见&#xff0c;比如房屋、机器设备、运输工具、仓库里的货物等。负债确认必须具备以下条件&#xff1a;负债是企业承担的现时义务&#xff1b;负债预期会导致经济利益流出企业&#xff1b;负债是由…

[附源码]计算机毕业设计JAVA学生宿舍设备报修

[附源码]计算机毕业设计JAVA学生宿舍设备报修 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

MobileOne实战:使用MobileOne实现图像分类任务(二)

文章目录训练导入项目使用的库设置全局参数图像预处理与增强读取数据设置模型定义训练和验证函数训练函数验证函数调用训练和验证方法再次训练再次训练的模型为什么只保存model.state_dict()关于加入EMA后验证集不得分的问题测试总结在上一篇文章中完成了前期的准备工作&#x…

C# 反射(一)基础概念

一、C# 反射&#xff08;refection&#xff09;基础概念 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块&#xff0c;而模块包含类型&#xff0c;类型又包含成员。 反射则提供了封装程序集、模块和类型的对象。 您可以使用反射动态地创建类型…

Spring框架(七):Spring的Web配置应用

Spring的Web配置应用引子JavaWeb的三大组件模拟Spring的web开发组件spring-webSpring的web开发组件spring-web引子 痛定思痛&#xff0c;主要问题出现在自己雀氏不熟悉框架底层、一些面试题&#xff0c;以及sql的一些情况淡忘了。 本章节的开始是对于过去的重新回顾&#xff0…

MFC绘制二维图形【1】—— 使用映射模式函数自定义坐标系

目录 一、创建Test工程 二、自定义坐标系 三、映射模式&#xff08;MapMode&#xff09; 四、映射模式函数 1&#xff09;设置映射模式函数 2&#xff09;设置窗口范围函数 3)设置视区范围函数 4&#xff09;设置视区原点函数 5&#xff09;偏移矩形函数 五、 不改变…

MyTinySTL学习笔记:迭代器iterator(一)

前言 本系列文章所学习的Github上基于C11的开源项目MyTinySTL&#xff0c;项目地址为:&#xff08;https://github.com/Alinshans/MyTinySTL&#xff09;&#xff0c;感谢Alinshans大佬开源这个优质的学习项目。 一、什么是迭代器 无论是序列容器还是关联容器&#xff0c;最…