当前位置:文档之家› 算法与计算复杂性课程(6)贪心

算法与计算复杂性课程(6)贪心

贪心法(Greedy Approach)基本思想算法设计设计要素与动态规划法的比较正确性证明得不到最优解的处理办法应用实例1基本思想实例:最小生成树的Kruskal算法,活动选择问题适用问题:组合优化问题,满足优化原则设计方法:多步判断,解为判断序列选择依据:是否满足约束条件局部优化测度使用贪心法要解决的问题:是否可以得到最优解?不能得到最优解,解与最优解的误差估计2例1 活动选择问题S={1, 2, …, n}为n项活动的集合s i, f i分别为活动i 的开始和结束时间≥f j或s j≥f i活动i 与j相容当且仅当si求最大的两两相容的活动集思路:按结束时间递增顺序将活动排列为1,2,…,n, ≤f2≤…≤f n使得f1按照标号从小到大选择3定理1 算法Select 执行到第k步, 选择k项活动i1= 1, i2, …, ik, 那么存在最优解A包含i 1=1,i2, …, ik正确性证明根据定理:算法至多到第n步得到最优解67•证明存在最优解包含活动1•假设按照算法前k 步选择都导致最优解,证明第k +1步选择也导致最优解1. 第k 步:选择活动i 1=1, i 2, …, i k2. 归纳假设:存在最优解A ={i 1=1, i 2, …, i k }∪BB 是剩下的待选活动集S ’的一个最优解3. 由归纳基础,存在S ’的最优解B’包含i k +14. 由|B’|=|B | 知A’={i 1=1, i 2, …, i k }∪B’最优5. A’={i 1=1, i 2, …, i k , i k +1}∪(B’-{i k +1})最优. 对步数进行归纳的证明思路8归纳基础设S ={1,2,…,n }是活动集,活动按截止时间递增顺序排序.k =1, 证明存在最优解包含活动1.任取最优解A , A 中的活动按照截止时间递增的顺序排列. 如果A 的第一个活动为j ,j ≠1, 令A ’= (A −{j })∪{1}, 由于f 1≤f j , A ’也是最优解,且含有1.9}){'(},,...,{'},...,,{112121++−∪=∪k k k k i B i i i i B i i i 也是原问题的最优解.归纳步骤假设命题对k 为真,证明对k +1也为真.算法执行到第k 步, 选择了活动i 1=1, i 2, …, i k , 根据归纳假设存在最优解A 包含i 1= 1, i 2, …, i k , A 中剩下的活动选自集合S ’={ i | i ∈S , s i ≥f k },且A = {i 1, i 2, …, i k }∪BB 是S ’的最优解. 若不然, S ’的最优解为B*, B*的活动比B 多,那么B*∪{1, i 2, …, i k }是S 的最优解,且比A 的活动多,与A 的最优性矛盾.根据归纳基础,存在S ’的最优解B’含有S ’中的第一个活动,设为i k +1, 且|B ’|=|B |, 于是贪心算法的设计适用:满足优化原则的组合优化问题问题求解表示成多步判断整个判断序列对应问题的最优解子序列对应子问题的最优解贪心选择:确定一个优化测度不考虑以前的选择,只与当前状态有关以优化测度的极大(或极小)作为依据10贪心算法的设计(续)确定是否满足贪心选择性质具有贪心选择性质得到最优解,否则为近似解正确性证明:归纳法:证明贪心法得到最优解对算法步数归纳、对问题规模归纳交换论证:在保证最优性不变的前提下,从一个最优解出发进行逐步替换,最终得到贪心法的解自顶向下计算通过贪心选择,将原问题规约为子问题线性表记录选择的结果1113数学归纳法叙述一个可以归纳证明的命题:•对步数k 归纳对于任意k ,k 步贪心选择得到i 1,i 2,…,i k , 那么存在最优解包含i 1,i 2,…,i k •规模k 归纳:对于任意k ,贪心法得到关于规模为k 的问题的最优解归纳基础:k =1, 命题为真归纳步骤:假设对<k 的正整数命题为真,证明对k 命题也为真贪心选择性质的证明14ni x c x w x i i ni i ni i ,...,2,11,0max 11==≤∑∑==贪心法:将集装箱按照从轻到重排序,轻者先装例2 最优装载Loadingn 个集装箱1,2,…,n 装上轮船,集装箱i 的重量w i , 轮船装载重量限制为c ,无体积限制. 问如何装使得上船的集装箱最多?不妨设w i ≤c .贪心选择性质证明对规模的归纳•设集装箱标号按照从轻到重记为1,2,…,n •n=1,贪心选择得到最优解(只有1个箱子)•假设对于规模为n-1的输入得到最优解,证明对规模为n的输入也得到最优解15归纳步骤假设对于n-1个集装箱的输入,贪心法都可以得到最优解,考虑n个集装箱的输入N={1,2,…,n}, 其中w1≤w2≤…≤w n.由归纳假设,对于N’={2,3,…,n},c’=c-w1, 贪心法得到最优解I’. 令I={1}∪I’,则I是关于N的最优解.若不然,存在包含1的关于N的最优解I*(如果I*中没有1,用1替换I*中的第一个元素得到的解也是最优解),且|I*|>|I|;那么I*−{1}是N’的解且|I*−{1}|>|I−{1}|=|I’|与I’的最优性矛盾.16说明Loading算法复杂性T(n)=O(n log n)Loading问题是0-1背包问题的特例:即v=1, i=1,2,…,n.i该问题是O(n log n)时间可解的0-1背包问题是NP难的。

1718贪心选择性质的证明交换论证例3 最小延迟调度问题任务集合S ,∀i ∈S ,d i 为截止时间,t i 为加工时间,d i , t i 为正整数.一个调度f :S →N ,f (i )为任务i 的开始时间. 求最大延迟达到最小的调度,即求f 使得}})({max {min i i Si f d t i f −+∈)()(or )()(,,,i f t j f j f t i f j i S j i j i ≤+≤+≠∈∀贪心策略选择从小到大安排任务贪心策略1:按照ti贪心策略2:按照d−t i从小到大安排任务i从小到大安排任务贪心策略3:按照di策略1 对某些实例得不到最优解.=1, d1=100, t2=10, d2=10反例:t1策略2对某些实例得不到最优解.反例:t=1, d1=2, t2=10, d2=10119算法设计1.Sort(S)使得d1≤d2 ≤…≤d n2. f(1)←0,i←23.while i≤n do4.f(i)←f(i−1)+t i-15.i←i+1从小到大选择按照截止时间di20交换论证——正确性证明算法的解的性质: 没有空闲时间, 没有逆序. 逆序(i,j): f(i)<f(j) and di>dj命题1 所有没有逆序、没有空闲时间的调度具有相同的最大延迟. 因为f1与f2都没有逆序,具有相同截止时间的任务必 须被连续安排. 在这些任务中最大延迟是最后一个任 务,被延迟的时间只与已安排任务加工时间之和 有关,与任务标号无关.21交换论证:从一个没有空闲时间的最优解出发,在不改变最优性的条件下,转变成没有逆序的解. (1) 如果一个最优调度存在逆序,那么存在i<n使得 (i,i+1)构成一个逆序. (2) 存在逆序(i,j),j=i+1,那么交换i和j 得到的解的 逆序数减1,后面证明这个新的调度仍旧最优. (3) 至多经过n(n-1)/2次交换得到一个没有逆序的最 优调度.22证明:调度 f1, (i,j) 构成逆序, j=i+1, di>dj 交换 i与 j 得到 f2, f2比 f1不增加最大延迟时间(1) 交换 i, j 对其他任务的延迟时间没影响 (2) 交换后不增加 j 的延迟 (3) 任务i 在 f2 的延迟 L2i 小于任务 j 在 f1的延迟 L1j , 因 此小于f1的最大延迟 f1(i)=s f1(j)=s+ti f1(j)+tj =s+ti+tj i j f2(j)=s f2(i)=s+tj j i f2(i)=s+tj+tii 在 f2 结束时间 = j 在 f1 的结束时间 = s+ti+tj j 在 f1 的延迟: L1j = (s+ti+tj)−dj dj < di ⇒ L2i <L1j i 在 f2 的延迟: L2i = (s+ti+tj)−di23贪心法得不到最优解 的处理办法讨论对于哪些输入贪心选择能够得到最优解 输入应该满足的条件 讨论贪心法的解最坏情况下与最优解的误差 绝对误差与相对误差估计24确定得到最优解的输入 所满足的条件例4 找零钱问题 设有n种零钱, 重量分别为 w1, w2, ... , wn, 价值分别为 v1=1, v2, ... , vn. 付的总钱数是 y 如何付钱使得所付钱的总重最轻?25动态规划算法属于整数规划问题 动态规划算法可以得到最优解 设Fk(y)表示用前k种零钱,总钱数为y的最小重量 递推方程Fk +1 ( y ) =⎢ y ⎥ 0 ≤ x k +1 ≤ ⎢ ⎥ v ⎣ k +1 ⎦min{ Fk ( y − vk + 1 xk + 1 ) + wk + 1 xk +1 }⎢ y⎥ F1 ( y ) = w1 ⎢ ⎥ = w1 y ⎣ v1 ⎦26Greedy算法假设w1 w2 wn ≥ ≥ ... ≥ v1 v2 vn使用前k种零钱,总钱数为y 贪心法的总重为Gk(y),则有如下递推方程⎢ y ⎥ Gk + 1 ( y ) = w k + 1 ⎢ ⎥ + Gk ( y mod vk +1 ) ⎣ vk +1 ⎦ ⎢ y⎥ G1 ( y ) = w1 ⎢ ⎥ = w1 y ⎣ v1 ⎦27n=2时得到最优解F1(y) = G1(y) , F2(y) = G2(y)[ F1 ( y − v 2 ( x 2 + δ )) + w 2 ( x 2 + δ )] − [ F1 ( y − v 2 x 2 ) + w 2 x 2 ] = [ w1 ( y − v 2 x 2 − v 2δ ) + w 2 x 2 + w 2δ ] − [ w1 ( y − v 2 x 2 ) + w 2 x 2 ] = − w1v 2δ + w 2δ = δ ( − w1v 2 + w 2 ) ≤ 028n>2时得到最优解的判定条件定理2 假定 Gk(y)=Fk(y), vk+1>vk 且 vk+1 = pvk-δ, 0≤δ<vk, p∈Z+, 则以下命题等价.(1) G k +1 ( y ) ≤ G k ( y ) ( 2) G k +1 ( y ) = Fk +1 ( y ) ( 3) G k +1 ( pv k ) = Fk +1 ( pv k ) (4) w k +1 + G k (δ ) ≤ pw k用条件(4)需O(k)时间验证Gk+1(y)=Fk+1(y)? 对n种零钱作出验证, 可在O(n2)时间内完成29实验证 G3(y) = F3(y)例例 v1=1, v2=5, v3=14, v4=18, wi=1, i=1, 2, 3, 4. 对一切 y 有G1(y)=F1(y), G2(y)=F2(y). vk+1 = pvk-δ, 0≤δ<vk, p∈Z+, v3=14=3 v2-1, 即 p=3, δ=1.w k +1 + G k (δ ) ≤ pw kw3+G2(δ)=1+ G2(1) =1+1 = 2 pw2=3×1=3 w3+G2(δ)≤ p w23032例5 装箱问题有n 个物体, 长度分别为a 1,a 2,...,a n , a i ≤1,i =1,2,…,n . 要把它们装入长为1的箱子(只考虑长度的限制)问至少需要多少只箱子?mj B C B C a mj n i m j j i ,...,2,1,1)()(min 11=≤=∑∑==,C (B j ) 称为箱子B j 的装入量1—C (B j ) 称为箱子B j 的空隙近似解的误差估计例6 最优二元前缀码问题前缀码:用0-1字符串作为代码表示字符,要求任何字符的代码都不能作为其它字符代码的前缀非前缀码a---001, b---00, c---010, d---010100001: 01, 00, 001 d, b, a010, 00, 01 c, b, d前缀码的存储采用二叉树的结构,每个字符作为树叶,每个前缀码看作根到树叶的路径, x2, …, x n,输入:n个字符x1), i=1, 2, …, n.每个字符传输概率f(xi求:前缀码,使得平均传输一个字符的位数达到最小算法:Huffman树得到最优解3941例如a :45, b :13; c :12; d :16; e :9; f :5, Huffman树为平均位数:4*5%+4*9%+3*16%+3*12%+3*13%+1*45% = 2.24编码:f --0000, e --0001, d --001, c --010, b —011, a --1正确性证明•证明存在一个对应于最优前缀码的二叉树,以最小的频率作为树叶,且这两片树叶是兄弟•证明x, y 是树叶兄弟,z 是x, y 的父亲,z 的频率f[z]=f[x]+f[y], 令T ’= T−{x,y},则T ’是对应于最优前缀码C’= (C−{x,y})∪{z}的树4243则T 与T’的权之差为其中d T (i )为i 在T 中的层数(i 到根的距离)∑∑≥−=−∈∈Ci Ci T T i d i f i d i f T B T B 0)(][)(][)'()('引理1设C 是字符集,∀c ∈C , f [c ]为频率,x ,y ∈C , f [x ],f [y ]频率最小,那么存在最优二元前缀码使得x , y 的码字等长,且仅在最后一位不同.T →T’f [y ] ≤f [c ]f [x ] ≤f [b ]b 与x 交换c 与y 交换交换论证44引理2 设T 是最优解对应的树,∀x ,y ∈T , x ,y 是树叶兄弟,z 是x ,y 的父亲,z 的频率f [z ]=f [x ]+f [y ], 令T ’= T −{x ,y }, 则T ’是对应于最优前缀码C ’=(C −{x ,y })∪{z }的树证明:∀c ∈C −{x ,y },有d T (c )=d T ’(c ) ⇒f [c ]d T (c )=f [c ]d T ’(c ) 由d T (x ) =d T (y ) = d T ’(z ) +1得f [x ] d T (x ) + f [y ] d T (y ) = (f [x ] + f [y ]) (d T ’(z ) + 1)= f [z ]d T ’(z ) + (f [x ] + f [y ])从而B (T ) = B (T ’) + f [x ] + f [y ]若T ’不是关于C ’的最优树,那么存在T*使得B (T*)<B (T ’), z 是T*中的树叶,将x,y 加到z 上作为儿子,那么得到B (T*) + f [x ] + f [y ] < B (T )与T 的最优性矛盾.定理3 Haffman 算法得到最优前缀码算法•Huffman树的算法•时间O(n log n)49。

相关主题