算法设计与分析(第2版) 郑宗汉 第1章-1
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
输入: 输出: 第一步: 第二步: … … 第三步: 第四步: 正整数m和n m和n的最大公约数 求余数r m%n if r == 0? yes 终止(n为答案) no 执行第三步。 m n, n r, 返回第一步。
欧几里德算法
13
wk.baidu.com
确定性: 可行性: 有限性: 算法的每一个步骤,都有精确 输入: 算法中所有待实现的运算,都 输出: 特性: 的定义。要执行的每一个动作 算法在执行有限步之后必须终 是基本的运算。原则上可以由 一个算法有 0个或多个输入,它 一个算法有一个或多个输出, 都是清晰的、无歧义的。 止。 人们用纸和笔,在有限的时间 注意: 是由外部提供的,作为算法开 (1)输入 这些输出与输入有特定的关系, 里精确地完成。 有限性的限制是不够的。 例如,在算法的第 3行中,如果 算法(欧几里德算法)中,对 始执行前的初始值,或初始状 实际上是输入的某种函数。不 一个实用的算法,不仅要求步骤 m 、 n 是无理数,那么, m 除以 n 输入的任意正整数 m、n,将 m除 态。 (2)输出 算法中整除、判断、赋值等等 同取值的输入,产生不同结果 有限,同时要求运行这些步骤所 的余数就没有一个明确的界定。 以 n的余数赋予r之后,再通过r 运算都是可行的。因为整数可 算法的输入是从特定的对象集 的输出。 (3)有限性 花费的时间是人们可以接受的。 确定性的准则意味着必须确保 赋予 n ,从而使 n 值变小。如此 以用有限的方式表示。 合中抽取的。算法中有两个输 算法中的输出是输入 m 、 的最 在执行第 3行时, m和n 的值都是 往复进行,最终或者使 rn 为 0, 入 m、n ,就是从正整数集合中 ( 4 )确定性 如果所涉及的数值必须由展开 大公约数。 正整数。 或者使 n 递减为 1 。这两种情况, 抽取的。 成无穷小数的实数来精确地完 (r=0 5)可行性 都最终使 ,而使算法终止。 算法规定了 m 、 n 都是正整数, 成,则这些运算就不是可行的 从而保证了后续各个步骤中都 了。 能确定地执行。
出版社, 第2版,2011年7月 参考书:算法导论(原书第3版) ,Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, lifford Stein, 殷建 平等译, 机械工业出版社, 第1版,2013年7月
5
References
1. 2. 3. 4. 5. 6. 7. 8. Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to Algorithms, The MIT Press, 第二版, 2002. 卢开澄. 计算机算法导引(第二版)。清华大学出版社,2006. 王晓东. 计算机算法设计与分析,电子工业出版社,2001。 D. E. Knuth等. Art of the Computer Programming, Vol. 3, Addison-Wesley, 1973. A. V. Aho, J. D. Ullman等. The Design and Analysis of Computer Algorithms. Addison-Wesley, 1974. A. V. Aho, J. D. Ullman等. Data Structures and Algorithms. Addison-Wesley, 1983.4. S. Baase. Computer Algorithms: Introduction to Design and Analysis. Addison-Wesley, second edition, 1988. E. Horowitz and Sartaj Sahni. Fundamentals of Computer Algorithms. Computer Science Press, 1978
(1,3)=1
(1,2)=5
1
19
1.1.2 算法的设计和复杂性分析
货郎担问题的穷举法算法
输入:城市个数n,费用(距离)矩阵c[][] 输出:旅行路线t,最小费用min
1. void salesman_problem(int n, float &min, int t[], float c[][]) 2. { 3. int p[n], i = 1; 4. float cost; n! 5. min = MAX_FLOAT_NUM; 6. while (i <= n!) { 7. 产生n个城市的第i个排列于p; 8. cost = 路线p的费用; 9. if (cost < min) { 10. 把数组p的内容复制到数组t; 11. min = cost; 12. } 13. i++; 14. } 15. }
20
1.1.2 算法的设计和复杂性分析
货郎担问题的执行时间和问题规模的关系
(假定循环体每执行一次,需要1µs时间)
21
1.1.2 算法的设计和复杂性分析
思考
从百鸡问题的穷举法改进,可以得到什么启示?
从货郎担问题的穷举算法时间消耗和问题规模的关系, 可以得到什么启示? 什么是一个有效的算法?如何判断某个算法更加有效?
18
1.1.2 算法的设计和复杂性分析
例2 货郎担问题:
售货员到若干个城市去售货,每个城市仅经过一次,最 后回到出发点。已知各个城市之间的距离,求一个总路 程最短的路线。
出发城市 0
(0,3)=4 (0,2)=3
3
(0,1)=2
(2,3)=4
2
最短路径的哈密尔顿回路问 题,数据结构是无向加权图 G = <V, E>,V是顶点集合, E是距离集合。
7
Conferences
1. 2. 3. 4. 5. Annual ACM Symposium on Theory of Computing Annual IEEE Symposium on Foundations of Computer Science ACM Annual Computer Science Conference Annual Symposium on Computational Geometry ACM Symposium on Parallel Algorithms and Architectures
1.1 引言
1.1.1 算法的定义和特性
1.1.2 算法的设计和复杂性分析
14
1.1.2 算法的设计和复杂性分析
过程
理 解 问 题
算 法 表 示
算 法 分 析
算 法 实 现
15
1.1.2 算法的设计和复杂性分析
例1 百鸡问题:
公鸡每只5元、母鸡每只3元、小鸡3只1元,用100元钱 买100只鸡,求公鸡、母鸡、小鸡的只数。 令a为公鸡数, 为b母鸡数,c 为小鸡数,则: (1.1.1) a b c 100 5a 3b c / 3 100 (1.1.2)
6
Journals
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. IEEE Transactions on Electronic Computers IEEE Transactions on Software Engineering IEEE Transactions on Data and Knowledge Engineering Acta Informatica SIAM Journal on Computing Journal of Computer and System Sciences Communication of the ACM Journal of the ACM BIT Information and Control ACM Computing Surveys Mathematics of Computation Information Processing Letters Theoretical Computer Science
8
学习要求
深刻理解每一类算法的思想及其实现
能熟练运用所学知识解决实际问题
培养提高计算思维能力
9
考核方式
Homework and Reading: 20%
Final Exam (Written Test): 80%
10
第1章 算法的基本概念
1.1 引言
1.1.1 算法的定义和特性
算法设计与分析
什么是算法?
算法组成
(1)问题
(2)规则
(3)结果
算法是解某一问题的一组有穷规则的集合。 算法是把输入转换成输出的一个计算序列。
2
课程概述
计算机系统中的任何软件,都是按一个个特定的算法 来予以实现的。算法性能的好坏,直接决定了所实现 软件性能的优劣。 如何判定一个算法的性能、用什么方法来设计算法、 所设计的算法需要多少运行时间、多少存储空间,在 实现一个软件时,这些都是必须要予以解决的。 因此,算法设计与分析是计算机科学与技术的一个核 心问题,也是大学计算机专业本科生及研究生的一门 重要的专业基础课程。
3
课程内容
第一部分(1-2章):基本概念和常用数学工具(6学时)
第二部分(3-11章):基本理论和技术,包括排序、递归、 分治、贪婪法、动态规划、回溯法、分支与限界、 随 机算法、图和网络问题 (30学时) 第三部分:复习考试(4学时)
4
教材与参考书
教材:郑宗汉、 郑晓明:算法设计与分析,清华大学
1.1.2 算法的设计和复杂性分析
11
1.1.1 算法的定义和特性
定义:算法是把输入转换成输出的一个计算序列。
特性:
(1)输入
(2)输出
(3)有限性 (4)确定性 (5)可行性
12
1.1.1 算法的定义和特性
最大公约数问题:求两个正整数m和n的最大公约数
设计:
17
1.1.2 算法的设计和复杂性分析
百鸡问题的穷举法改进
输入:所购买的3种鸡的总数目n 输出:满足问题的解的数目k,公鸡,母鸡,小鸡的只数g[],m[],s[]
1. void chicken_question_2(int n, int &k, int g[], int m[], int s[]) 2. { 3. int a,b,c; 4. k = 0; 5. i = n / 5; 6. j = n / 3; 7. for (a = 0; a <= i; a++) 8. for ( b = 0; b <= j; b++) { 9. c = n – a - b; // 原来为 for (c = 0; c <= n; c++) 10. if ((a + b + c == n) && (5 * a + 3 * b + c / 3 == n) && (c%3 == 0)) { 11. g[k] = a; 12. m[k] = b; 13. s[k] = c; 14. k++; 15. } 16. }
c %3 0
(1.1.3)
16
1.1.2 算法的设计和复杂性分析
百鸡问题的穷举法
输入:所购买的3种鸡的总数目n 输出:满足问题的解的数目k,公鸡,母鸡,小鸡的只数g[],m[],s[]
1. void chicken_question(int n, int &k, int g[], int m[], int s[]) 2. { 3. int a,b,c; 分析发现:只能买到n/5 4. k = 0; 只公鸡,n/3只母鸡,将 5. for (a = 0; a <= n; a++) { 算法进行改进。 6. for ( b = 0; b <= n; b++) { 7. for (c = 0; c <= n; c++) { 8. if ((a + b + c == n) && (5 * a + 3 * b + c / 3 == n) && (c%3 == 0)) { 9. g[k] = a; 10. m[k] = b; 11. s[k] = c; 12. k++; 13. } 14. } 15. } 16. } 17. }
欧几里德算法
13
wk.baidu.com
确定性: 可行性: 有限性: 算法的每一个步骤,都有精确 输入: 算法中所有待实现的运算,都 输出: 特性: 的定义。要执行的每一个动作 算法在执行有限步之后必须终 是基本的运算。原则上可以由 一个算法有 0个或多个输入,它 一个算法有一个或多个输出, 都是清晰的、无歧义的。 止。 人们用纸和笔,在有限的时间 注意: 是由外部提供的,作为算法开 (1)输入 这些输出与输入有特定的关系, 里精确地完成。 有限性的限制是不够的。 例如,在算法的第 3行中,如果 算法(欧几里德算法)中,对 始执行前的初始值,或初始状 实际上是输入的某种函数。不 一个实用的算法,不仅要求步骤 m 、 n 是无理数,那么, m 除以 n 输入的任意正整数 m、n,将 m除 态。 (2)输出 算法中整除、判断、赋值等等 同取值的输入,产生不同结果 有限,同时要求运行这些步骤所 的余数就没有一个明确的界定。 以 n的余数赋予r之后,再通过r 运算都是可行的。因为整数可 算法的输入是从特定的对象集 的输出。 (3)有限性 花费的时间是人们可以接受的。 确定性的准则意味着必须确保 赋予 n ,从而使 n 值变小。如此 以用有限的方式表示。 合中抽取的。算法中有两个输 算法中的输出是输入 m 、 的最 在执行第 3行时, m和n 的值都是 往复进行,最终或者使 rn 为 0, 入 m、n ,就是从正整数集合中 ( 4 )确定性 如果所涉及的数值必须由展开 大公约数。 正整数。 或者使 n 递减为 1 。这两种情况, 抽取的。 成无穷小数的实数来精确地完 (r=0 5)可行性 都最终使 ,而使算法终止。 算法规定了 m 、 n 都是正整数, 成,则这些运算就不是可行的 从而保证了后续各个步骤中都 了。 能确定地执行。
出版社, 第2版,2011年7月 参考书:算法导论(原书第3版) ,Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, lifford Stein, 殷建 平等译, 机械工业出版社, 第1版,2013年7月
5
References
1. 2. 3. 4. 5. 6. 7. 8. Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to Algorithms, The MIT Press, 第二版, 2002. 卢开澄. 计算机算法导引(第二版)。清华大学出版社,2006. 王晓东. 计算机算法设计与分析,电子工业出版社,2001。 D. E. Knuth等. Art of the Computer Programming, Vol. 3, Addison-Wesley, 1973. A. V. Aho, J. D. Ullman等. The Design and Analysis of Computer Algorithms. Addison-Wesley, 1974. A. V. Aho, J. D. Ullman等. Data Structures and Algorithms. Addison-Wesley, 1983.4. S. Baase. Computer Algorithms: Introduction to Design and Analysis. Addison-Wesley, second edition, 1988. E. Horowitz and Sartaj Sahni. Fundamentals of Computer Algorithms. Computer Science Press, 1978
(1,3)=1
(1,2)=5
1
19
1.1.2 算法的设计和复杂性分析
货郎担问题的穷举法算法
输入:城市个数n,费用(距离)矩阵c[][] 输出:旅行路线t,最小费用min
1. void salesman_problem(int n, float &min, int t[], float c[][]) 2. { 3. int p[n], i = 1; 4. float cost; n! 5. min = MAX_FLOAT_NUM; 6. while (i <= n!) { 7. 产生n个城市的第i个排列于p; 8. cost = 路线p的费用; 9. if (cost < min) { 10. 把数组p的内容复制到数组t; 11. min = cost; 12. } 13. i++; 14. } 15. }
20
1.1.2 算法的设计和复杂性分析
货郎担问题的执行时间和问题规模的关系
(假定循环体每执行一次,需要1µs时间)
21
1.1.2 算法的设计和复杂性分析
思考
从百鸡问题的穷举法改进,可以得到什么启示?
从货郎担问题的穷举算法时间消耗和问题规模的关系, 可以得到什么启示? 什么是一个有效的算法?如何判断某个算法更加有效?
18
1.1.2 算法的设计和复杂性分析
例2 货郎担问题:
售货员到若干个城市去售货,每个城市仅经过一次,最 后回到出发点。已知各个城市之间的距离,求一个总路 程最短的路线。
出发城市 0
(0,3)=4 (0,2)=3
3
(0,1)=2
(2,3)=4
2
最短路径的哈密尔顿回路问 题,数据结构是无向加权图 G = <V, E>,V是顶点集合, E是距离集合。
7
Conferences
1. 2. 3. 4. 5. Annual ACM Symposium on Theory of Computing Annual IEEE Symposium on Foundations of Computer Science ACM Annual Computer Science Conference Annual Symposium on Computational Geometry ACM Symposium on Parallel Algorithms and Architectures
1.1 引言
1.1.1 算法的定义和特性
1.1.2 算法的设计和复杂性分析
14
1.1.2 算法的设计和复杂性分析
过程
理 解 问 题
算 法 表 示
算 法 分 析
算 法 实 现
15
1.1.2 算法的设计和复杂性分析
例1 百鸡问题:
公鸡每只5元、母鸡每只3元、小鸡3只1元,用100元钱 买100只鸡,求公鸡、母鸡、小鸡的只数。 令a为公鸡数, 为b母鸡数,c 为小鸡数,则: (1.1.1) a b c 100 5a 3b c / 3 100 (1.1.2)
6
Journals
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. IEEE Transactions on Electronic Computers IEEE Transactions on Software Engineering IEEE Transactions on Data and Knowledge Engineering Acta Informatica SIAM Journal on Computing Journal of Computer and System Sciences Communication of the ACM Journal of the ACM BIT Information and Control ACM Computing Surveys Mathematics of Computation Information Processing Letters Theoretical Computer Science
8
学习要求
深刻理解每一类算法的思想及其实现
能熟练运用所学知识解决实际问题
培养提高计算思维能力
9
考核方式
Homework and Reading: 20%
Final Exam (Written Test): 80%
10
第1章 算法的基本概念
1.1 引言
1.1.1 算法的定义和特性
算法设计与分析
什么是算法?
算法组成
(1)问题
(2)规则
(3)结果
算法是解某一问题的一组有穷规则的集合。 算法是把输入转换成输出的一个计算序列。
2
课程概述
计算机系统中的任何软件,都是按一个个特定的算法 来予以实现的。算法性能的好坏,直接决定了所实现 软件性能的优劣。 如何判定一个算法的性能、用什么方法来设计算法、 所设计的算法需要多少运行时间、多少存储空间,在 实现一个软件时,这些都是必须要予以解决的。 因此,算法设计与分析是计算机科学与技术的一个核 心问题,也是大学计算机专业本科生及研究生的一门 重要的专业基础课程。
3
课程内容
第一部分(1-2章):基本概念和常用数学工具(6学时)
第二部分(3-11章):基本理论和技术,包括排序、递归、 分治、贪婪法、动态规划、回溯法、分支与限界、 随 机算法、图和网络问题 (30学时) 第三部分:复习考试(4学时)
4
教材与参考书
教材:郑宗汉、 郑晓明:算法设计与分析,清华大学
1.1.2 算法的设计和复杂性分析
11
1.1.1 算法的定义和特性
定义:算法是把输入转换成输出的一个计算序列。
特性:
(1)输入
(2)输出
(3)有限性 (4)确定性 (5)可行性
12
1.1.1 算法的定义和特性
最大公约数问题:求两个正整数m和n的最大公约数
设计:
17
1.1.2 算法的设计和复杂性分析
百鸡问题的穷举法改进
输入:所购买的3种鸡的总数目n 输出:满足问题的解的数目k,公鸡,母鸡,小鸡的只数g[],m[],s[]
1. void chicken_question_2(int n, int &k, int g[], int m[], int s[]) 2. { 3. int a,b,c; 4. k = 0; 5. i = n / 5; 6. j = n / 3; 7. for (a = 0; a <= i; a++) 8. for ( b = 0; b <= j; b++) { 9. c = n – a - b; // 原来为 for (c = 0; c <= n; c++) 10. if ((a + b + c == n) && (5 * a + 3 * b + c / 3 == n) && (c%3 == 0)) { 11. g[k] = a; 12. m[k] = b; 13. s[k] = c; 14. k++; 15. } 16. }
c %3 0
(1.1.3)
16
1.1.2 算法的设计和复杂性分析
百鸡问题的穷举法
输入:所购买的3种鸡的总数目n 输出:满足问题的解的数目k,公鸡,母鸡,小鸡的只数g[],m[],s[]
1. void chicken_question(int n, int &k, int g[], int m[], int s[]) 2. { 3. int a,b,c; 分析发现:只能买到n/5 4. k = 0; 只公鸡,n/3只母鸡,将 5. for (a = 0; a <= n; a++) { 算法进行改进。 6. for ( b = 0; b <= n; b++) { 7. for (c = 0; c <= n; c++) { 8. if ((a + b + c == n) && (5 * a + 3 * b + c / 3 == n) && (c%3 == 0)) { 9. g[k] = a; 10. m[k] = b; 11. s[k] = c; 12. k++; 13. } 14. } 15. } 16. } 17. }