欢迎来到天天文库
浏览记录
ID:33752251
大小:260.00 KB
页数:17页
时间:2019-02-28
《《算法设计技术》doc版》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、蒂羂肄芈螀羁膇蒄蚆羀艿芇薂聿罿蒂蒈肈肁芅螇肈膃蒀螃肇莆芃虿肆肅蕿薅蚂膈莂蒁蚁芀薇蝿蚁羀莀蚅螀肂薅薁蝿膄莈蒇螈莆膁袆螇肆蒆螂螆膈艿蚈螅芁蒅薄螅羀芈蒀螄肃蒃蝿袃膅芆蚅袂芇蒁薁袁羇芄薇袀腿薀蒂衿节莂螁衿羁薈蚇袈肄莁薃袇膆薆葿羆芈荿螈羅羈膂蚄羄肀莇蚀羃节膀薆羃羂蒆蒂羂肄芈螀羁膇蒄蚆羀艿芇薂聿罿蒂蒈肈肁芅螇肈膃蒀螃肇莆芃虿肆肅蕿薅蚂膈莂蒁蚁芀薇蝿蚁羀莀蚅螀肂薅薁蝿膄莈蒇螈莆膁袆螇肆蒆螂螆膈艿蚈螅芁蒅薄螅羀芈蒀螄肃蒃蝿袃膅芆蚅袂芇蒁薁袁羇芄薇袀腿薀蒂衿节莂螁衿羁薈蚇袈肄莁薃袇膆薆葿羆芈荿螈羅羈膂蚄羄肀莇蚀羃节膀薆
2、羃羂蒆蒂羂肄芈螀羁膇蒄蚆羀艿芇薂聿罿蒂蒈肈肁芅螇肈膃蒀螃肇莆芃虿肆肅蕿薅蚂膈莂蒁蚁芀薇蝿蚁羀莀蚅螀肂薅薁蝿膄莈蒇螈莆膁袆螇肆蒆螂螆膈艿蚈螅芁蒅薄螅羀芈蒀螄肃蒃蝿袃膅芆蚅袂芇蒁薁袁羇芄薇袀腿薀蒂衿节莂螁衿羁薈蚇袈肄莁薃袇膆薆葿羆芈荿螈羅羈膂蚄羄肀莇蚀羃节膀薆羃羂蒆蒂羂肄芈螀羁膇蒄蚆羀艿芇薂聿罿蒂蒈肈肁芅螇肈膃蒀螃肇莆芃虿肆肅蕿薅蚂膈算法设计技术常用技术分治法(DivideandConquer)贪心法(Greedy)动态规划法(Dynamicprogramming)回溯法(Backtracking)分枝界
3、限法(BranchandBound)局部搜索法(Localsearchalgorithms)一、分治法定义:对于一个输入大小为n的函数或问题,用某种方法把输入分划成k个子集。(14、xmin(s);1.if5、s6、=22.thenbegin设7、s8、={c,d};3.(a,b)←(MAX(c,d),MIN(c,d)).endelsebegin4.把S分成二个子集S1,S2,各存一半元素;5.(maxl,minl)←maxmin(S1);6.(max2,min2)←maxmin(S2);7.(a,b)←(MAX(max1,max2),MIN(min1,min2))end例:1.2找第k个最小元素。一般先分类为递减序列,得到第k个最小元素,要O(nlogn).分治法可以O(n)内得到第k9、个最小元素。当k=[n/2]时,成为在线性时间内找一个序列的中值问题。17procedureSELECT(k,s)bagin.1.if10、s11、<50then2.begin3.把S分类4.returnS的第K个最小元素.end5.else6.begin7.把S划分成各为五个元素的[12、s13、/5]个子序列;8.设L是剩余元素(如果有的话);9.把上述各个5元素序列分类;10.设M是5个元素的中值序列;11.m←SELECT(Ñ14、M15、/2Ò,M);12.设S1,S2,S3为S的分别<,=,>m的元素序列;13.16、if17、S118、≥kthenreturnSELECT(k,S1)else14.if(19、S120、+21、S222、≥k)thenreturnm15.else16.returnSELECT(k-23、S124、-25、S226、,S3)endend说明:1.把S大问题化为S1,S2,S3三个小问题。2.选合适中值,原n变为[n/5]个数中选,速度就快5倍。至少有1/4的元素m,至少有1/4的元素m。3.子序列用5分割是算法中有二个SELECT递归调用,每次是对r27、s28、的序列调用,二个序列之和必须<29、s30、的保证。每列为5个元素分类序列按31、分类次序列出的序列Mm[n/5]个已分类序列17Procedure(k,s)(类似快速分类)1.if32、s33、=12.thenreturnSelse3.begin4.随机地从S选出一个元素a;5.设S1,S2,S3分别为>,=,34、S135、≥kthenreturnSELECT(k,S1)else7.if36、S137、+38、S239、≥kthenreturn(a)8.else9.returnSELECT(k-40、S141、-42、S243、,S3)end一、贪心法问题:n个输入及一组约束条件。求:可行解---满足约束条44、件的任一输入子集。最优解---满足给定目标函数达到极大或极小的解。方法:①每步上考虑一个输入②根据某个优化测度(可以是目标函数),每一步上都保证获得局部最优解。③一步一步进行,直到可行解。注意:贪心法并不一定是最优解,但当一个问题复杂度很高时能用低得多的方法快速得到次优解也值得。例2.1背包(knapsack)问题。问题:n个物体(物体i的重量为wi,价值为pi)背包载荷能力m求:把物体i的Xi部分(1in,0Xi1)装入背包中,使背包内所放物体的价值最
4、xmin(s);1.if
5、s
6、=22.thenbegin设
7、s
8、={c,d};3.(a,b)←(MAX(c,d),MIN(c,d)).endelsebegin4.把S分成二个子集S1,S2,各存一半元素;5.(maxl,minl)←maxmin(S1);6.(max2,min2)←maxmin(S2);7.(a,b)←(MAX(max1,max2),MIN(min1,min2))end例:1.2找第k个最小元素。一般先分类为递减序列,得到第k个最小元素,要O(nlogn).分治法可以O(n)内得到第k
9、个最小元素。当k=[n/2]时,成为在线性时间内找一个序列的中值问题。17procedureSELECT(k,s)bagin.1.if
10、s
11、<50then2.begin3.把S分类4.returnS的第K个最小元素.end5.else6.begin7.把S划分成各为五个元素的[
12、s
13、/5]个子序列;8.设L是剩余元素(如果有的话);9.把上述各个5元素序列分类;10.设M是5个元素的中值序列;11.m←SELECT(Ñ
14、M
15、/2Ò,M);12.设S1,S2,S3为S的分别<,=,>m的元素序列;13.
16、if
17、S1
18、≥kthenreturnSELECT(k,S1)else14.if(
19、S1
20、+
21、S2
22、≥k)thenreturnm15.else16.returnSELECT(k-
23、S1
24、-
25、S2
26、,S3)endend说明:1.把S大问题化为S1,S2,S3三个小问题。2.选合适中值,原n变为[n/5]个数中选,速度就快5倍。至少有1/4的元素m,至少有1/4的元素m。3.子序列用5分割是算法中有二个SELECT递归调用,每次是对r
27、s
28、的序列调用,二个序列之和必须<
29、s
30、的保证。每列为5个元素分类序列按
31、分类次序列出的序列Mm[n/5]个已分类序列17Procedure(k,s)(类似快速分类)1.if
32、s
33、=12.thenreturnSelse3.begin4.随机地从S选出一个元素a;5.设S1,S2,S3分别为>,=,34、S135、≥kthenreturnSELECT(k,S1)else7.if36、S137、+38、S239、≥kthenreturn(a)8.else9.returnSELECT(k-40、S141、-42、S243、,S3)end一、贪心法问题:n个输入及一组约束条件。求:可行解---满足约束条44、件的任一输入子集。最优解---满足给定目标函数达到极大或极小的解。方法:①每步上考虑一个输入②根据某个优化测度(可以是目标函数),每一步上都保证获得局部最优解。③一步一步进行,直到可行解。注意:贪心法并不一定是最优解,但当一个问题复杂度很高时能用低得多的方法快速得到次优解也值得。例2.1背包(knapsack)问题。问题:n个物体(物体i的重量为wi,价值为pi)背包载荷能力m求:把物体i的Xi部分(1in,0Xi1)装入背包中,使背包内所放物体的价值最
34、S1
35、≥kthenreturnSELECT(k,S1)else7.if
36、S1
37、+
38、S2
39、≥kthenreturn(a)8.else9.returnSELECT(k-
40、S1
41、-
42、S2
43、,S3)end一、贪心法问题:n个输入及一组约束条件。求:可行解---满足约束条
44、件的任一输入子集。最优解---满足给定目标函数达到极大或极小的解。方法:①每步上考虑一个输入②根据某个优化测度(可以是目标函数),每一步上都保证获得局部最优解。③一步一步进行,直到可行解。注意:贪心法并不一定是最优解,但当一个问题复杂度很高时能用低得多的方法快速得到次优解也值得。例2.1背包(knapsack)问题。问题:n个物体(物体i的重量为wi,价值为pi)背包载荷能力m求:把物体i的Xi部分(1in,0Xi1)装入背包中,使背包内所放物体的价值最
此文档下载收益归作者所有