算法(六)贪婪算法

贪婪算法可能是实现和设计中最简单的算法,但它们通常是最难证明正确性的算法之一。

1. 部分背包问题Fractional Knapsack

已知:集合s有n个元素,每个元素中i满足:
Bi:一个正的利益
Wi:一个正的权益
目标:选择不同的元素使得在有限的w中有最大的权益
选择最大权益的元素在这里插入图片描述
选择最小权益的元素
在这里插入图片描述
选择最大权益/权重比的元素
在这里插入图片描述
需要O (n log n)时间对项目进行排序,然后O (n)时间来处理他们的循环。

2. 间隔调度Interval Scheduling

  • 输入:n个作业的集合。每一项工作在时间sj开始,在时间fj结束。
  • 如果两份工作没有时间重叠,那么它们是兼容的。
  • 目标:找到相互兼容的作业的最大子集。

按照工作开始时间排序
在这里插入图片描述
按照工作持续时间排序
在这里插入图片描述
对于每个作业,计算冲突的作业cj的数量。冲突按升序排列。
在这里插入图片描述
在这里插入图片描述

3.Interval Partitioning

在这里插入图片描述

  • 课程i从si开始,到fi结束。
  • 目标:找到最小的教室数量来安排所有的讲座,这样就不会有两堂课在同一时间在同一间教室上课。
    This schedule uses 4 classrooms to schedule 10 lectures.
    在这里插入图片描述
    This schedule uses only 3.
    在这里插入图片描述
    时间复杂度:O(n log n)

4. 图论中最短路径

给定一个边权图和两个顶点u和v,我们希望找到一条在u和v之间总权值最小的路径,其中路径的权值是它的边的权值的总和。
应用: 互联网数据包路由,航班预订和驾驶方向。
例如: 普罗维登斯(PVD)和檀香山(HNL)之间的最短路径
在这里插入图片描述

  1. 最短路径的子路径本身就是最短路径
    例如:从普罗维登斯(PVD)到檀香山(HNL)的最短路径还包含从普罗维登斯(PVD)到洛杉矶(LAX)的最短路径。

  2. 有一个最短路径树,从一个开始顶点到所有其他顶点(最短路径树)。
    示例:来自Providence的最短路径树(PVD)

5. Dijkstra’s Algorithm

输入: 图G = (V, E); 边的权重w: E→R+; 顶点v开始
输出: 在v中从s到所有v的距离; 以s为根的最短路径树
假设: G是连通的,无向边的权值是非负的
复杂度:O(m log n)
在这里插入图片描述

6. 最小生成树(MST)

给定边权值为ce的连通图G = (V, E), MST是边T E的子集,因此T是一个边权和最小的生成树。
在这里插入图片描述

7. 贪心算法

简化的假设。所有边缘成本Ce是不同的。
cut性质。设S为节点的任意子集,设e为S中只有一个端点的最小代价边,MST包含e。
cycle性质。设C为任意循环,f为属于C的最大代价边,则MST不包含f。
在这里插入图片描述
周期Cycle。a-b, b-c, c-d,…,y-z, z-a的边缘集合。
割集Cutset。一个割是节点S的子集,对应的割集D是在S中只有一个端点的边的子集。
在这里插入图片描述
在这里插入图片描述
Cycle-Cut十字路口
一个循环和一个割集相交于偶数条边。
在这里插入图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值