贪心法的思想方法及证明
- 格式:docx
- 大小:17.16 KB
- 文档页数:3
如何证明贪⼼算法的正确性
在使⽤贪⼼算法时,我们常常会通过直觉来得出贪⼼策略。
可是,我们要如何来证明贪⼼策略的正确性呢?
贪⼼算法解决的问题常常可以划分成多个⼦过程,我们对每个⼦过程采⽤相同的贪⼼策略可以实现全局的最优。
这也是贪⼼算法与动态规划算法的区别——动态规划算法对于每个⼦过程选取相同的贪⼼策略⽆法实现全局的最优。
当我们得到贪⼼策略时,我们很⾃然地会想到使⽤⼀种较暴⼒的⽅法,即证明对于每个⼦过程使⽤贪⼼策略能够实现全局最优。
具体地,我们如何使⽤这种⽅法来证明贪⼼策略的正确性呢?我们常常是通过交换任意两个⼦过程然后证明交换后⽆法实现全局的更优来证明,这其实是反证法的应⽤,我们通过改变贪⼼策略然后证明改变后⽆法实现全局的更优从⽽来证明贪⼼策略的正确性。
另⼀⽅⾯,我们也可以使⽤类似于数学归纳法的⽅法来证明贪⼼策略的正确性。
我们⾸先可以证明对于⼀个初始的⼦过程实现贪⼼策略能够实现该⼦过程的最优。
然后假设对于前n个⼦过程使⽤贪⼼策略能够实现前n个⼦过程的最优,通过该假设来证明前n+1个⼦过程使⽤贪⼼策略也能够实现最优,这样贪⼼策略的正确性便得以证明。
这就是贪⼼算法常⽤的证明⽅法。
“贪心选择性质”的证明下面用数学归纳法给出一个简单的证明。
我们对算法所做的选择步数进行归纳,证明对任意正整数k,算法的前k步选择都能导致一个最优解.定理算法Select执行到第k步,选择k项活动=1,,…,那么存在最优解A包含=1,,…。
证将S中的活动按照截止时间递增顺序排列.归纳基础:k=1时,算法选择了活动1.我们仅需要证明:存在一个最优解包含了活动1.设A{ ,,…,}是一个最优解,如果i11,那么用1替换,得到A’,即A’=(A-{ }){1}那么A’和A的活动个数相等。
且活动1比i1结束的更早,因此和,,…,等活动都相容。
于是A’也是问题的一个最优解.归纳步骤:假设对于任意正整数k,命题正确.令=1,,…是算法前k 步顺序选择的活动,那么存在一个最优解A={=1,,…}B如果令S’是S中剩下的与i1,i2,…,ik相容的活动,即S’={j|, j S}那么B是S’的一个最优解,如若不然,假如S’有解B’,| B’|>|B|,那么用B’替换B以后得到的解{=1,,…}B’将比A的活动更多,与A是最优解矛盾.根据对归纳基础的证明,算法第一步选择结束时间最早的活动总是导致一个最优解,故对子问题S’存在一个最优解B*={,…}.由于B*与B都是S’的最优解,因此| B*|=|B|.于是A’={ =1,,…} B*={=1,,…,}(B*-{ ik+1})与A的活动数目一样多,也是一个最优解,而且恰好包含了算法前k+1步选择的活动。
根据归纳法命题得证.定理告诉我们,算法前k步的选择都将导致最优解,其中k=1,2,….因为至多有n项活动,被选择的活动个数不会超过n,因此算法至少在n步内结束,结束时得到的就是问题的最优解.例有集装箱1,2,…,n准备装上轮船。
其中集装箱i的重量是C,且对集装箱无体积限制。
问如何选择而使得装上船的集装箱个数最多设=1表示第i个集装箱可以装上船,否则=0,则这个问题可以描述为:maxC=0,1 i=1,2,…,n这是一个整数规划问题,也是0-1背包问题的特殊情况.对于0-1背包问题可以使用动态规划算法求解.但是对于这个问题有更好的算法——贪心法.贪心选择策略非常简单,就是“轻者先装”,直到再装任何集装箱将使轮船载重量超过C是停止.算法 Loading输入:集装箱集合N={1,2,…,n},集装箱i的重量 ,i=1,2,…,n输出:I N,准备装入船的集装箱集合1.对集装箱重量排序,使得2.I{1}3.W4.for j 2 to n do5. if W + C6. Then W W+7. I I{j}8. else return I,W算法的时间主要是行1的排序时间O(nlogn),行4的for循环总计执行O(n)时间,于是算法的时间复杂度是O(nlogn)。
贪心算法的局部最优性贪心算法是一种常用且有效的算法设计策略。
它的核心思想是在解决问题的每个阶段,都选择当前情况下最优的局部解,希望最终能够得到全局最优解。
贪心算法在很多实际问题中都有应用,其成功与否与问题的性质和贪心策略的选择密切相关。
一、贪心算法的基本思想贪心算法的基本思想是通过不断地做出局部最优选择来达到全局最优。
贪心算法在每个阶段都做出一个局部最优选择,然后通过这些局部最优选择逐步构建一个全局最优解。
二、贪心算法的局部最优性证明贪心算法能够得到局部最优解的前提是:每一步的局部最优解能够推导出全局最优解。
下面将从数学的角度证明贪心算法的局部最优性。
设问题的最优解为S,贪心算法得到的局部最优解为A。
假设A不是S的最优解,那么存在一个更优解B,使得B更优于A。
但是由于贪心算法的策略是选择当前情况下的局部最优解,所以A必然是在B之前被选择的。
换句话说,贪心算法在每个阶段选择的最优解都是局部最优的。
接下来,我们可以将最优解S划分成两部分:一部分是已经选择的解A和其它局部最优解的组合,另一部分是在贪心算法之后还没有选择的解。
假设在每个阶段选择局部最优解并不能得到全局最优解,那么就存在一种选择策略,使得在贪心算法之后仍然可以得到一个与S不同的更优解。
然而,这与贪心算法选择了局部最优解的原则相矛盾。
因此,我们可以得出结论:贪心算法的局部最优解能够推导出全局最优解,即贪心算法具有局部最优性。
三、贪心算法的应用举例1. 零钱兑换问题假设有不同面额的硬币,例如1元、2元、5元,现要兑换总金额为N的零钱。
如果使用贪心算法,每次都选择面额最大的硬币进行兑换,直到兑换完毕。
这样所需硬币的数量最少。
2. 区间覆盖问题给定一个区间集合,选取尽可能少的区间,使得这些区间的并集包含了所有的区间。
贪心算法可以选择尽可能早结束的区间进行覆盖,从而得到最优解。
3. 背包问题背包问题分为01背包和完全背包。
在01背包问题中,每个物品只有一个,可以选择放或者不放。
贪心算法实验报告贪心算法实验报告引言:贪心算法是一种常用的算法设计策略,它通常用于求解最优化问题。
贪心算法的核心思想是在每一步选择中都选择当前最优的解,从而希望最终能够得到全局最优解。
本实验旨在通过实际案例的研究,探索贪心算法的应用和效果。
一、贪心算法的基本原理贪心算法的基本原理是每一步都选择当前最优解,而不考虑整体的最优解。
这种贪婪的选择策略通常是基于局部最优性的假设,即当前的选择对于后续步骤的选择没有影响。
贪心算法的优点是简单高效,但也存在一定的局限性。
二、实验案例:零钱兑换问题在本实验中,我们以零钱兑换问题为例,来说明贪心算法的应用。
问题描述:假设有不同面值的硬币,如1元、5元、10元、50元和100元,现在需要支付给客户x元,如何用最少的硬币数完成支付?解决思路:贪心算法可以通过每次选择当前面值最大的硬币来求解。
具体步骤如下:1. 初始化一个空的硬币集合,用于存放选出的硬币。
2. 从面值最大的硬币开始,如果当前硬币的面值小于等于待支付金额,则将该硬币放入集合中,并将待支付金额减去该硬币的面值。
3. 重复步骤2,直到待支付金额为0。
实验过程:以支付金额为36元为例,我们可以通过贪心算法求解最少硬币数。
首先,面值最大的硬币为100元,但36元不足以支付100元硬币,因此我们选择50元硬币。
此时,剩余待支付金额为36-50=-14元。
接下来,面值最大的硬币为50元,但待支付金额为负数,因此我们选择下一个面值最大的硬币,即10元硬币。
此时,剩余待支付金额为-14-10=-24元。
继续选择10元硬币,剩余待支付金额为-24-10=-34元。
再次选择10元硬币,剩余待支付金额为-34-10=-44元。
最后,选择5元硬币,剩余待支付金额为-44-5=-49元。
由于待支付金额已经为负数,我们无法继续选择硬币。
此时,集合中的硬币数为1个50元和3个10元,总共4个硬币。
实验结果:通过贪心算法,我们得到了36元支付所需的最少硬币数为4个。
贪心法贪心法(Greedy Approach)又称贪婪法, 在对问题求解时,总是做出在当前看来是最好的选择,或者说是:总是作出在当前看来最好的选择。
也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。
当然,希望贪心算法得到的最终结果也是整体最优的。
虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。
如单源最短路经问题,最小生成树问题等。
在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。
贪心法的设计思想当一个问题具有以下的性质时可以用贪心算法求解:每一步的局部最优解,同事也说整个问题的最优解。
如果一个问题可以用贪心算法解决,那么贪心通常是解决这个问题的最好的方法。
贪婪算法一般比其他方法例如动态规划更有效。
但是贪婪算法不能总是被应用。
例如,部分背包问题可以使用贪心解决,但是不能解决0-1背包问题。
贪婪算法有时也用用来得到一个近似优化问题。
例如,旅行商问题是一个NP难问题。
贪婪选择这个问题是选择最近的并且从当前城市每一步。
这个解决方案并不总是产生最好的最优解,但可以用来得到一个近似最优解。
让我们考虑一下任务选择的贪婪算法的问题, 作为我们的第一个例子。
问题:给出n个任务和每个任务的开始和结束时间。
找出可以完成的任务的最大数量,在同一时刻只能做一个任务。
例子:下面的6个任务:start[] = {1, 3, 0, 5, 8, 5};finish[] = {2, 4, 6, 7, 9, 9};最多可完成的任务是:{0, 1, 3, 4}贪婪的选择是总是选择下一个任务的完成时间至少在剩下的任务和开始时间大于或等于以前选择任务的完成时间。
我们可以根据他们的任务完成时间,以便我们总是认为下一个任务是最小完成时间的任务。
1)按照完成时间对任务排序2)选择第一个任务排序数组元素和打印。
3) 继续以下剩余的任务排序数组。
……a)如果这一任务的开始时间大于先前选择任务的完成时间然后选择这个任务和打印。
贪心算法的原理是
贪心算法是一种求解最优问题的常用算法思想,其基本原理是在每一步选择中都采取当前状态下最优的选择,从而希望最终得到全局最优解。
贪心算法的主要特点是局部最优策略同时也是全局最优策略。
贪心算法通常包含以下步骤:
1. 确定问题的最优子结构:即问题的整体最优解可以通过一系列局部最优解来达到。
这是贪心算法的基础,也是保证贪心选择性质的关键。
2. 构造贪心选择:通过局部最优策略来构造每一步的最优解,不考虑前面步骤的选择是否能够达到全局最优。
3. 解决子问题:将子问题缩小,通过递归或迭代的方式求解。
4. 合并子问题的解:将子问题的解合并起来,形成原问题的解。
贪心算法的正确性依赖于贪心选择性质和最优子结构性质。
贪心选择性质指的是,通过局部最优解就可以推导出全局最优解。
最优子结构性质指的是,问题的整体最优解可以通过一系列局部最优解来达到。
贪心算法的应用广泛,常见的问题包括:
1. 找零钱问题:给定一些面额不同的硬币和一个总金额,如何用最少数量的硬币凑出总金额。
2. 区间调度问题:给定一些活动的开始时间和结束时间,如何安排活动使得参加的活动数量最多。
3. Huffman编码问题:如何用最短的编码长度来表示一个给定概率分布的字符集。
虽然贪心算法通常能够在很短的时间内找到一个解,但并不是所有问题都适合使用贪心算法。
贪心算法不能保证得到最优解,只能保证得到一个近似最优解。
因此,在使用贪心算法解决问题时需要根据具体问题的特性来判断是否适合使用贪心算法。
贪⼼算法基本思想和典型例题(转)贪⼼算法⼀、算法思想贪⼼法的基本思路:——从问题的某⼀个初始解出发逐步逼近给定的⽬标,以尽可能快的地求得更好的解。
当达到某算法中的某⼀步不能再继续前进时,算法停⽌。
该算法存在问题:1. 不能保证求得的最后解是最佳的;2. 不能⽤来求最⼤或最⼩解问题;3. 只能求满⾜某些约束条件的可⾏解的范围。
实现该算法的过程:从问题的某⼀初始解出发;while 能朝给定总⽬标前进⼀步 do 求出可⾏解的⼀个解元素;由所有解元素组合成问题的⼀个可⾏解;⼆、例题分析1、[背包问题]有⼀个背包,背包容量是M=150。
有7个物品,物品可以分割成任意⼤⼩。
要求尽可能让装⼊背包中的物品总价值最⼤,但不能超过总容量。
物品 A B C D E F G重量 35 30 60 50 40 10 25价值 10 40 30 50 35 40 30分析:⽬标函数: ∑pi最⼤约束条件是装⼊的物品总重量不超过背包容量:∑wi<=M( M=150)(1)根据贪⼼的策略,每次挑选价值最⼤的物品装⼊背包,得到的结果是否最优?(2)每次挑选所占空间最⼩的物品装⼊是否能得到最优解?(3)每次选取单位容量价值最⼤的物品,成为解本题的策略。
实现这个算法是学习算法分析与设计这门课程的需要。
贪⼼算法是所接触到的第⼀类算法。
算法从局部的最优出发,简单⽽快捷。
对于⼀个问题的最优解只能⽤穷举法得到时,⽤贪⼼法是寻找问题次优解的较好算法。
贪⼼法是⼀种改进了的分级处理⽅法。
⽤贪⼼法设计算法的特点是⼀步⼀步地进⾏,根据某个优化测度(可能是⽬标函数,也可能不是⽬标函数),每⼀步上都要保证能获得局部最优解。
每⼀步只考虑⼀个数据,它的选取应满⾜局部优化条件。
若下⼀个数据与部分最优解连在⼀起不再是可⾏解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加为⽌。
这种能够得到某种度量意义下的最优解的分级处理⽅法称为贪⼼法。
选择能产⽣问题最优解的最优度量标准是使⽤贪⼼法的核⼼问题。
贪心算法的基本思路
以下是贪心算法的基本思路:
1. 定义问题:明确要解决的问题和可用的操作。
2. 选择最优解:在每一步中,选择当前看起来最优的解决方案。
这个选择通常基于问题的局部信息和贪心准则。
3. 局部最优:根据贪心准则做出的选择应该在当前步骤是最优的,即能够获得最大或最小的效益。
4. 构建解决方案:通过一系列的局部最优选择,逐步构建出整个问题的解决方案。
5. 检查可行性:在每一步之后,检查所做出的选择是否满足问题的约束条件和限制。
6. 重复步骤:重复上述步骤,直到达到问题的终止条件或无法进一步做出改进。
贪心算法通常在每一步都做出局部最优选择,希望通过一系列局部最优选择来达到全局最优解。
然而,贪心算法并不保证一定能得到全局最优解,尤其是在复杂的问题中。
贪心算法的优势在于其简单性和效率。
它通常在每一步只需要考虑少量的因素,因此计算复杂度较低。
贪心算法在一些情况下可以提供较好的近似解,并且在实际应用中经常被使用。
需要注意的是,贪心算法的正确性和有效性取决于问题的特性和贪心准则的选择。
在使用贪心算法时,需要仔细分析问题,选择合适的贪心准则,并通过实例验证算法的正确性。
贪⼼法(⼀):贪⼼法的基本思想在实际问题中,经常会遇到求⼀个问题的可⾏解和最优解的问题,这就是所谓的最优化问题。
每个最优化问题都包含⼀组限制条件和⼀个优化函数,符合条件的解决⽅案称为可⾏解,使优化函数取得最佳值的可⾏解称为最优解。
贪⼼法是求解这类问题的⼀种常⽤算法,它从问题的某⼀个初始解出发,采⽤逐步构造最优解的⽅法向给定的⽬标前进。
贪⼼法在每个局部阶段,都做出⼀个看上去最优的决策(即某种意义下的、或某个标准下的局部最优解),并期望通过每次所做的局部最优选择产⽣出⼀个全局最优解。
做出贪⼼决策的依据称为贪⼼准则(策略)。
想象这样⼀个场景:⼀个⼩孩买了价值少于10元的糖,并将10元钱交给了售货员。
售货员希望⽤数⽬最少的⼈民币(纸币或硬币)找给⼩孩。
假设提供了数⽬不限的⾯值为5元、2元、1元、5⾓以及1⾓的⼈民币。
售货员应该这样找零钱呢?售货员会分步骤组成要找的零钱数,每次加⼊⼀张纸币或⼀枚硬币。
选择要找的⼈民币时所采⽤的准则如下:每⼀次选择应使零钱数尽量增⼤。
为保证不多找,所选择的⼈民币不应使零钱总数超过最终所需的数⽬。
假设需要找给⼩孩6元7⾓,⾸先⼊选的是⼀张5元的纸币,第⼆次⼊选的不能是5元或2元的纸币,否则零钱总数将超过6元7⾓,第⼆次应选择1元的纸币(或硬币),然后是⼀枚5⾓的硬币,最后加⼊两个1⾓的硬币。
这种找零钱的⽅法就是贪⼼法。
选择要找的⼈民币时所采⽤的准则就是采取的贪⼼标准(或贪婪策略)。
贪⼼法(⼜称贪婪算法)是指在求最优解问题的过程中,依据某种贪⼼标准,从问题的初始状态出发,通过若⼲次的贪⼼选择⽽得出最优解或较优解的⼀种阶梯⽅法。
从贪⼼法“贪⼼”⼀词便可以看出,在对问题求解时,贪⼼法总是做出在当前看来是最好的选择。
也就是说,贪⼼法不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。
贪⼼法主要有以下两个特点:(1)贪⼼选择性质:算法中每⼀步选择都是当前看似最佳的选择,这种选择依赖于已做出的选择,但不依赖于未作出的选择。
贪心法的思想以及证明方法
摘要本文首先论述了贪心法的主要思想方法,针对利用贪心法的重要性质证明贪心法提出了自己的理解。
贪心法的应用简单,证明却很麻烦。
因此作者大胆猜想:是否可以将有相同性质的问题归类,按类进行证明,并给出了一类应用问题的证明过程。
关键词贪心法最优子结构性质贪心选择性质
我曾经向往着哲学的深邃和心理学的通透,而最终选择的是计算机专业。
我认为计算机发展不过百年却能有如此成就,它不受积年陈旧规则的制约,依然葆有活力;同时仍有大片的区域有待挖掘,富有创新的可能性。
它所运用的思想方法总是深刻而质朴,经几番思考研究,不仅有了新的理解,在对于事物的认识上也深有益处。
这个学期我们接触了计算机原理的知识。
这是由宏观到微观的学习,揭示了如今呈现在我们面前的成熟的计算机,是如何仅仅凭借一高一低的信号便实现了令人类惊叹的智慧与计算能力。
尤其对于磁盘的运用,虽不在课程范围内,但我却对它产生了很大兴趣。
磁盘能够实现存储功能的核心在于磁道与磁头,磁头平移到目的磁道从而实现对该磁道文件的读取。
磁头移动过程耗费的时间成为牵制访问速度的主要因素。
假设n个文件每个文件占据一条磁道,不同文件被访问概率也不同。
如将被访问概率最大的文件置于正中间的磁道,概率次大和第三大的文件分别置于其两边,按此方法依次放置所有文件就能够得到最佳的存储方式[1]。
其中核心的思想正是贪心法。
在数据结构与算法中,贪心法也是算法的基本方法之一,它被完美应用在求最小生成树的Prim算法和Kruskal算法中。
树是数据结构中的一种存储结构,由点集和边集构成。
最小生成树是树的全部点和部分能使树的总权值最小且同时保持连通的边构成的子树。
Prim 算法和Kruskal算法在本质上都是在每次递归中选择当前权值最小的边并纳入最小生成树。
贪婪法在计算机领域应用广泛,我想是因为贪婪法有着简单直接的构造方法和深刻的思想背景。
贪婪法是在解决问题的过程中,每一步都按照最优贪心标准作出当前情况下的最优选择,使得在做出选择后问题得以稍加简化。
经过多次贪心选择,最终达到总体最优解。
然而贪心法并不总是可行的,因为总是在没有排除过其他可选条件的情况下直接选择了局部最优解。
在用贪心法解得可能最优解后,则需要证明在此种情况下使用贪心法的合理性。
在一些教材以及前人的论述中,认为关键是证明当前问题存在贪心选择性质(全局最优解可以通过局部最优贪心选择达到)和最优子结构性质(问题的最优解包含了其子问题的最优解)[2]。
在对一些案例进行总结的基础上,我认为可以将证明思路进一步改进。
把最小子问题的最优解与产生此子问题的选择合并,并按此一步步向前进行合并,当还原至原问题时,若所得到的解是总体最优的,那么此问题可以用贪心法解决。
例如,经典的0-1背包问题是不适用贪心法的案例。
假如度量标准选取单位重量物品的价值,最小子问题是选择背包中的最后一个物品。
由于物品不可切分,多数情况下背包余量将不足以容纳任何所剩物品。
矛盾由此产生,若这个位置就此空置,会极大拉低背包利用率,所以此法不能得到最优解。
常见的对贪心法的应用中,大多是涉及到某一特定问题时针对其加以证明。
我认为可以将具有某些相同性质的问题归类,对这一类加以证明,从而使贪心法的应用更加便捷。
例如,对基于集合的问题作如下猜想:已知一个特定有限非空的集合A,求在某最优化条件下从A中选择出的元素所组成的非空新集合。
首先证明该问题的最优子结构性质。
设该问题最优解为集合B。
由于B非空,必有元素a属于B。
对于a产生的子问题,B中包含的它的解C也必是最优的。
这是因为,若存在C’比C更符合优化条件,那么C就不是子问题最优解。
用C’替代在B中属于C的元素,从而产生B’。
B’中元素应会比B更优化,即B’才是最优解。
这与原假设B是问题最优解产生矛盾,故原命题得证。
也就是证明了问题的最优解包含了其子问题的最优解。
根据最优子结构性质可以证明此问题也存在贪心选择性质。
由于总体最优解包含子问题最优解,用集合的“并”运算就可以从子问题和贪心选择构成全局最优解。
经过以上证明,我认为猜想是正确的。
它的实质是集合具有明确性、无序性、互异性,并由此衍生出的集合性质与运算。
同时也应当注意猜想使用的范围。
就如在0-1背包问题中,最后一个位置有可能不足以容纳任何物品,它的地位与其它位置是不平等的,这不同于集合中元素之间的关系,所以0-1背包不能套用该猜想。
尽管贪心法在千变万化的实际情况中的证明仍是使用者的难题,
它已然在各个学科中有了丰富的应用。
剥除复杂的学术环境,在生活中贪心法也已经烙印在人们的行为模式中。
当我们购物找钱的时候,每次总是选择不大于剩余应找数额的最大面值的货币,这样就能使找钱次数最少、速度最快。
这是贪心法细微而潜在的应用。
贪婪法无处不在,是因为它的思想本质是方法最直接、思路最浅显地达成目的,不设迂回,这也是人朴素的本能。
然而为它命名的人却很幽默。
贪婪属于西方宗教中的七宗罪,是逃离控制的欲望。
当欲望失去了枷锁,就没有了前进的路。
我想前人学者们也是想通过这一名字警醒世人:无论是贪婪法,还是内心的欲望,都应该有选择的谨慎对待。
参考文献
[1].肖美华,刘文革,优化文件分配及磁盘文件存储之策略.南昌航空工业学院学报, 2001. 3
[2].Thomas H.Cormen,Charles E.Leiserson,Ronald L.Rivest,Clifford Stein,Introduction to Algorithms,潘金贵(译),顾铁成(译),李成法(译),算法导论(第二版).机械工业出版社。