【算法分析与设计】贪心算法(下)

目录

  • 一、单源最短路径
    • 1.1 算法基本思想
    • 1.2 算法设计思想
    • 1.3 算法的正确性和计算复杂性
    • 1.4 归纳证明思路
    • 1.5 归纳步骤证明
  • 二、最小生成树
    • 2.1 最小生成树性质
      • 2.1.1 生成树的性质
      • 2.1.2 生成树性质的应用
    • 2.2 Prim算法
    • 2.2.1 正确性证明
    • 2.2.2 归纳基础
    • 2.2.3 归纳步骤
    • 2.3 Kruskal算法
      • 2.3.1 证明思路
      • 2.3.2 归纳步骤证明
      • 2.3.3 T是G的最小生成树
    • 2.4 应用:数据分组问题
    • 2.5 单链聚类
  • 三、多机调度问题
  • 四、小结


一、单源最短路径

  给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在 要计算从源到所有其它各顶点的最短路长度这里路的长度是指路上各边权之和这个问题通常称为单源最短路径问题

1.1 算法基本思想

  Dijkstra算法是解单源最短路径问题的贪心算法。
  Dijkstra算法有关概念:
  X∈S←→x∈V且从s到x的最短路径已经找到
  初始:S={s},S=V时算法结束
  从s到u相对于S的最短路径:从s到u且经过S中顶点的最短路径
  dist[u]:从s到u相对S最短路径的长度
  short[u]:从s到u的最短路径的长度
  dist[u]>=short[u]


1.2 算法设计思想

  输入:有向图G=(V,E),V={1,2,…,n},s=1
  输出:从s到每个顶点的最短路径
  1.初始S={1}
  2.对于i∈V-S,计算1到i的相对S的最短路,长度dist[i],没有路可记为∞或maxint
  3.选择V-S中dist值最小的j,将j加入S,修改V-S中顶点的dist值
  4.继续上述过程,直到S=V为止

  其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知
  初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度

  例如,对 右图中的有向图,应用Dijkstra算法计算从源顶点1到其它顶点间最短路径的过程列在下页的表中
在这里插入图片描述
  Dijkstra算法的迭代过程:
在这里插入图片描述


1.3 算法的正确性和计算复杂性

  (1)贪心选择性质
  (2)最优子结构性质
  (3)计算复杂性
  对于具有n个顶点和e条边的带权有向图,如果用带权邻接矩阵表示这个图,那么Dijkstra算法的主循环体 需要在这里插入图片描述时间。这个循环需要执行n-1次,所以完成循环需要在这里插入图片描述时间。算法的其余部分所需要时间不超过在这里插入图片描述


1.4 归纳证明思路

  命题:当算法进行到第k步时,对于S中每个结点i,dist[i]=short[i]
  归纳基础
  k=1,S={s},dist[s]=short[s]=0
  归纳步骤
  证明:假设命题对k为真,则对k+1命题也为真


1.5 归纳步骤证明

  假设命题对k为真,考虑k+1步算法选择顶点v(边<u,v>)。需要证明dist[v]=short[v]
若存在另一条s-v路径L,最后一次出S的顶点为x,经过V-s的第一个顶点y,再由y经过一段在V-S中的路径到达v
在这里插入图片描述


二、最小生成树

  设G =(V,E)是无向连通带权图,即一个网络。E中每条边(v,w)的权为c[v][w]。如果G的子图G’是一棵包含G的所有顶点的树,则称G’为G的生成树生成树上各边权的总和称为该生成树的耗费。在G的所有生成树中,耗费最小的生成树称为G的最小生成树。
  网络的最小生成树在实际中有广泛应用。例如,在设计通信网络时,用图的顶点表示城市,用边(v,w)的权c[v][w]表示建立城市v和城市w之间的通信线路所需的费用,则最小生成树就给出了建立通信网络的最经济的方案。


2.1 最小生成树性质

  用贪心算法设计策略可以设计出构造最小生成树的有效算法。本节介绍的构造最小生成树的Prim算法Kruskal算法都可以看作是应用贪心算法设计策略的例子。尽管这2个算法做贪心选择的方式不同,它们都利用了下面的最小生成树性质:
  设G=(V,E)是连通带权图,U是V的真子集。如果(u,v)E,且uU,vV-U,且在所有这样的边中,(u,v)的权c[u][v]最小,那么一定存在G的一棵最小生成树,它以(u,v)为其中一条边。这个性质有时也称为MST性质


2.1.1 生成树的性质

  设G是n阶连通图,那么
  T是G的生成树,当且仅当T无圈且有n-1条边
  如果T是G的生成树,e不属于T那么T∪{e}含有一个圈C(回路)。
  去掉圈C的任意一条边,就得到G的另一棵生成树T’。


2.1.2 生成树性质的应用

  算法步骤:选择边
  约束条件:不形成回路
  截止条件:边数达到n-1
  改进生成树T的方法:
  在T中加一条非树边e,形成回路C,在C中去掉一条树边ei,形成一颗新的生成树T’
  W(T’)-W(T)=W(e)-W(ei)
  若W(e)<=W(ei),则 W(T’)<=W(T)


2.2 Prim算法

  设G=(V,E)是连通带权图,V={1,2,…,n}。
  构造G的最小生成树的Prim算法的基本思想是:首先置S={1},然后,只要S是V的真子集,就作如下的贪心选择:选取满足条件iS,jV-S,且c[i][j]最小的边,将顶点j添加到S中。这个过程一直进行到S=V时为止。
  在这个过程中选取到的所有边恰好构成G的一棵最小生成树。

  利用最小生成树性质和数学归纳法容易证明,上述算法中的边集合T始终包含G的某棵最小生成树中的边。因此,在算法结束时,T中的所有边构成G的一棵最小生成树
  例如,对于右图中的带权图,按Prim算法选取边的过程如下页图所示。
在这里插入图片描述
在这里插入图片描述


2.2.1 正确性证明

  命题:对于任意k<n,存在一棵最小生成树包含算法前k步选择的边
  归纳基础:k=1,存在一棵最小生成树T包含边e={1,i},其中 {1,i}是所有关联1的边中权最小的。
  归纳步骤:假设算法前k步选择的边构成一棵最小生成树的边,则算法前k+1步选择的边也构成一棵最小生成树的边


2.2.2 归纳基础

  证明:存在一棵最小生成树T包含关联结点1的最小权的边e={1,i}
  证:设T为一棵最小生成树,假设T不包含{1,i},则T∪ {1,i}含有一条回路,回路中关联1的另一条边{1,j}。用{1,i} 替换{1,j}得到树T’,则T’也是生成树,且W(T’)<=W(T)
在这里插入图片描述


2.2.3 归纳步骤

  假设算法进行了k步,生成树的边为e1,e2,…ek,这些边的端点构成集合S。由归纳假设存在G的一棵最小生成树T包含这些边
  算法第k+1步选择顶点ik+1,则ik+1到S中顶点边权最小,设此边ek+1={ik+1,il},若ek+1∈T,算法k+1步显然正确

  假设T不含有ek+1,则将ek+1加到T中形成一条回路。这条回路有另外一条中顶点的边e连接S与V-S中顶点的边e,
  令T*=(T-{e})∪{ek+1}则T是G的一棵生成树,包含e1,e2,…ek+1,且W(T)<=W(T)算法到k+1步仍得到最小生成树
在这里插入图片描述
  在上述Prim算法中,还应当考虑如何有效地找出满足条件iS,jV-S,且权c最小的边(i,j)。实现这个目的的较简单的办法是设置2个数组closest和lowcost
  在Prim算法执行过程中,先找出V-S中使lowcost值最小的顶点j,然后根据数组closest选取边(j,closest[j]),最后将j添加到S中,并对closest和lowcost作必要的修改
用这个办法实现的Prim算法所需的计算时间为在这里插入图片描述


2.3 Kruskal算法

  Kruskal算法构造G的最小生成树的基本思想是,首先将G的n个顶点看成n个孤立的连通分支将所有的边按权从小到大排序然后从第一条边开始,依边权递增的顺序查看每一条边,并按下述方法连接2个不同的连通分支当查看到第k条边(v,w)时,如果端点v和w分别是当前2个不同的连通分支T1和T2中的顶点时,就用边(v,w)将T1和T2连接成一个连通分支,然后继续查看第k+1条边如果端点v和w在当前的同一个连通分支中,就直接再查看第k+1条边这个过程一直进行到只剩下一个连通分支时为止
  例如,对前面的连通带权图,按Kruskal算法顺序得到的最小生成树上的边如下图所示。
在这里插入图片描述
  命题:对于任意n,算法对n阶图找到一棵最小生成树

2.3.1 证明思路

  归纳基础 证明:n=2,算法正确。G只有一条边,最小生成树就是G
  归纳步骤 证明:假设算法对于n阶图是正确的,其中n>1,则对于任何n+1阶图算法也得到一棵最小生成树
  短接操作:任意给n+1个顶点的图G,G中最小边的权e={i,j},从G中合并i和j,得到图G’


2.3.2 归纳步骤证明

  对于任意n+1阶图G短接最短边e,得到n阶图G’
  根据归纳假设算法得到G’的最小生成树T’
  将被短接的边e“拉伸”回到原来长度,得到树T
  证明T是G的最小生成树
在这里插入图片描述


2.3.3 T是G的最小生成树

  T=T’∪{e}是关于G的最小生成树
  否则存在G的含边e的最小生成树
  T*,W(T*)<W(T)。(如果e不属于T*,在T中加边e,形成回路。去掉回路中任意别的边  所得生成树的权仍旧最小)在T短接e得到G’的生成树T*-{e},
  W(T*-{e})=W(T*)-w(e)<W(T)-w(e)=W(T’),与T’的最优性矛盾

  关于集合的一些基本运算可用于实现Kruskal算法。
  按权的递增顺序查看等价于对优先队列执行removeMin运算。可以用实现这个优先队列。
  对一个由连通分支组成的集合不断进行修改,需要用到抽象数据类型并查集UnionFind所支持的基本运算。
  当图的边数为e时,Kruskal算法所需的计算时间是: 在这里插入图片描述。当 在这里插入图片描述时,Kruskal算法比Prim算法差,但当 在这里插入图片描述时,Kruskal算法却比Prim算法好得多。


2.4 应用:数据分组问题

  一组数据(照片、文件等)要把它们按照相关性进行分类
  用相似度函数或者“距离”来描述个体之间的差异
  分成几类?使得每类内部的个体尽可能相近,不同类之间的个体尽可能地“远离”。如何划分?


2.5 单链聚类

  类似于Kruskal算法。
  按照边长从小到大对边排序
  依次考察当前最短边e,如果e与已经选中的边不构成回路,则把e加入集合,否则跳过e。记数图的连通分支个数
  直到保留了k个连通分支为止


三、多机调度问题

  多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。
  约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。作业不能拆分成更小的子作业。
这个问题是NP完全问题,到目前为止还没有有效的解法。对于这一类问题,用贪心选择策略有时可以设计出较好的近似算法。
采用最长处理时间作业优先的贪心选择策略可以设计出解多机调度问题的较好的近似算法。
  按此策略,当 在这里插入图片描述时,只要将机器i的[0, ti]时间区间分配给作业i即可,算法只需要O(1)时间。
  当 在这里插入图片描述时,首先将n个作业依其所需的处理时间从大到小排序。然后依此顺序将作业分配给空闲的处理机。算法所需的计算时间为O(nlogn)。

  例如,设7个独立作业{1,2,3,4,5,6,7}由3台机器M1,M2和M3加工处理。各作业所需的处理时间分别为{2,14,4,16,6,5,3}。按算法greedy产生的作业调度如下图所示,所需的加工时间为17。
在这里插入图片描述


四、小结

  贪心算法 通常用来求最优解
  总是在当前情况下选择局部最优解,依次进行下去得到整体最优解
  当前最佳选择通常是很容易找到的
  贪心算法必须进行正确性证明,一般使用数学归纳法
  第一步是显然的
  归纳步骤通常使用反证法证明,举反例证伪

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重新认识mysql

title: “重新认识mysql” createTime: 2022-03-06T15:52:4108:00 updateTime: 2022-03-06T15:52:4108:00 draft: false author: “ggball” tags: [“mysql”] categories: [“db”] description: “” 文章目录 title: "重新认识mysql" createTime: 2022-03-06T15:…

Ghostscript 在 Linux 和 Windows 系统的应用与问题解决

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

windows WSL配置cuda,pytorch和jupyter notebook

机器配置 GPU: NVIDIA Quadro K2000 与 NVIDIA 驱动程序捆绑的CUDA版本 但按照维基百科的描述&#xff0c;我的GPU对应的compute capability3.0&#xff0c;允许安装的CUDA最高只支持10.2&#xff0c;如下所示。 为什么本地会显示11.4呢&#xff1f;对此&#xff0c;GPT是这…

QSS之QScrollArea

QScrollArea在实际的开发过程中经常使用&#xff0c;主要是有些界面一屏显示不下&#xff0c;所以得用QScorllArea带滚动条拖动显示剩余的界面。默认的QScrollArea滚动条不满设计的风格&#xff0c;因此我们必须设置自已的滚动条风格&#xff0c;QScrollBar分为水平horizontal和…

ORACLE Redo Log Buffer 重做日志缓冲区机制的设计

最近和朋友包括一些国产数据库的研发人员交流&#xff0c;很多程序员认为 Oracle 已经过时&#xff0c;开源数据库或者他们研发的国产数据库才代表数据库发展的未来。甚至在很多交流会议上拿出自家产品的某一个功能点和 Oracle 对比就觉得已经遥遥领先。 实际上数据库系统的发展…

zookeeper mac安装

目录 1.下载zookeeper安装包 2.解压安装包 3.修改配置文件 4.启动服务端 5.启动客户端 这边工作中用到了zookeeper组件&#xff0c;但自己独立安装弄的不太多&#xff0c;这边本机mac装一个做测试使用 以下是安装记录&#xff0c;可以作为参考 从以下链接zookeeper版本列…

windows系统利用powershell查看系统支持那些Windows功能选项

在PowerShell中&#xff0c;我们可以使用Get-WindowsOptionalFeature cmdlet命令来查看Windows功能选项。 打开PowerShell 输入以下命令&#xff1a;将结果输出到1.log Get-WindowsOptionalFeature -Online >1.log 可以看到在指定路径下看到生成了文件 打开查看内容&…

手机号码格式校验:@Phone(自定义参数校验注解)

需求 新增接口 和 修改接口 中&#xff0c;手机号码的格式校验是普遍需要的。 在每个手机号码字段上添加正则表达式校验注解来实现校验&#xff0c;重复书写&#xff0c;容易出错&#xff1b;在不同的手机号码字段上&#xff0c;可能使用了不同的校验规则&#xff0c;无法有效…

网络协议--链路层

2.1 引言 从图1-4中可以看出&#xff0c;在TCP/IP协议族中&#xff0c;链路层主要有三个目的&#xff1a; &#xff08;1&#xff09;为IP模块发送和接收IP数据报&#xff1b; &#xff08;2&#xff09;为ARP模块发送ARP请求和接收ARP应答&#xff1b; &#xff08;3&#xf…

【51单片机编写占空比按秒渐亮与渐暗】2023-10-2

昨天刚在W10上安装CH340驱动&#xff0c;又下载到板子上LCD1602定时器时钟程序&#xff0c;为了调试&#xff0c;调用了一个LED观察控制蜂鸣器按秒响的变量&#xff0c;几经调试才发觉该开发板用的是有源蜂鸣器&#xff0c;不用IO取反操作&#xff0c;直接控制IO的高低电平即可…

在亚马逊云科技Amazon SageMaker上部署构建聊天机器人的开源大语言模型

开源大型语言模型&#xff08;LLM&#xff09;已经变得流行起来&#xff0c;研究人员、开发人员和组织都可以使用这些模型来促进创新和实验。这促进了开源社区开展合作&#xff0c;从而为LLM的开发和改进做出贡献。开源LLM提供了模型架构、训练过程和训练数据的透明度&#xff…

讲讲项目里的仪表盘编辑器(二)

应用场景 正常来说&#xff0c;编辑器应用场景应该包括&#xff1a; 编辑器-预览 编辑器 最终运行时 怎么去设计 上一篇推文&#xff0c;我们已经大概了解了编辑器场景。接下来&#xff0c;我们来看预览时的设计 编辑器-预览 点击预览按钮&#xff0c;执行以…

<C++> 哈希表模拟实现STL_unordered_set/map

哈希表模板参数的控制 首先需要明确的是&#xff0c;unordered_set是K模型的容器&#xff0c;而unordered_map是KV模型的容器。 要想只用一份哈希表代码同时封装出K模型和KV模型的容器&#xff0c;我们必定要对哈希表的模板参数进行控制。 为了与原哈希表的模板参数进行区分…

百度资源搜索平台出现:You do not have the proper credential to access this page.怎么办?

Forbidden site not allowed You do not have the proper credential to access this page. If you think this is a server error, please contact the webmaster. 如果你的百度资源平台&#xff0c;点进去出现这个提示&#xff0c;说明您的网站已经被百度清退了。如果你的网站…

把握现在,热爱生活

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; 目录 厨艺房价琐事计划随想 今年的中秋国庆假期放8天&#xff0c;比春节假期…

IIS管理器无法打开。启动后,在任务栏中有,但是窗口不见了

找到IIS管理器启动程序的所在位置 并在cmd命令行中调用 inetmgr.exe /reset 进行重启 先查看IIS管理器属性&#xff0c;找到其位置 管理员模式打开cmd命令行&#xff0c;并切换到上面的文件夹下运行Inetmgr.exe /reset 运行完成后可以重新看到IIS窗口 原因&#xff1a;由于某…

安防监控/视频汇聚平台EasyCVR云端录像不展示是什么原因?该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

在Windows11家庭中文版中启用Copilot(预览版)

1、下载ViveTool-vx.x.x.zip 2、解压下载的压缩包ViveTool-vx.x.x.zip 3、复制ViveTool文件夹的路径 4、按下wins&#xff0c;打开搜索 5、输入cmd&#xff0c;并选择“以管理员身份运行” 6、在cmd中输入以下命令&#xff0c;进入ViveTool文件夹&#xff1a; cd ViveTool…

【自监督Re-ID】ICCV_2023_Oral | ISR论文阅读

Codehttps://github.com/dcp15/ISR_%20ICCV2023_Oral 面向泛化行人再识别的身份导向自监督表征学习&#xff0c;清华大学 目录 导读 摘要 相关工作 DG ReID 用于ReID的合成数据 无监督表征学习 Identity-Seeking Representation Learning 结果 消融实验 导读 新角度…

Sentinel学习(2)——sentinel的使用,引入依赖和配置 对消费者进行流控 对生产者进行熔断降级

前言 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 本篇博客介绍sentinel的使用&#x…