贪心算法详解:从概念到应用实例

需积分: 34 7 下载量 114 浏览量 更新于2024-07-25 收藏 831KB PPT 举报
"计算机贪心算法" 贪心算法是计算机科学中解决优化问题的一种策略,它的核心思想是在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,希望通过每一步局部最优的选择,最终能得到全局最优的解决方案。贪心算法并不总是能保证找到全局最优解,但它在很多情况下能得出接近最优解的解决方案。 贪心算法的基本要素包括两个关键性质: 1. **最优子结构**:问题的最优解可以通过其子问题的最优解来构造。这意味着,如果一个问题的最优解包含其子问题的最优解,那么这个问题就具有最优子结构。例如,最小生成树问题中的Prim或Kruskal算法,都是基于每次选择当前未处理边集中权重最小的边来构建最小生成树,这个选择是基于当前已有的树的最优情况。 2. **贪心选择性质**:在每一步,贪心算法都会做出局部最优的选择,即当前看起来最好的选择。例如,哈夫曼编码中,每次选取权值最小的两个节点合并,以构造出总权值最小的哈夫曼树。 然而,贪心算法并不总是能得到全局最优解,因为它不考虑未来可能的影响。一个经典的例子是硬币找零问题,当硬币面值不是有序整除关系时,贪心算法可能无法给出最小硬币数量的组合,比如找一角五分,贪心算法可能会选择1个一角一分和4个一分,而实际上3个五分硬币是更优的解。 贪心算法的一般步骤如下: 1. 初始化:设置问题的初始状态,可能包括数据结构的构建、变量的设定等。 2. 在每一步,根据贪心选择性质选择当前状态下最优的解。 3. 将选择的解添加到当前的解集或解决方案中。 4. 继续此过程,直到满足终止条件,如所有可行解都被考虑过,或者达到特定目标状态。 在实际应用中,贪心算法常用于解决一些特定的问题,如: - **活动安排问题**:在有限的资源下,如何安排一系列活动,使得尽可能多的活动可以并行进行。例如,会议室预订问题,每次选择结束时间最早的活动来安排。 - **最优装载问题**:如何装载货物以最大化船的载货量,贪心策略可能是每次都装载当前可以放下的最大货物。 - **哈夫曼编码**:通过贪心地合并最小权值的节点来构造出最小带权路径长度的二叉树,用于数据压缩。 - **单源最短路径**:Dijkstra算法就是一种贪心策略,每次选择离起点最近的未访问节点更新最短路径。 - **最小生成树**:Prim或Kruskal算法在构建图的最小生成树时,每次选择能连接两个集合且权值最小的边。 - **多机调度问题**:如何将任务分配给多台机器,使得总的完成时间最短,贪心策略可能包括优先分配执行时间短的任务等。 贪心算法在解决某些问题时效率高,实现简单,但在面对需要全局最优解的问题时,可能需要结合其他方法,如动态规划,来保证找到全局最优解。
2011-07-12 上传
运 用 贪 心 算 法 ,vc++ 语 言 编 写 , 可 单 步 输 出 结 果 【问题描述】 跳马问题也称骑士遍历、马踏棋盘问题:在8*8方格的棋盘上,从任意指定的方格出发,为象棋中的马寻找一条走遍棋盘每一格并且只经过一次的一条路径。 考虑国际象棋棋盘上某个位置的一只马,它是否可能只走63步,正好走过除起点外的其他63个位置各一次?如果有一种这样的走法,则称所走的这条路线为一条马的周游路线。试设计一个算法找出这样一条马的周游路线。 在一个8×8的方格棋盘中,按照国际象棋中马的行走规则从棋盘上的某一方格出发,开始在棋盘上周游,如果能不重复地走遍棋盘上的每一个方格, 这样的一条周游路线在数学上被称为国际象棋盘上马的哈密尔顿链。请你设计一个程序,从键盘输入一个起始方格的坐标,由计算机自动寻找并打印 【算法描述】 本题有较多方法求解,在此仅对回溯法进行分析。 一只马在棋盘的某一点,它可以朝8个方向前进,方向向量分别是:(2,1)、(2,-1)、(1,2)、(1,-2)、(-2,1)、(-2,-1)、(-1,2)、(-1,-2)。从中任选择一个方向前进,到达新的位置。在从新的位置选择一个方向前进,继续,直到无法前进为止。无法前进可能有如下原因:下一位置超出边界、下一位置已经被访问过。当马已经无法前进时,就回退到上一位置,从新选择一个新的方向前进;如果还是无法前进,就再回退到上一位置……