790 likes | 1.05k Views
< ç®—æ³•è®¾è®¡ä¸Žåˆ†æž > 课程å¦ä¹ 方法. è¯¾å ‚ç²¾è®²ï¼Œè¯¾å¤–å¤šç»ƒï¼Œå‚考题解,精åšï¼ˆè§£é¢˜ï¼‰æŠ¥å‘Šï¼Œæé«˜ç¨‹åºè®¾è®¡èƒ½åŠ›ï¼Œæé«˜ç¨‹åºè°ƒè¯•能力,æé«˜ç®—法分æžå’Œä¼˜åŒ–能力 ; 基本作业: SICILY ä¸Šå®ŒæˆæŒ‡å®šé¢˜ç›®ï¼Œå®Œæˆå…¸åž‹é¢˜ç›®çš„解题报告. < ç®—æ³•è®¾è®¡ä¸Žåˆ†æž > 课程å¦ä¹ 方法. 3. 考试: ACM æ–¹å¼ , 网上自动测评 , 诚信是 IT 人立足之本 ! CS : (04 级 175 人 :10 题 2 人 , 9 题人 ,8:2,7:4,6:19,5:19,4:30,3:24,2:53, 1:8,0:11 ï¼›
E N D
<算法设计与分析>课程学习方法 • 课堂精讲,课外多练,参考题解,精做(解题)报告,提高程序设计能力,提高程序调试能力,提高算法分析和优化能力; • 基本作业: SICILY上完成指定题目,完成典型题目的解题报告
<算法设计与分析>课程学习方法 3.考试:ACM方式,网上自动测评,诚信是IT人立足之本! CS: (04级175人:10题2人, 9题人,8:2,7:4,6:19,5:19,4:30,3:24,2:53, 1:8,0:11; 05级99人:8题2人,7题3人,6题2人,5题2人,4 题8人,3题15人,2题35人,1题21人,0题11人; 06级105人:7题5人,6题3人,5题9人,4 题16人,3题33人,2题16人,1题14人,0题11人) SS:06、07级185人( 7题4人,6题3人,5题4人,4 题3人,3题21人,2题41人,1题52人,0题57人)
<算法设计与应用>课程学习方法 Cs07:178人 8题1人,7题5人,6题10人,5题24人,4 题53人,3题31人,2题28人,1题14人,0题12人; 3.作业扩展内容:中大OJ 、国内OJ,每周一赛题目; 4.主要OJ:http://202.116.77.69/sicily/ Poj : http:// acm.pku.edu.cn Zou : http://acm.zju.edu.cn
本课程学习方法 Usaco: http://ace.delos.com/usacogate Ural : http://acm.timus.ru Uva : http://acm.uva.es/p/ Ceoi : http://ceoi.inf.elte.hu/
本课程学习方法 5.解题报告格式: • 原题中文大意; • 算法思想及解题用到的主要数据结构; • 详细解题思路; • 逐步求精算法描述(含过程及变量说明); • 程序注释清单(重要过程的说明); • 测试数据(5-10组有梯度的测试数据,要考虑边界条件); • 对时间复杂度,空间复杂度方面的分析、估算及程序优化的分析和改进.
本课程学习方法 教材 [1] 刘汝佳、黄亮,《算法艺术与信息学竞赛》(第1版),北京:清华大学出版社,2004,ISBN 7-302-07800-9 [2] Thomas H.Cormen;Charles E.Leiserson;Ronald L.Rivest;Clifford Stein. Introduction to Algorithms, 2th Ed. The MIT Press, 2001, ISBN 978-0-262-33293-3影印版:《算法导论》(第二版),北京:高等教育出版社,2007,ISBN 978-7-040-11050-0中译版:潘金贵等译,《算法导论》(第2版),北京:机械工业出版社,2006,ISBN 7-111-18777-6
本课程学习方法 参考资料 • 《国际大学生程序设计竞赛辅导教程》 郭嵩山、崔昊、吴汉荣、陈明睿编著 北京大学出版社 2000.12 • 《国际大学生程序设计竞赛例题解(一)》数论、计算几何、搜索算法专集,郭嵩山、李志业、金涛、梁锋编著 电子工业出版社 2006.5
本课程学习方法 3.《国际大学生程序设计竞赛例题解(二)》广东省大学生程序设计竞赛试题(2003-2005), 郭嵩山、黎俊瑜、林祺颖著 电子工业出版社 2006.5 4. .《国际大学生程序设计竞赛例题解(三)》图论、动态规划算法、综合题专集, 郭嵩山、关沛勇、蔡文志、梁锋编著 电子工业出版社 2007.7
本课程学习方法 4. 《国际大学生程序设计竞赛例题解(四)》广东省信息学奥林匹克竞赛试题(2003-2006), 郭嵩山、张惠东、林祺颖、莫瑜著 电子工业出版社 2008.2 5.《国际大学生程序设计竞赛例题解(五)》广东省大学生程序设计竞赛试题(2006-2007), 郭嵩山、张子臻、王磊、汤振东著 电子工业出版社 2008.11
本课程学习方法 6. 《国际大学生程序设计竞赛例题解(六)》广东省大学生程序设计竞赛试题(2008-2009),郭嵩山、翁雨键、梁志荣、吴毅著 电子工业出版社 2010.5 7.《国际大学生程序设计竞赛例题解(七)》中山大学ICPC集训队内部选拔赛试题(2005-2006), 郭嵩山、刘祖立、刘曦、涂德健著 电子工业出版社 2010.7
本课程学习方法 大餐后的甜品(学完本课程后选读,面试须 读) • 8.由几个年轻的微软软件工程师著:编程之美—微软技术面试心得 电子工业出版社 2008 . 3
第一章 算法设计常用到的基本策略
程序的灵魂 • 数据结构+算法=程序 • 算法设计思想 • 算法分析:从时空、适用范围来分析,重点考虑时间效率和空间开销 • 复杂度分析 • 复杂度等级:多项式算法、指数级算法 • 五个重要的策略:
一 对应的策略 • 将问题对应成另一个易于思考的问题 • A问题->B问题 B有现成算法,从而求解
一 对应的策略 • 例1.1 哥尼斯堡七桥问题(一笔画问题,七桥四块陆地) • 从一块陆地出发,每次过一桥,且只能过一次,最后回到出发点,问是否存在这样的途径 • 哥尼斯堡七桥问题->欧拉回路 • 结论:从图上的一点出发又回到该点,连接该点的线(边)必须是偶数才能满足条件。 • 而七桥问题中,所有定点的度(连结边的条数)皆为奇数,故无解
一 对应的策略 • 例1.2 一种游戏,给出n(n为自然数),然后给出2n个自然数,例如n=4,2n=8个数是7 9 3 6 4 2 5 3,游戏双方为A,B(计算机)只允许从给出数列的两头取数,以取完数之和最大者为胜,A可以先取,如两者和相等仍算A胜
一 对应的策略 • 方案1 第一步 A取7 B取9 余3 6 4 2 5 3 第二步 A取右3 B取5 余3 6 4 2 第三步 A取2 B取4 余3 6 第四步 A取6 B取3 结果:A=7+3+2+6=18 A输 B=9+5+4+3=21
一 对应的策略 • 观察2n个数,奇偶为上述数之和有大小之分,取偶数位位置可获胜 ①②③④⑤⑥⑦⑧ 7 9 3 6 4 2 5 3 A取 3 9 2 6 A胜 B取7 5 4 3 取数问题对应成按奇偶对应规则取数可获问题解
一 对应的策略 • 方案2 第一步 A取7 B取9 余3 6 4 2 5 3 第二步 A取左3 B取6 余4 2 5 3 第三步 A取4 B取2 余5 3 第四步 A取5 B取3 结果:A=7+3+4+5=19 A输 B=9+6+2+3=20
二 大化小的策略(分治策略) • 规模大问题,求解较难,将规模大问题化为若干规模较小问题来求解,然后进行结果归并,这种即为分治策略。
二 大化小的策略(分治策略) • 例1.3 求一组数的最大值和最小值 • 设数的个数为n(规模参数),存在数组A[1]…A[n] • 算法: min:=A[1]; max:=A[1]; for i:=2 to n do begin if A[i]>max then max:=A[i]; if A[i]< min then min:=A[i]; end;
二 大化小的策略(分治策略) • 对于n>2的规模,采用一分为二缩小其规模,最后结果必分为规模n=1或n=2的情况,则最后用一次比较可求出max,min,再进行归纳,最大值中归并出最大值,最小值中归并出最小值 • n=1时,max=min=A[1]; • n=2时,if A[1]>=A[2] then min:=A[2];max:=A[1]; else max:=A[2];min:=A[1];
二 大化小的策略(分治策略) • 上例中i从2开始,每个数要比较两次方能决定到i的最大和最小值,采用分治方法,比较次数可减少 • 如n=4,只用比较4次 • 本例赋具体值 • N=9,A[1]…A[9]为(随意) • 22 13 -5 -8 15 60 17 31 47
二 大化小的策略(分治策略) • 分治算法:取中值(两分法)mid:=(i+j) div 2(i,j)为数组元素上下标的上下界 • 分治求最大最小值过程max,min有4个形参:数组起始下标,终点下表,max,min变量。 1,9,max,min 1,5,max,min 6,9,max,min 1,3,max,min 4,5,max,min 6,7,max,min 8,9,max,min 1,2,max,min 3,3,max,min
二 大化小的策略(分治策略) • 归并 • 不用分治法,n=9,比较2*(n-1)=16次 • 采用分治法:分治时用4次,归并时用2*4=8次,共4+2*4=12次 22,13 -5,-5 60,17 47,31 22,-5 15,-8 60,17 22,-8 60,-8
三 归纳的策略(递归的思想) • Hanoi 汉诺塔问题 • A柱盘子(上小下大)移到C,有B柱作中间转换,开始时B、C无盘子 • N=1,搬1次,A->1->C • N=2,搬3次,A->1->B,A->2->C,B->1->C • N=3,搬7次
三 归纳的策略 • 归纳: • N=1,A柱的一个盘->C • N>1: • A柱的(N-1)个盘->B • 剩下一个盘->C • B盘重复将(N-1)个盘->C • 即源柱(A),工作柱(B),目的柱(C)
三 归纳的策略 • 归纳算法 • If n=1,将1个盘搬到C,结束,否则2 • 递归 • A(源)(n-1)个盘->B,以C为工作柱 • 将A最后一个盘->C • 将B柱的(n-1)个盘->A,以A为工作柱
四、制定目标策略 • 建立目标策略 • 典型背包问题 • 例:假设一个能装20份容器的背包,去批发甲、乙、丙三种货物,如 • 买甲货,全部获利252元,占背包18份容量,买乙货,全部获利240元,占背包15份容量, 买丙货,全部获利150元,占背包10份容量。 试问各买多少获利最多。
四、制定目标策略 分析:采购三种货物性能价格比 甲:252/18=14,乙:240/15=16,丙150/10=15 方案2 最优,因为乙性能价格比最高
四、制定目标策略 • 将上例的量一般化 • 设n种货物,第i种货物编号为Bi,全部购获利Pi,但需占背包容量Wi (i=1,2,..,n),若背包总容量为M,求最大获利方案 • 数据结构 • 建立目标函数Pi / Wi(性能价格比),并对目标函数Pi/Wi排序,获Pi/Wi由小到大排序的顺序表,可获解
五、枚举的策略 • 当找不到更好的途径时,可根据部分条件(约束条件)将可能的情况列举,然后验证,枚举时尽可能将明显的不是解的情况排除,以尽可能减少枚举的可能的数目
作业:OJ:http://202.116.77.69/sicily/ • 1198 8!枚举 • 1029 递推 简单 • 1028 梵塔问题 -> 分治,归纳 -> 题目有意思但要留意其数据规模较大 • 1193 递推 较难 • 1021 简单题 -> 规模原来很大 -> 难 ->数据结构: 栈 • 1176 两人从两头取数
第二章 算法设计中常用到的数据结构(一) 算法设计用到的一些数据结构:数组、堆栈、队列
一 数组与下标 • 规律:当被处理对象之间符合线性表特征时使用顺序表,(数组)存储线性表元素时,对数据元素的加工处理算法,很大程度取决于数据元素的下标变化规律
一 数组与下标 • 例2.1 倒蛇阵填数,任给一个正整数n(n<=20),将1-n2分别填入矩阵,在显示器上输出如下格式的矩阵 • n=3 : n=4:
一 数组与下标 • 关键问题:线性表元素值与下标i,j之间的关系 • 算法设计:每圈四条边,顺序为右上->右下,右下->左下,左下->左上,左上->右上 • 第1圈四边 • A[1,n]->A[n,n],A[n,n-1]->A[n,1], • A[n-1,1]->A[1,1],A[1,2]->A[1,n-1] • 第i圈四边 • A[i,n+1-i]->A[n+1-i,n+1-i],A[n+1-i,n-i]->A[n+1-i,i], • A[n-i,i]->A[i,i],A[i,i+1]->A[i,n-i]
一 数组与下标 • i=1开始赋值 • 当i<n+1-i,构成圈 • 当i>n+1-i,结束 • i=n+1-i则A[i,i]=n2结束(最后填入的元素位) • 如n=4, • i=1,n+1-i=4,为第一圈 • i=2,n+1-i=3,为第二圈 • i=3,n+1-i=2,A[2,2]=n2=16结束
一 数组与下标 • 算法描述 R:=1; i:=1; While i<(n+1-i) do begin for j:=I to n+1-i do begin a[j,n+1-i]:=R; R:=R+1; end;
一 数组与下标 for j:=n-i downto i do begin a[n+1-i,j]:=R; R:=R+1; end; for j:=n-i downto i do begin a[j,i]:=R; R:=R+1; end;
一 数组与下标 for j:=i+1 to n-i do begin a[i,j]:=R; R:=R+1; end; i:=i+1; end; {end of while} If (i=n+1-i) then a[j,i]:=k;
二、栈与回溯 • 栈:线性表(加了后进先出的限制) • 穷举时用栈回溯过程,如穷举时无法找到所需,则退回继续穷举 • 使用栈能使穷举过程能回溯到所要位置继续在所在层次上往下穷举所有可能的解(穷举也常被称为搜索,遍历)。
二、栈与回溯 • 例2.2 求从A到B可能的道路 1.1 1.2.1 1.2.2 1.2 1 A 2 2.1 2.1.1 B 回溯 1.2.1 回溯 2.2 1.1 1.2 1.2 3 1 1 1 1 1 1.2.2 回溯 2.1.1 B 1.2 1.2 1.2 2.1 2.1 1 1 1 1 2 2 2
二、栈与回溯 • 例2.3 N皇后问题N*N棋盘上,N个皇后不能在同行,同列及同一个对角线上。 • N=4 * * * * * 1 2 1 1 1 * * * * * * 1 2 * * 3 3 3 1 1 1
二、栈与回溯 * * * * * * * * 3 4 * * 3 3 3 4 1 1 1 1 * * * * 1 2 * * * * 1 2 2 2 * * * * 4 4 4 4 * * 1 1 1 1 * * * * 3 4 * * * * 2 2 3 4 * * * * 4 4 4 4 * * 1 1 1 1
二、栈与回溯 • 继续穷举3 1 4 2输出 • 再穷举最后1列,也失败,所以只有两个解 • 设用数组x[1]-x[n]来表示栈,如n=8,则右图 * * * * 1 * * * 1 1 * * 4 4 4 * 2 2 2 2 x[8]=5 栈顶 x[7]=3 * * 2 3 * * 1 1 x[6]=1 * * 4 4 * * x[5]=7 2 2 x[4]=2 x[3]=8 x[2]=6 x[1]=4
二、栈与回溯 • 第k个皇后的安置(x[k]的值),需x[k]与x[i](i=1,2,..,k-1)的人一个都不在同一列,同一对角线上,这一判定工作可模块化为一个布尔型函数,其值为TRUE表示可安置。
二、栈与回溯 • Function PLACE(k:1..n):boolean; • {参数为行号} • Begin • i:=1; • While (n<k) do begin • if (x[i]=x[k]) {第k个皇后与第i个皇后同一列} • or (abs(x[i]-x[k])=abs(i-k)) { 在同一个对角线上} • then begin PLACE:=false; exit;end;
二、栈与回溯 • i:=i+1; • end; • PLACE:=true; • end; • 因为以行号为下标,同一行两个皇后情况已被排除
二、栈与回溯 • 求解n皇后安置方案算法: L:=1; {解编号} X[1]:=0; {每次穷举取下一列进行} k:=1; {从第1行开始} While (k>0) do begin {行号>0 回溯} x[k]:=x[k]+1; {穷举第k行皇后位置} while (x[k]<=n) and (not PLACE(k)) do x[k]:=x[k+1]; {穷举皇后位置} if (x[k]<=n) then if (k=n then begin for j:=0 to n do write(x[j],’ ‘); {输出所有位置} writeln(‘Result No.=‘,L); {输出组号}