数据结构与算法实习课件.ppt

上传人:本田雅阁 文档编号:3185608 上传时间:2019-07-22 格式:PPT 页数:76 大小:2.32MB
返回 下载 相关 举报
数据结构与算法实习课件.ppt_第1页
第1页 / 共76页
数据结构与算法实习课件.ppt_第2页
第2页 / 共76页
数据结构与算法实习课件.ppt_第3页
第3页 / 共76页
数据结构与算法实习课件.ppt_第4页
第4页 / 共76页
数据结构与算法实习课件.ppt_第5页
第5页 / 共76页
点击查看更多>>
资源描述

《数据结构与算法实习课件.ppt》由会员分享,可在线阅读,更多相关《数据结构与算法实习课件.ppt(76页珍藏版)》请在三一文库上搜索。

1、数据结构与算法实习,北京大学信息科学技术学院 张 铭 http:/ http:/ 2008.4.20,课程目的,配合“数据结构与算法”主课,提高实际动手能力和程序设计的质量 基本数据结构 线性表(向量、串、栈和队列)、二叉树、树、图等 ADT、STL 综合应用程序 排序、检索、文件、索引等技术 程序设计实践和技巧,课程内容,C+编程技术补充 标准模板库 STL的基本概念 C+流处理 程序设计实践和技巧 风格、设计和实现 界面、排错 测试、性能和可扩展性,基本算法 枚举法、贪心法 递归、回溯、搜索与分支限界 分治法、动态规划 高级数据结构 线性:多维矩阵、稀疏矩阵、广义表、存储管理 树型:字符树

2、、 BestBST、AVL树、伸展树 问题建模 数学建模、软件模型,成绩评定办法,平时:20% 考勤、开卷随堂测试、课堂表现 ACM作业:20% 北大ACM结果、源程序、实习报告 综合上机题:40% 源程序、实习报告 期末考试 20% 有附加题,作业要求,实习课4道大综合实习,6道ACM “诚实代码” 要调试 要提交上机报告,实习课程资源,数据结构实习(计算机和智能专业强化) http:/ http:/ 算法与程序设计自评自测系统 http:/ 2000多道由浅入深设计数据结构与算法程序设计各个知识点的竞赛试题,理论课资源,数据结构与算法(信息学院) http:/ http:/ (公网) 课程

3、答疑 http:/ 注册:1-学号xxx,教材,1. 张铭、赵海燕、王腾蛟、宋国杰,数据结构与算法实验教程,高等教育出版社,2009年 6月。国家级“十一五”规划教材 2. 张铭、王腾蛟、赵海燕,数据结构与算法学习指导与习题解析,高等教育出版社,2008年 6月。 国家级“十一五”规划教材 书号: ISBN 978-70-4-023961 3. 张铭、赵海燕、王腾蛟,数据结构与算法学习指导与习题解析,高等教育出版社,2005年 9月。 国家级“十五”配套教材 书号: ISBN 7-04-017829-X 4. 许卓群、杨冬青、唐世渭、张铭,数据结构与算法,高等教育出版社,2004年7月。 国家

4、级“十五”规划教材,参考教材,1. Brian W.Kernigham 著,裘宗燕 译,程序设计实践,机械工业出版社,2003年9月。 2. M. H. Alsuwaiyel, Algorithms Design Techniques and Analysis, 电子工业出版社影印,2003年1月。 3. Thomas H.Cormen, Charles E.Leiserson, Ronald L. Rivest, Clifford Stein, Inroduction to Algorithms, MTI Press. 高等教育出版社影印。 4. Sartaj Sahni, Data Str

5、uctures, Algorithms, and Applications in C+. 机械工业出版社影印版。 5. 数据结构(用面向对象方法与C+语言描述)第2版,殷人昆主编, 清华大学出版社,2007年6月. 清华大学信息学院计算机系、软件学院教材 清华考研第一参考书。 http:/ 程序的境界 界面、排错 测试、性能和可扩展性,风格、设计和实现,风格 文件结构、版式、命名、注释 程序员的素质 程序的境界,设计和实现,问题求解 数学建模、问题建模 数据结构抽象 算法抽象 效率分析 选择能在合理时间内解决预期规模问题的简单算法和数据结构 在一些互相冲突的需求和约束条件之间寻找平衡 反复试验

6、,推倒重来,直至,界面(interface)与排错,用户界面、程序接口 字符界面:菜单型,命令行型 简单、清晰、规范、统一 鲁棒性 排错 注意程序风格(避免全局变量、不用goto) 排错的时间至少跟写程序一样长 不要去怀疑编译器和库函数 读程序,而不是马上去改程序 不要过于依赖debug工具,测试、性能和可扩展性,测试(Testing):用系统的方法来发现程序中可能存在的隐藏的bug 黑盒测试 白盒测试 性能优化 编译、代码、算法优化 可扩展性 软件复用 紧盯标准 平台无关,在总体设计上要注意代码风格、可复用性和可扩展性 在关键段要牺牲上面的内容来追求性能 性能和可扩展性是相互矛盾的,STL中

7、的容器,顺序容器 Sequence Containers 关联容器 Associative Containers,容器 Containers,vector,deque,list,set, multiset map, multimap,STL中的容器,容器适配器,stack,queue,priority_queue,基本算法,问题的状态空间 穷举法 回溯、搜索 贪心法 递归分治 动态规划,八皇后问题,在88格的国际象棋棋盘上摆放8个皇后,使其不能互相攻击 任意两个皇后都不处于同一行、同一列或同一斜线上 问有多少种摆法?,八皇后问题的一个解,穷举法(枚举法),4个皇后各占一行,穷举每一行上可能占有

8、的列 共有44 256种情况 枚举时,可以排除直观不符合条件的情况,减小候选集 有4! 24种情况 最后输出合理的解,穷举法的代价,穷举问题域的所有解,找到所有最佳解 减少穷举次数 穷举的变量 注意穷举的顺序 减少判断每种情况的时间 时间代价最高 问题规模n,搜索空间,总搜索时间是: T= | t,O(n!) = O(nn),O(2n) 指数级时间代价,状态空间,四皇后的解空间树,解空间树,根(root):问题的起点 问题状态(problem states):树中结点 状态空间(state space):由根结点到其它结点的所有路径 解状态(solution states)S:由根到S的路径确

9、定了解空间中的一个元组 答案状态(answer states)S:由根到S的路径确定了这问题的一个解(即,它满足隐式约束条件),回溯法图示,“可行则进,不行则换、换不成则退”。 简化为4皇后问题。搜索过程如下:,四后问题求解,回溯算法,可行则进,不行则换 换不成则退,八皇后问题的表示,棋盘行列、皇后依次编上0, 1,,7号 A0n-10n-1 表示nn棋盘上的格 行号从上至下、列号从左到右依次编号为0, 1,,n-1 八后问题的全部解向量为(x0, x1,,x7)。 xi表示皇后i所处的列数 对任何0i, j8,及ij,有xixj 状态空间缩小为在8! 没有两个皇后在同一斜线上(斜率为1 )

10、重点!,斜率+1,i+j=0, 1, , 14,0 1 2 3 4 5 6 7,0 1 2 3 4 5 6 7,斜率-1,i-j=-7, 6, , 7,0 1 2 3 4 5 6 7,0 1 2 3 4 5 6 7,皇后的控制范围,第i个皇后时,前面几个皇后在各列、各对角线上的占用情况 bool An; / 前0i-1行皇后占用列 bool B2*n-1; / 斜率为+1的对角线 bool C2*n-1; / 斜率为-1, Ci-j+7,试探安排八个皇后,从第0行开始,逐步安排每行皇后。 对第i个皇后,找正确的位置(设为第j列 Aj、Bi+j、Ci-j+7都没有被占用 标记Aj、Bi+j、Ci

11、-j+7为被占用状态 继续安排下一个皇后(第i+1个) 否则,如果找不到合适位置,应该退回(即“回溯”)到第i-1行的皇后,重新安排 前面的安排不太合理,回溯过程,如果8个皇后都排好了,则打印这种方案 为了找到其它方案,应该回溯,重新试探皇后的下一种安排方法 抹掉前面试探留下的标记,即恢复Aj、Bi+j、Ci-j+7为未被占用状态 这种回溯过程将逐步返回 使得各行的皇后都能试探到各种可能的摆法,回溯法的框架,问题的解n元组(x0, x1,,xn-1): void rectry(k) / 初始调rectry(0); 置Xk为第一个可能值; while (Xk可能值没有试完) 设置Xk所涉及的标记

12、; if (X0, X1,Xn-1)是解) 打印一组解; else rectry(k+1); 回溯,抹去Xk涉及的标记; 取下一个可能的Xk值; ,八皇后的递归算法,void queen(int i) int j; for (j=0; jn; j+) if (place(i,j) / 能放置吗 Xi = j; mark(i,j); / 标记(i,j)的影响 if (i n-1) queen(i+1); / 接着试下一个 else print(count); / 打印一个解 erase(i,j); / 回溯,去掉刚才标记 ,四皇后时,函数执行模拟,失败情况下回溯过程模拟: queen(0) 试探

13、x0=0, mark(0,0) queen(1) / for (j=0; jn;j+) 试探x1=2, mark(1,2) queen(2) / 摆不了,函数返回 erase(1,2) / 回溯 试探x1=3, mark(1,3) ,皇后函数执行模拟(续),四皇后成功情况下,回溯,继续求解: X = 1, 3, 0, 2为第一个解,求其他解 erase(3, 2) 试探下一个j=3, 当然不能摆 erase(2, 0), 试探其他,都失/queen(2) erase(1, 3), 试探其他,都失败/queen(1) erase(0, 1) / queen(0) x0 = 2, mark(0,2

14、) queen(1) x1=0, mark(1, 0) .得到第二个解X=2, 0, 3, 1,八皇后算法讨论,如果只要求出一个解,这个程序要作修改 求一个解的程序比求所有解反而要多一些判断。,回溯算法,巡回售货员问题,1,2,3,4,9,5,4,2,7,13,29,23,28,28,28,29,有一个售货员,从他所在的城市出发去访问n-1个城市,要求经过每个城市恰好一次,然后返回原地问他的路线怎样安排才最经济(即线路最短)?,贪心法,问题的状态空间很大时,穷举法计算量可能会太大 当人们面对一个问题时,可能会采取目前看来最接近解状态的选择方案 贪心法可以看作回溯的特例,贪心法的过程,在搜索解的

15、过程中,从根结点开始,设当前结点为A,A的所有子结点中权值最大的为B,则选择B作为下一个结点 可以贪心解的问题需要满足的性质 贪心选择性质 最优子结构性质 时间代价多为线性,部分装入背包问题,一个旅行者准备随身携带一个背包。可以放入背包的物品有n个,每个物品的重量和价值分别为wj,vj,j=1,2,n,旅行者可以选择物品i的全部,也可以选择i的xi部分,0xi1。如果背包的重量限制是c,怎么选择放入背包的物品以使得背包的价值最大?,背包问题的形式定义,输入:c0, wi0, vi0, i=1, n 输出: 目标函数 约束条件,贪心法求解背包问题,按照单位重量的价值从高到低对物品排序 尽量装入

16、“价值/重量”比最高的物品 直到不能装入一个整物品为止 最后根据背包重量极限装入部分物品,最小生成树,1,2,3,4,5,6,6,5,5,5,1,6,4,3,6,2,对图G=(V, E) 的每一条边 赋以相应的实数权 ,得到一个网络,记为N=(V, E, W) 设T=(V, E)是N的一个生成树(包括原图所有顶点的连通树),树T的权为 N中权最小的生成树称为N的最小生成树。,贪心法,最小生成树Prim算法,贪心法,最小生成树Prim算法,1,2,3,4,5,6,3,1,6,4,4,2,2,5,5,3,贪心法,最小生成树Kruscal算法,贪心法,最小生成树Kruskal算法,1,2,3,4,5

17、,6,1,2,3,4,5,贪心法一般原则,贪心法得到的可能是最优解 最小生成树 Huffman树 部分背包问题 贪心法是否求得最优解需要数学证明 问题规模太大,最优解代价太高时,用贪心法求近似解 地图着色 巡回售货员问题,递归分治算法,分治策略的实例归并排序,2,5,1,3,9,8,7,4,2,5,1,3,9,8,7,4,2,5,1,3,9,8,7,4,2,5,1,3,9,8,7,4,二分搜索、BST查找和插入 STL里面的quick_sort快速排序,治,合,分,动态规划法问题,某一类递归问题,如果直接用递归实现,可能会导致极低的效率 往往是(2n) 上一级问题可以利用那些更小子问题的结果,

18、例如 Fibonacci问题 组合数问题 Hanoi问题不是动态规划问题,递归的效率,C(m,n) 两个子问题C(m-1,n) 和 C(m-1,n-1),递归,递归调用树,C(5,3),C(4,2),C(2,2) = 1,C(2,1),C(3,2),C(4,3),C(3,3) =1,C(3,1),C(2,2) = 1,C(2,1),C(3,2),C(1,0) = 1,C(1,1) = 1,C(1,0) = 1,C(1,1) = 1,C(2,1),C(2,0) =1,C(1,1) = 1,C(1,0) = 1,递归法,int comb(int m, int n) if (m=n) | (n=0)

19、 return 1; /处理边界,递归出口 else return comb(m-1,n)+comb(m-1,n-1); 时间代价O(2m-2n),递推法,int cmn; / 假设初值为0矩阵 int comb(int m, int n) int i,j; if (m=n) | (n=0) cmn = 1; /递归出口 else for (i=1; i=m; i+) / 递推计算 for (j=0; j=i,j=n; j+) if (i=j) | (j=0) cij = 1; else ij = ci-1j + ci-1j-1; 时间代价O(mn),动态规划的基本概念,阶段 状态 决策,A,

20、B1,B2,C1,C2,C3,C4,D1,D2,D3,E,5,3,1,6,3,8,4,5,5,6,8,3,3,4,3,图中的每个顶点代表一个城市,两个城市间的连线代表道路,连线上的数值代表道路的长度。从城市A到达城市E,怎样走路程最短,最短路程的长度是多少?,动态规划的条件,最优化原理 无后效性 最优子结构,一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。 实际上就是把原问题转换成规模更小的子问题时,原问题最优当且仅当子问题最优。,动态规划的条件,无后效性 过去的步骤只能通过当前状态影响未来的发展,当前的状态是历史的总结。,动态

21、规划的条件,1,2,3,4,5,6,7,8,9,最优化原理 最优子结构 无后效性,从1-3-5-8-9是1到9的最短路,则1-3-5-8是1到8的最短路,1-3-5是1到5的最短路,当前状态为7的时候,到7的最短路与以前所经过的结点无关,如到7经过的点为1,2,5,7或1,3,5,7或1,3,6,7都对以后的求解无关。,动态规划法的思想,自底向上构造 在原问题的小子集中计算 每一步列出局部最优解 用一张表保留这些局部最优解 用空间换时间 避免重复计算 子集越来越大 最终在问题的全集上计算,所得出的就是整体最优解,多叉路口交通灯管理问题,五叉路口 右行规则 道路C、E是箭头所示的单行道 把可以同

22、时行驶而不发生碰撞的路线用一种颜色的交通灯指示 用多少种颜色的交通灯,怎样分配给这些行驶路线? 颜色越少则管理效率越高 不考虑过渡灯(例如黄灯),13种行驶路线,AB,AC,AD BA,BC,BD DA,DB,DC EA,EB,EC ED 不能同时 如AB、BC;EB、AD 可以同时 如AB、EC,不能同时走的路线对,(AB BC) (AB BD) (AB DA) (AB EA) (AC DA) (AC BD) (AC DB) (AC EA) (AC EB) (AD EA) (AD EB) (AD EC) (BC EB) (BC DB) (BD DA) (BD EB) (BD EC) (DA

23、EB) (DA EC) (DB EC),多叉路口交通灯管理问题,13种行驶路线 AB,AC,AD BA,BC,BD DA,DB,DC EA,EB,EC ED 不能同时 如AB、BC,有连线则不能同时通行,地图着色,对一张地图用若干种颜色着色 要求相邻的区域用不同的颜色,地图着色问题,最少着色分组的最优解问题是NP复杂性问题 穷举法或回溯法来解决地图着色问题。对于小型地图可以使用 对于大型模式,由于时间的指数上升,不可接受 指数级或NP问题往往通过一些逼近方法来求近似最优解,地图着色:贪心法,1. 用一种颜色给尽可能多的顶点着色 (1) 选择某未着色的顶点并用该新颜色上色 (2) 扫描未着色的其

24、他各顶点,考察它们是否有边与该颜色着色的顶点相连,若没有边相连就用该颜色上色。 2. 换一种颜色重复1,直到所有顶点全部着色为止,贪心法近似解,按1,2,3,4,5顺序着色,贪心哪!,1,5,2,4,1,2 3,4 5,3,最优解,1,5,2,4,3,1, 3, 4 2,5,算法总结,数学模型、状态空间 问题抽象 数据抽象 算法抽象 穷举法万能,低效 避免穷举测试,避免穷举测试,回溯、搜索跳过无解分支 最优化问题的通法 递归分治自顶向下,问题化解 子结构不重复 分、治、合 动态规划自底向上,利用中间结果,迅速构造 最优子结构、重复子结构、无后效性 搜索中分支定界的特例 空间换时间 贪心法动态规划的特例 最优子结构最优解 否则,只是快速得到较优解,总 结,问题求解 理论、抽象和设计的三个层次 根据实际问题取舍数据结构和算法 在时间和空间复杂度之间进行平衡 软件开发、工程的规范性 实践、自主学习、研究创新能力,谢谢大家!,北京大学信息科学技术学院 张 铭 http:/ http:/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1