(HDUACM2010版_05)贪心算法
- 格式:ppt
- 大小:434.00 KB
- 文档页数:30


贪心算法的基本原理
贪心算法(Greedy Algorithm)是一种常用的算法思想,它在求解最优化问题时通常能够得到较好的近似解。贪心算法的基本原理是:每一步都选择当前状态下的最优解,从而希望最终能够得到全局最优解。在实际应用中,贪心算法常常用于解决一些最优化问题,如最小生成树、最短路径、任务调度等。
一、贪心算法的特点
贪心算法具有以下特点:
1. 简单:贪心算法通常比较简单,易于实现和理解。
2. 高效:贪心算法的时间复杂度通常较低,能够在较短的时间内得到结果。
3. 局部最优:每一步都选择当前状态下的最优解,但不能保证最终能够得到全局最优解。
4. 适用范围:贪心算法适用于一些特定类型的问题,如无后效性、最优子结构等。
二、贪心算法的基本原理
贪心算法的基本原理可以概括为以下几个步骤:
1. 初始状态:确定问题的初始状态,定义问题的输入和输出。
2. 状态转移:根据当前状态,选择局部最优解,并更新状态。
3. 筛选解:判断当前状态下是否满足问题的约束条件,若满足则保留该解,否则舍弃。
4. 终止条件:重复以上步骤,直至满足终止条件,得到最终解。 三、贪心算法的应用举例
1. 找零钱:假设有 25、10、5、1 四种面额的硬币,需要找零 41 元,如何使得找零的硬币数量最少?贪心算法可以先选择面额最大的硬币,然后逐步选择面额较小的硬币,直至找零完毕。
2. 区间调度:给定一组区间,如何选择最多的互不重叠的区间?贪心算法可以先按照区间的结束时间排序,然后依次选择结束时间最早的区间,直至所有区间都被覆盖。
3. 最小生成树:在一个连通的带权无向图中,如何选择边使得生成树的权值最小?贪心算法可以按照边的权值从小到大排序,然后依次选择权值最小且不构成环的边,直至所有顶点都被连接。
四、贪心算法的优缺点
1. 优点:贪心算法简单高效,适用于一些特定类型的问题,能够在较短的时间内得到近似最优解。
贪心算法及几个常用的例题
贪心算法:
一、基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的
选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义
上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。
必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,
只与当前状态有关。
所以对所采用的贪心策略一定要仔细分析其是否满足无后效性。 二、贪心算法的基本思路:
1.建立数学模型来描述问题。 2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解。 三、贪心算法适用的问题
贪心策略适用的前提是:局部最优策略能导致产生全局最优解。 实际上,贪心算法适用的情况很少。一般,对一个问题分析是否适用
于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判
断。 四、贪心算法的实现框架
从问题的某一初始解出发; while (能朝给定总目标前进一步)
利用可行的决策,求出可行解的一个解元素; 由所有解元素组合成问题的一个可行解;
五、贪心策略的选择
因为用贪心算法只能通过解局部最优解的策略来达到全局最优解,因此,一定要注意判断问题是否适合采用贪心算法策略,找到的解是否一定
是问题的最优解。 几个经典的例子:
一、定义
什么是贪心算法呢?所谓贪心算法是指,在对问题求解时,总是做出在当前看来最好的选择。也就是说,不从整体最优解出发来考虑,它所做
出的仅是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的
许多问题都能产生整体最优解或整体最优解的近似解。
贪心算法的基本思路如下: 1. .建立数学模型来描述问题。
2. 把求解的问题分成若干个子问题。 3. 对每个子问题求解,得到每个子问题的局部最优解。
贪心算法解析
在计算机科学领域中,贪心算法是一种简单却高效的算法,主要用于解决优化问题。贪心算法的基本思想是:每一步都选择当前最优的解决方案,最终得到全局最优解。
贪心算法的核心在于贪心策略。贪心策略是指每一步都选取当前最优解,即对当前局部最优解不做考虑就直接进行决策。贪心算法的优点在于其时间复杂度比较低,常常能够在很短的时间内找到一个不错的解决方案。但是,使用贪心算法求解问题时需要注意,贪心算法要求问题具有最优子结构性质(即所有子问题的最优解能够推导出全局最优解),而且贪心算法并不能保证求得最优解。
下面通过几个实例来讲解贪心算法的应用。
例一:找零钱问题
假设我们有 $n$ 种面额不同的硬币,它们的面值分别为 $v_1,
v_2, ..., v_n$。我们要找回 $p$ 元钱,问最少需要多少枚硬币。
这个问题可以用贪心算法来解决。贪心策略是每次取尽量大的面额,直到找回的零钱等于 $p$ 元为止。具体步骤如下:
1. 将硬币按照面额从大到小排序;
2. 依次取硬币,如果当前硬币的面额小于要找的零钱,就继续取;否则,取下一个硬币;
3. 当找回的钱数等于 $p$ 时停止。
为了证明这个贪心算法确实是正确的,我们可以假设另外有一种更优的算法。我们可以证明,如果这个算法与贪心算法在某一步不同时,那么这个算法肯定不是最优解。因此,我们只需要证明贪心算法的每一步都能得到最优解,即可证明贪心算法是正确的。
例二:活动安排问题
假设有一组活动,每个活动都有开始时间和结束时间。假设活动 $i$ 的开始时间为 $s_i$,结束时间为 $f_i$。问最多可以安排多少个活动。
这个问题可以用贪心算法来解决。贪心策略是每次选择结束时间最早的活动。具体步骤如下:
1. 将活动按照结束时间从早到晚排序;
2. 选择剩余结束时间最早的活动,将其加入集合中,将其结束时间赋值给变量 $last$;
3. 对于接下来的活动,若其开始时间 $s_i \geq last$,则将其加入集合中,将其结束时间赋值给 $last$;否则,忽略这个活动。
贪婪算法(贪⼼算法)
贪⼼算法简介:
@anthor:QYX
贪⼼算法是指:在每⼀步求解的步骤中,它要求“贪婪”的选择最佳操作,并希望通过⼀系列的最优选择,能够产⽣⼀个问题的(全局的)最优解。
贪⼼算法每⼀步必须满⾜⼀下条件:
1、可⾏的:即它必须满⾜问题的约束。
2、局部最优:他是当前步骤中所有可⾏选择中最佳的局部选择。
3、不可取消:即选择⼀旦做出,在算法的后⾯步骤就不可改变了。
贪⼼算法的定义:贪⼼算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪⼼算法不是对所有问题都能得到整体最优解,关键是贪⼼策略的选择,选择的贪⼼策略必须具备⽆后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。解题的⼀般步骤是:1.建⽴数学模型来描述问题;2.把求解的问题分成若⼲个⼦问题;3.对每⼀⼦问题求解,得到⼦问题的局部最优解;4.把⼦问题的局部最优解合成原来问题的⼀个解。如果⼤家⽐较了解动态规划,就会发现它们之间的相似之处。最优解问题⼤部分都可以拆分成⼀个个的⼦问题,把解空间的遍历视作对⼦问题树的遍历,则以某种形式对树整个的遍历⼀遍就可以求出最优解,⼤部分情况下这是不可⾏的。贪⼼算法和动态规划本质上是对⼦问题树的⼀种修剪,两种算法要求问题都具有的⼀个性质就是⼦问题最优性(组成最优解的每⼀个⼦问题的解,对于这个⼦问题本⾝肯定也是最优的)。动态规划⽅法代表了这⼀类问题的⼀般解法,我们⾃底向上构造⼦问题的解,对每⼀个⼦树的根,求出下⾯每⼀个叶⼦的值,并且以其中的最优值作为⾃⾝的值,其它的值舍弃。⽽贪⼼算法是动态规划⽅法的⼀个特例,可以证明每⼀个⼦树的根的值不取决于下⾯叶⼦的值,⽽只取决于当前问题的状况。换句话说,不需要知道⼀个节点所有⼦树的情况,就可以求出这个节点的值。由于贪⼼算法的这个特性,它对解空间树的遍历不需要⾃底向上,⽽只需要⾃根开始,选择最优的路,⼀直⾛到底就可以了。