算法合集之《参数搜索的应用》.ppt
参数搜索的应用,芜湖市第一中学 汪汀,引言,参数搜索是解决最优解问题的一种常见的方法。其本质就是对问题加入参数,先解决有参数的问题,再不断调整参数,最终求得最优解。下面通过几个例子来说明这一点。,问题一 分石子问题,有N个石子,每个石子重量Qi;按顺序将它们装进K个筐中;求一种方案,使最重的筐尽量轻。,问题一 分石子问题,N=9,K=39 7 5 6 8 4 3 2 716 19 16最大为199 7 5 6 8 4 3 2 7 21 18 12最大为21,问题一 分石子问题分析,本题可采用动态规划时间复杂度O(N2)能否找到实现更简单,更优秀的算法呢?,太高了,问题一 分石子问题分析,?,问题一 分石子问题分析,引入参数P,求一个判定可行解问题:判断是否存在最大重量不超过P的方案,问题一 分石子问题分析,可以用贪心法解决,具体方法如下:按顺序把石子放入筐,若一个筐中石子总重量不足P,我们就继续 对这个筐加入新的石子;如果超过P,则我们将石子放入新的筐中。,问题一 分石子问题分析,N=5,K=3,P=12,问题一 分石子问题分析,回到最初的问题:从小到大枚举P,找到第一个可行解,该解即为问题所求令T=Qi,则这个算法的时间复杂度为O(TN)需要进一步优化!,问题一 分石子问题分析,若我们能找到一个最大重量不超过P的方案,则我们可以找出一个最大重量不超过P+1的方案二分法!,问题一 分石子问题分析,不断重复以上步骤即可找到问题的最优解。时间复杂度O(NlogT)特别地,由于答案必定为某一段连续石子的重量和所以可以得到一个时间复杂度为O(Nlog3N)的算法,1,T,M,小结,首先引入参数P,解决带参数的问题;用贪心法可以判断是否存在最大重量和不超过p的方案;枚举P求出问题的最优解;二分法降低了算法的时间复杂度,最终解决了问题。,小结,首先引入参数P,解决带参数的问题;判断是否存在结果优于P的方案调整P得到最优解。通过二分法或迭代法减少调整次数,降低算法时间复杂度。,问题二 最大比率问题,有N道题目,每道题目有不同的分值和难度,分别为Ai,Bi(分值及难度均为正数);要求从某一题开始,连续选至少K道题目,满足分值和与难度和的比最大。,问题二 最大比率问题,例如N=7,K=3A 4 3 2 1B 2 2 1 3选择第3题到第6题,比为(9+8+9+9)/(1+1+2+1)=7这是上例的最优解,问题二 最大比率问题,先来解决一个与之类似的简化版问题:在一个数列中找连续多个数(至少K个),总和最大。建立一个队列Q,开始时队列只有K个元素,按顺序往队列中添加新的元素,添加后计算Q1+Q2.+QL-K 的和,记为S。若S0,则将Q1,Q2.QL-K从队列中删除,否则暂时保留这些数。并不断更新最大值。,问题二 最大比率问题分析,和为-,和为,和为-1,和为12,这就是最优解,扫描一遍的复杂度是线性的,问题二 最大比率问题分析,现在我们已经能在O(N)的时间内解决简化后的问题了。这个方法能不能应用于原题?很遗憾,由于原题中每个数据有两个参数,故它们对最终结果产生的影响是不确定的,因此对于原题我们不能直接套用这个算法。现在必须消除这个不确定因素。,问题二 最大比率问题分析,为此,我们必须引入参数p,求一个判定可行解问题:判断是否存在一个比大于p的方案,问题二 最大比率问题分析,新的问题可以这样描述:求两个下标i,j,满足j-i+1k(Ai+Ai+1.+Aj)/(Bi+Bi+1+Bj)p Ai+Ai+1.+Aj p(Bi+Bi+1+Bj)(Ai-pBi)+(Ai+1-pBi+1)+(Aj-pBj)0,问题二 最大比率问题分析,(Ai-pBi)+(Ai+1-pBi+1)+(Aj-pBj)0令Ci=Ai-pBi,Ci+Ci+1+Cj 0在数列C中找一段连续的数(至少K个),和为正数。我们能在O(N)的时间内找到中和最大的一段,记为S:若S0则找到了一个可行方案若S0,则问题无解,可以借用刚才的结论,问题二 最大比率问题分析,O(N)的时间判断出是否存在比不小于P的方案。通过二分法,调整参数P的大小,不断逼近最优解。时间复杂度O(NlogT),小结,上例的难点在于每道题有难度和分值两个数据,使我们无法确定它们对最终结果的影响,因此不能直接套用之前的扫描法。引入参数后,成功的消除了这个不确定因素,从而轻松的解决了问题。,总结,回顾两个例子:分石子问题:动态规划时空编程复杂度都很高参数搜索时空复杂度比较优秀效率比较高最大比率问题:直接扫描无法解决参数搜索问题豁然开朗降低思维复杂度,总结,参数搜索主要解决最优解问题,它的应用非常 广泛,优点也十分突出,使得我们解此类问题又多了一种有力的武器。通常情况下,它都不是独立出现的,需要配合 其他算法。例如:引入参数后往往要用贪心,动态规划等算法解决判定可行性问题,而为了减少枚举次数常采用二分等方法。形式较为简单,但实际应用中,我们不能拘泥于形式化的东西,必须根据实际情况,灵活使用,大胆创新,这样才能游刃有余的解决问题。,谢谢,