知识大全 贪婪算法思想

Posted

篇首语:别想一下造出大海,必须先由小河川开始。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 贪婪算法思想相关的知识,希望对你有一定的参考价值。

  在贪婪算法(greedy method)中采用逐步构造最优解的方法 在每个阶段 都作出一个看上去最优的决策(在一定的标准下) 决策一旦作出 就不可再更改 作出贪婪决策的依据称为贪婪准则(greedy criterion)

  例 [找零钱] 一个小孩买了价值少于 美元的糖 并将 美元的钱交给售货员 售货员希望用数目最少的硬币找给小孩 假设提供了数目不限的面值为 美分 美分 美分 及 美分的硬币 售货员分步骤组成要找的零钱数 每次加入一个硬币 选择硬币时所采用的贪婪准则如下 每一次选择应使零钱数尽量增大 为保证解法的可行性(即 所给的零钱等于要找的零钱数) 所选择的硬币不应使零钱总数超过最终所需的数目

  假设需要找给小孩 美分 首先入选的是两枚 美分的硬币 第三枚入选的不能是 美分的硬币 否则硬币的选择将不可行(零钱总数超过 美分) 第三枚应选择 美分的硬币 然后是 美分的 最后加入两个 美分的硬币

  贪婪算法有种直觉的倾向 在找零钱时 直觉告诉我们应使找出的硬币数目最少(至少是接近最少的数目) 可以证明采用上述贪婪算法找零钱时所用的硬币数目的确最少(见练习 )

  例 [机器调度] 现有n 件任务和无限多台的机器 任务可以在机器上得到处理 每件任务的开始时间为si 完成时间为fi si < fi [si fi ] 为处理任务i 的时间范围 两个任务i j 重指两个任务的时间范围区间有重叠 而并非是指i j 的起点或终点重合 例如 区间[ ]与区间[ ]重叠 而与区间[ ]不重叠 一个可行的任务分配是指在分配中没有两件重叠的任务分配给同一台机器 因此 在可行的分配中每台机器在任何时刻最多只处理一个任务 最优分配是指使用的机器最少的可行分配方案

  假设有n= 件任务 标号为a 到g 它们的开始与完成时间如图 a 所示 若将任务a分给机器M 任务b 分给机器M 任务g 分给机器M 这种分配是可行的分配 共使用了七台机器 但它不是最优分配 因为有其他分配方案可使利用的机器数目更少 例如 可以将任务a b d分配给同一台机器 则机器的数目降为五台

  一种获得最优分配的贪婪方法是逐步分配任务 每步分配一件任务 且按任务开始时间的非递减次序进行分配 若已经至少有一件任务分配给某台机器 则称这台机器是旧的;若机器非旧 则它是新的 在选择机器时 采用以下贪婪准则 根据欲分配任务的开始时间 若此时有旧的机器可用 则将任务分给旧的机器 否则 将任务分配给一台新的机器 根据例子中的数据 贪婪算法共分为n = 步 任务分配的顺序为a f b c g e d 第一步没有旧机器 因此将a 分配给一台新机器(比如M ) 这台机器在 到 时刻处于忙状态 在第二步 考虑任务f 由于当f 启动时旧机器仍处于忙状态 因此将f 分配给一台新机器(设为M ) 第三步考虑任务b 由于旧机器M 在Sb = 时刻已处于闲状态 因此将b分配给M 执行 M 下一次可用时刻变成fb = M 的可用时刻变成ff = 第四步 考虑任务c 由于没有旧机器在Sc = 时刻可用 因此将c 分配给一台新机器(M ) 这台机器下一次可用时间为fc = 第五步考虑任务g 将其分配给机器M 第六步将任务e 分配给机器M 最后在第七步 任务 分配给机器M (注意 任务d 也可分配给机器M )

  上述贪婪算法能导致最优机器分配的证明留作练习(练习 ) 可按如下方式实现一个复杂性为O (nl o gn)的贪婪算法 首先采用一个复杂性为O (nl o gn)的排序算法(如堆排序)按Si 的递增次序排列各个任务 然后使用一个关于旧机器可用时间的最小堆

  例 [最短路径] 给出一个有向网络 路径的长度定义为路径所经过的各边的耗费之和 要求找一条从初始顶点s 到达目的顶点d 的最短路径

  贪婪算法分步构造这条路径 每一步在路径中加入一个顶点 假设当前路径已到达顶点q 且顶点q 并不是目的顶点d 加入下一个顶点所采用的贪婪准则为 选择离q 最近且目前不在路径中的顶点

  这种贪婪算法并不一定能获得最短路径 例如 假设在图 中希望构造从顶点 到顶点 的最短路径 利用上述贪婪算法 从顶点 开始并寻找目前不在路径中的离顶点 最近的顶点 到达顶点 长度仅为 个单位 从顶点 可以到达的最近顶点为 从顶点 到达顶点 最后到达目的顶点 所建立的路径为 其长度为 这条路径并不是有向图中从 到 的最短路径 事实上 有几条更短的路径存在 例如路径 的长度为

  根据上面三个例子 回想一下前几章所考察的一些应用 其中有几种算法也是贪婪算法 例如 霍夫曼树算法 利用n 步来建立最小加权外部路径的二叉树 每一步都将两棵二叉树合并为一棵 算法中所使用的贪婪准则为 从可用的二叉树中选出权重最小的两棵 L P T调度规则也是一种贪婪算法 它用n 步来调度n 个作业 首先将作业按时间长短排序 然后在每一步中为一个任务分配一台机器 选择机器所利用的贪婪准则为 使目前的调度时间最短 将新作业调度到最先完成的机器上(即最先空闲的机器)

  注意到在机器调度问题中 贪婪算法并不能保证最优 然而 那是一种直觉的倾向且一般情况下结果总是非常接近最优值 它利用的规则就是在实际环境中希望人工机器调度所采用的规则 算法并不保证得到最优结果 但通常所得结果与最优解相差无几 这种算法也称为启发式方法( h e u r i s t i c s ) 因此L P T方法是一种启发式机器调度方法 定理 陈述了L P T调度的完成时间与最佳调度的完成时间之间的关系 因此L P T启发式方法具有限定性 能( bounded performance ) 具有限定性能的启发式方法称为近似算法( a p p r o x i m a t i o na l g o r i t h m)

cha138/Article/program/sjjg/201311/23600

相关参考

知识大全 第 1 章 贪婪算法

  虽然设计一个好的求解算法更像是一门艺术而不像是技术但仍然存在一些行之有效的能够用于解决许多问题的算法设计方法你可以使用这些方法来设计算法并观察这些算法是如何工作的一般情况下为了获得较好的性能必须对

知识大全 贪婪算法之——最小耗费生成树

  在例及中已考察过这个问题因为具有n个顶点的无向网络G的每个生成树刚好具有n条边所以问题是用某种方法选择n条边使它们形成G的最小生成树至少可以采用三种不同的贪婪策略来选择这n条边这三种求解最小生成树

知识大全 贪婪算法之——拓扑排序

  一个复杂的工程通常可以分解成一组小任务的集合完成这些小任务意味着整个工程的完成例如汽车装配工程可分解为以下任务将底盘放上装配线装轴将座位装在底盘上上漆装刹车装门等等任务之间具有先后关系例如在装轴之

知识大全 贪婪算法之——背包问题

  在/背包问题中需对容量为c的背包进行装载从n个物品中选取装入背包的物品每件物品i的重量为wi价值为pi对于可行的背包装载背包中物品的总重量不能超过背包的容量最佳装载是指所装入的物品价值最高即n?i

知识大全 贪婪算法之——二分覆蓋

  二分图是一个无向图它的n个顶点可二分为集合A和集合B且同一集合中的任意两个顶点在图中无边相连(即任何一条边都是一个顶点在集合A中另一个在集合B中)当且仅当B中的每个顶点至少与A中一个顶点相连时A的

知识大全 贪婪算法之——单源最短路径

  在这个问题中给出有向图G它的每条边都有一个非负的长度(耗费)a[i][j]路径的长度即为此路径所经过的边的长度之和对于给定的源顶点s需找出从它到图中其他任意顶点(称为目的)的最短路径图a给出了一个

知识大全 c#与算法--快速排序

  从事net工作两年当初学到的数据结构算法一直没有在实际工作中用到近日闲来无事突发奇想要温习一下简单的数据结构算法今日用了一个下午的时间完成了排序中的快速排序以此作为入驻博客园的首篇随笔!思想向后是

知识大全 十大排序算法面试题

选择排序选择排序的基本思想是对待排序的记录序列进行n遍的处理第i遍处理是将L[in]中最小者与L[i]交换位置这样经过i遍处理之后前i个记录的位置已经是正确的了选择排序是不稳定的算法复杂度是O(n^)

知识大全 第五部分 查找[1]

第五部分查找  复习策略本部分会出一道选择题分值不是很高但是查找的思想会融入在排序里考察也就是说查找是排序的基础对于此部分不必死扣算法要注重理解算法的思想    年真题分值比例选择题道(分)%    

知识大全 数据结构 7.7 普里姆算法

  希赛教育计算机专业考研专业课辅导招生  希赛教育计算机专业考研专业课辅导视频  希赛教育计算机考研专业课在线测试系统  普里姆算法从另一个角度构造连通网的最小生成树它的基本思想是首先选取图中任意一