1、算法分析与设计贪心算法论算法分析与设计论文 贪心算法引言:算法复杂性的高低体现在运行该算法所需要的计算机资源多少上,所需要的资源越多,该算法的复杂性越高;反之,所需要的资源越少,该算法的复杂性越低。计算机资源最重要的是时间和空间资源,因此,算法的复杂性有时间复杂性和空间复杂性之分,不言而喻,设计复杂性尽可能低的算法是在设计算法时追求的重要目标。为了满足人们对大数据量信息处理的渴望,为解决各种实际问题,计算机算法学得到了飞速的发展,线性规划、动态规划、贪心策略等一系列运筹学模型纷纷运用到计算机算法学中,产生了解决各种现实问题的有效算法。虽然设计一个好的求解算法更像是一门艺术而不像是技术 ,但仍然
2、存在一些行之有效的、能够用于解决许多问题的算法设计方法 ,你可以使用这些方法来设计算法 ,并观察这些算法是如何工作的。一般情况下,为了获得较好的性能,必须对算法进行细致的调整。但是在某些情况下,算法经过调整之后性能仍无法达到要求,这时就必须寻求另外的方法来求解该问题。当一个问题具有最优子结构性质和贪心选择性质时,贪心算法通常会给出一个简单、直观和高效的解法。贪心算法通过一系列的选择来得到一个问题的解。它所作的每一个选择都是在当前状态下具有某种意义的最好选择,即贪心选择;并且每次贪心选择都能将问题化简为一个更小的与原问题具有相同形式的子问题。尽管贪心算法对许多问题不能总是产生整体最优解,但对诸如
3、最短路径问题、最小生成树问题,以及哈夫曼编码问题等具有最优子结构和贪心选择性质的问题却可以获得整体最优解。而且所给出的算法一般比动态规划算法更加简单、直观和高效。摘 要在求最优解问题的过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解,这种求解方法就是贪心算法。从贪心算法的定义可以看出,贪心法并不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解。贪心算法所作的选择可以依赖于以往所作过的选择,但决不依赖于将来的选择,也不依赖于子问题的解,因此贪心算法与其它算法
4、相比具有一定的速度优势。如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一。本文讲述了贪心算法的含义、基本思路及实现过程,贪心算法的核心、基本性质、特点及其存在的问题。并通过贪心算法的特点举例列出了以往研究过的几个经典问题,对于实际应用中的问题,也希望通过贪心算法的特点来解决。关键词:贪心算法;最小生成树;多处最优服务次序问题;删数问题Greedy algorithm design and its practical applicationJiang YuanliDepartment of Information Management, Southwest University,
5、 Rongchang, ChongqingAbstract:Greedy algorithm is that, in the problem solving, it always made in the current appears to be the best option. In other words, not the best on the whole to be considered, he made only a local optimal solution in a sense. Greedy algorithm is not a right that all problems
6、 can be the overall optimal solution, but it covers a wide range of issues that he could produce an overall optimal solution or approximate solution of the overall optimal solution. This paper describes the core of the greedy algorithm, characteristics and algorithms inherent problems, then presente
7、d the results of our predecessors has been studied out, including Huffman coding, single-source shortest path, minimum spanning tree and so on. Then with practice, study the various optimal service order issues, delete a few issues, car fuel, the optimal merger, venue arrangements and so on. At last
8、, the code to achieve two of them on the greedy algorithm to do the concrete implementation method in detail.Key words:greedy algorithm;Huffman coding;MST;Optimal service order;Automobile refueling正 文1、贪心算法定义:贪心算法可以简单描述为:对一组数据进行排序,找出最小值,进行处理,再找出最小值,再处理。也就是说贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望得到结果是最好
9、或最优的算法。贪心算法是一种能够得到某种度量意义下的最优解的分级处理方法,通过一系列的选择来得到一个问题的解,而它所做的每一次选择都是当前状态下某种意义的最好选择,即贪心选择。即希望通过问题的局部最优解来求出整个问题的最优解。这种策略是一种很简洁的方法,对许多问题它能产生整体最优解,但不能保证总是有效,因为它不是对所有问题都能得到整体最优解,只能说其解必然是最优解的很好近似值。2、贪心算法的基本思路及实现过程贪心的基本思想:用局部解构造全局解,即从问题的某一个初始解逐步逼近给定的目标,以尽可能快地求得更好的解。当某个算法中的某一步不能再继续前进时,算法停止。贪心算法思想的本质就是分治,或者说:
10、分治是贪心的基础。每次都形成局部最优解,换一种方法说,就是每次都处理出一个最好的方案。利用贪心策略解题,需要解决两个问题:(1)该题是否适合于用贪心策略求解;(2)如何选择贪心标准,以得到问题的最优/较优解。贪心算法的实现过程:(1)应用同一规则F,将原问题变为一个相似的、但规模更小的子问题;(2)从问题的某一初始解出发:While(能朝给定目标前进一步)求出可行解的一个解元素;(3)由所有解元素组合成问题的一个可行解。3、贪心算法的核心 贪心算法的核心问题是选择能产生问题最优解的最优度量标准,即具体的贪心策略。 贪心策略是指从问题的初始状态出发,通过若干次的贪心选择而得出最优值(或较优解)的
11、一种解题方法。其实,从“贪心策略”一词我们便可以看出,贪心策略总是做出在当前看来是最优的选择,也就是说贪心策略并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解,而许多问题自身的特性决定了该题运用贪心策略可以得到最优解或较优解。4、贪心算法的特点贪心算法的最大特点就是快,通常是线性二次式,不需要多少额外的内存。一般二次方级的存储要浪费额外的空间,而且那些空间经常得不出正解。但是,使用贪心算法时,这些空间可以帮助算法更容易实现且更快执行。如果有正确贪心性质存在,那么一定要采用。因为它容易编写,容易调试,速度极快,并且节约空间。几乎可以说,此时它是所有算法中最好的。但是应该注意,贪
12、心算法有两大难点:(1)如何贪心怎样用一个小规模的解构造更大规模的解呢?总体上,这与问题本身有关。但是大部分都是有规律的。正因为贪心有如此性质,它才能比其他算法快。具有应当采用贪心算法的问题,当“贪心序列”中的每项互异且当问题没有重叠性时,看起来总能通过贪心算法取得(近似)最优解的。或者,总有一种直觉在引导我们对一些问题采用贪心算法。其中“找零钱”这个问题就是一个例子。题中给出的硬币面值事实上具有特殊性,如果面值发生变化,可能贪心算法就不能返回最优解了。但是,值得指出的是,当一个问题具有多个最优解时,贪心算法并不能求出所有最优解。另外,我们经过实践发现,单纯的贪心算法是顺序处理问题的;而且每个
13、结果是可以在处理完一个数据后即时输出的。(2)贪心的正确性要证明贪心性质的正确性,才是贪心算法的真正挑战,因为并不是每次局部最优解都会与整体最优解之间有联系,往往靠贪心算法生成的解不是最优解。这样,贪心性质的证明就成了贪心算法正确的关键。对某些问题贪心性质也许是错的,即使它在大部分数据中都是可行的,但还必须考虑到所有可能出现的特殊情况,并证明该贪心性质在这些特殊情况中仍然正确。而这样容易陷入证明不正确贪心性质的泥塘中无法自拔,因为贪心算法的适用范围并不大,而且有一部分极难证明,若是没有把握,最好不要冒险,还有其他算法会比它要保险。5、贪心算法的理论基础贪心策略是最接近人类认知思维的一种解题策略
14、。但是,越是显而易见的方法往往越难以证明。下面我们就来介绍贪心策略的理论拟阵。“拟阵”理论是一种能够确定贪心策略何时能够产生最优解的理论,虽然这套理论还很不完善,但在求解最优化问题时发挥着越来越重要的作用。拟阵M定义为满足下面3个条件的有序对(S,I):(1)S是非空有限集;(2)I是S的一类具有遗传性质的独立子集族,即若BI,则B是S的独立子集,且B的任意子集也都是S的独立子集。空集必为I的成员;(3)I满足交换性质,即若AI,BI且|A|B|,则存在某一元素xB-A,使得AxI。定理2.1 拟阵M中所有极大独立子集具有相同大小。引理2.1 (拟阵的贪心选择性质)设M=(S,I)是具有权函数
15、M的带权拟阵,且S中元素依权值从大到小排列,又设xS是S中第一个使得x是独立子集元素,则存在S的最优子集A使得xA。引理2.2 设M=(S,I)是拟阵。若S中元素x不是空集的一个可扩元素,则x也不可能是S中任一独立子集A的可扩展元素。引理2.3 (拟阵的最优子结构性质)设x是求带权拟阵M=(S,I)的最优子集的贪心算法Greedy所选择的S中的第一个元素。那么,原问题可简化为求带权拟阵M=(S,I)的最优子集问题,其中S=y|yS且x,yII=B|BS-x且BxIM的权函数是M的权函数在S上的限制(称M为M关于元素x的收缩)。定理2.4(带权拟阵贪心算法的正确性)高M=(S,I)是具有权函数W
16、的带权拟阵,算法Greedy返回M的最优子集。适宜于用贪心策略来求解的许多问题都可以归结为在加权拟阵中找一个具有最大权值的独立子集的问题,即给定一个加权拟阵M=(S,I),若能找出一个独立且具有最大可能权值的子集A,且A不被M中比它更大的独立子集所包含,那么A为最优子集,也是一个最大的独立子集。我们认为,针对绝大多数的信息学问题,只要它具备了“拟阵”的结构,便可用贪心策略求解。拟阵理论对于我们判断贪心策略是否适用于某一复杂问题是十分有效的。6、举例多处最优服务次序问题6.1.1 问题的提出设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti,1=i=n。共有s处可以提供此项服务。应如何安排
17、n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。6.1.2 贪心选择策略假设原问题为T,而我们已经知道了某个最优服务系列,即最优解为A=t(1),t(2),t(n)(其中t(i)为第i个用户需要的服务时间),则每个用户等待时间为:T(1)=t(1);T(2)=t(1)+t(2);.T(n):t(1)+t(2)+t(3)+t(n);那么总等待时问,即最优值为:TA=n*t(1)+(n-1)*t(2)+(n+1-j)*t(i)+2*t(n-1)+t(n);由于平均等待时间是n个顾客等待时间的总和除以n,故本题实际上就是求使顾客等待时间的总和最小的服务次
18、序。本问题采用贪心算法求解,贪心策略如下:对服务时间最短的顾客先服务的贪心选择策略。首先对需要服务时间最短的顾客进行服务,即做完第一次选择后,原问题T变成了需对n-1个顾客服务的新问题T。新问题和原问题相同,只是问题规模由n减小为n-1。基于此种选择策略,对新问题T,选择n-1顾客中选择服务时间最短的先进行服务,如此进行下去,直至所有服务都完成为止。6.1.3 问题的贪心选择性质先来证明该问题具有贪心选择性质,即最优服务A中t(1)满足条件:t(1)=t(i)(2it(i)(i1)。 设另一服务序列B=(t(i),t(2),t(1),t(n))那么TA-TB=n*t(1)-t(i)+(n+1-
19、i)t(i)-t(1)=(1-i)*t(i)-t(1)0即TATB,这与A是最优服务相矛盾。 故最优服务次序问题满足贪心选择性质。6.1.4 问题的最优子结构性质在进行了贪心选择后,原问题T就变成了如何安排剩余的n-1个顾客的服务次序的问题T,是原问题的子问题。若A是原问题T的最优解,则A=t(2),t(i)t(n)是服务次序问题子问题T的最优解。证明:假设A不是子问题T的最优解,其子问题的最优解为B,则有TBTA,而根据TA的定义知,TA十t(1)=TA。因此TB+t(1)TA+t(1)=TA,即存在一个比最优值TA更短的总等待时间,而这与TA为问题T的最优值相矛盾。因此,A是子问题T的最优
20、值。从以上贪心选择及最优子结构性质的证明,可知对最优服务次序问题用贪心算法可求得最优解。根据以上证明,最优服务次序问题可以用最短服务时间优先的贪心选择可以达到最优解。故只需对所有服务先按服务时间从小到大进行排序,然后按照排序结果依次进行服务即可。平均等待时间即为TA/n。6.1.5 算法结果分析程序主要是花费在对各顾客所需服务时间的排序和贪心算法,即计算平均服务时间上面。其中,贪心算法部分只有一重循环影响时间复杂度,其时间复杂度为O(n):而排序在这里采用希尔(Shel1)排序,其时间复杂度为O(nlogn)。因此,综合来看算法的时间复杂度为O(nlogn)。最优合并问题6.2.1 问题的提出
21、给定k个排好序的序列S1,S2,Sk,用2路合并算法将这k个序列合并成一个序列。假设所采用的2路合并算法合并2个长度分别为m和n的序列需要m+n-1次比较。试设计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。 6.2.2 原理分析 这个程序比较适合用堆,最优用最小堆,最差用最大堆;以最优合并为例:(1)使用各序列的长度建堆; (2)两个最小的元素出堆,计算这两序列合并需要的比较次数,该次数入堆; (3)重复(2),直到堆只剩下一个元素; 最后剩下的元素即为题目的解。6.2.3 算法时间复杂度分析复杂度
22、为O(nlogn),排序后,最小的两个序列是前两个,计算最小的两个序列的合并次数后,该次数不一定是新的最小的两个序列之一,所以在下一次合并前,必需使数组仍旧有序,让最小的两个序列在数组的最前面,为使数组重新有序,可以使用类似插入排序的插入过程,将新得到的数字直接插入到数组,这样不需要额外的储存空间,但总复杂度是O(n2),考虑到需要计算最优与最差,实际上也必须需要额外的O(n)的空间来保存排序后的结果,如果将排序后的数组按照顺序作成一个链表,那么链表的最前的两节点就是最小的两序列,计算合并次数,删除该两节点,将新得到的次数插入到链表,注意到,后面需要插入的数字肯定比前面插入的数字大,所以从上一
23、次插入的位置之后查找新的插入位置,这样插入数字的总的时间复杂度是O(n)的,总的时间复杂度仍旧是O(nlogn),并使用了额外的O(n)的空间。总 结 对于贪心算法的应用,如果某个问题具有贪心算法的贪心选择性质和最优子结构性质,那么,它就可以采用贪心策略进行分析,进而求解,贪心算法的应用举例不仅只有本论文中的那几个,他对于背包问题、最优装载问题、硬币找钱问题等都是十分方便有效的算法,贪心算法在科学计算和工程中的应用也越来越广泛,例如用贪心算法进行三角剖分的指纹匹配方法、贪心算法在竞赛中的应用、贪心算法在排课系统中的应用、贪心聚类算法及其在遥感图像分类和压缩中的应等。贪心算法是很常见的算法,贪心
24、策略是最接近人的日常思维的一种解题策略,虽然它不能保证求得的最后解一定是最佳的,但是它可以为某些问题确定一个可行性范围。贪心算法所作的选择依赖于以往所作过的选择,但决不依赖于将来的选择,这使得算法在编码和执行过程中都有一定的速度优势。对于一个问题的最优解只能用穷举法得到时,用贪心算法是寻找问题最优解的较好算法。对一个问题可以同时用几种方法解决,贪心算法并不是对所有的问题都能得到整体最优解或是最理想的近似解时,就需判断贪心性质的正确性了。与回溯法、动态规划法等比较,它的适用区域相对狭窄许多。总之,如果一个贪心解决方案存在,就可以使用它。参考文献1王晓东.算法分析与设计(第3版)清华大学出版社2 M.H.ALSUWAIYEL.算法设计技巧与分析M.北京:电子工业出版社3 殷建平.关于贪心算法的正确性证明M.江西师范大学学报(自然科学版)北 华 大 学算法分析与设计论文题 目: 贪心算法的应用 姓 名 : 王晗雪 毕业学院 : 计算机科学技术学院 专业班级 : 软 件 13-2 班 学 号 : 201317020223 指导教师 : 刘锡祥 资料仅供参考!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1