第一章 算法问题求解基础 (2)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
凭借自身的经验和知识去选择和使用适当的问题求解策略、技术和工具, 将一个问题描述转换成问题解的过程。
ຫໍສະໝຸດ Baidu
1.2.2 问题求解过程
问题求解的四步法简述如下:
理解问题 设计方案 实现方案 回顾复查
1.2 问题求解方法
1.2.3 系统生命周期
计算机求解问题的过程就是一个计算机软件的开发过程, 被称为软件生命周期或系统生命周期。
课后认真、独立、按时完成并提交作业.
本课程平时分数的组成
平时分 = 学习态度 + 课堂考勤 + 平时作业
第一章 算法问题求解基础
算法概述 问题求解方法
算法设计与分析
递归和归纳
第一讲 算法概述及算法设计与分析
教学目的:
1、理解算法、递归定义及递归的概念; 2、理解问题求解的方法; 3、理解用算法求解问题的过程。 4、理解并掌握使用递归的思想求解问题的方法; 算法的概念,问题求解的过程和方法、用算法求解问题的过程,递归的概 念,递归定义中的两个要素,递归算法举例,递归算法正确性的归纳证明. 算法的概念、算法求解问题的过程、递归的思想,递归算法的设计
主要教学内容
第一章 算法问题求解基础
第二章 算法分析基础 第五章 分治法 第六章 贪心法 第七章 动态规划法
第八章 回溯法
第九章 分枝限界法 第十章 NP完全问题
课程的基本要求
课前做好充分的预习 保持课堂安静,头脑清醒,思维活跃
重视上机实践,有效利用宝贵的上机时间,做到上机前事
先对实验题目进行预习、分析并写出代码.
设计算法
证明正确性
分析算法
设计程序
1.3 算法设计与分析
1.3.3 如何确认算法(正确性)
算法的正确性的定义:在给定有效输入后,算法经过有限时间的计
算并产生正确的答案,就称算法是正确的。
正确性证明的目的:确认一个算法能正确无误的工作. 正确性证明的内容: 方法的正确性证明——算法思路的正确性.证明一系列与算法的工
void move(char x, int n,char y) { cout<<“The disk”<<n<<“is moved from”<< x<<“to top of tower”<<y<<endl; }
教学内容:
教学重点:
拟教课时:
3(理论)
教学过程:
1.1 算法概述
算法的概念:
是对特定问题求解步骤的一种描述,是指令的有限序列。 输 入:有零个或多个外部量作为算法的输入。 输 出:算法产生至少一个量作为输出。 确定性:算法的每个步骤必须有明确的意义,对每种可能的情况,算法 都要给出确定的操作. 能行性: 算法的每一条指令必须能够实现,算法执行结果要达到预期 的目的; 有限性:算法必须在执行有穷个指令后终止,并且每条指令都在执行 有限时间后结束。 1).数据: 运算序列中作为运算对象和结果的数据. 2).运算: 运算序列中的各种运算:赋值,算术和逻辑运算 3).控制和转移: 运算序列中的控制和转移.
C++
1.1 算法概述
举例:计算
s i
i 1 100
0s
写出其算法
流程图描述 N-S描述: 0->s 1->i i<=100? s+i->s
自然语言描述:
1,0s
2,1->I 3,s+i->s 4,i+1->I 5,判断i<=100 是,转3,否则转6 6,输出s的值
开始
0->s 1->i
软件生命周期可划分为如下5个阶段:
分析 设计 编码 测试 维护
开发期
运行期
1.3 算法设计与分析
1.3.1算法问题求解过程
理解问题
1.3.2 如何设计算法
精确解或近似解 选择数据结构 算法设计策略
学习一些基本的算法设计策略. 分析问题的特性,当该问题的特性符合 于某种算法设计策略处理的问题特性时, 就可使用该算法设计策略设计算法,求 解问题.
算法分析与设计
主讲:徐晓蓉 计算机科学与技术学院
学习算法的必要性及目的
算法是计算机科学的基础,更是程序的基石,为了成为训练 有素的软件人才,必须有良好的算法基础。 哈雷尔在他的<算法学—计算的灵魂>一书中说:”算法不仅 是计算机学科的一个分支,它更是计算机科学的核心,而且可 以毫不夸张地说,它和绝大多数科学、商业和技术都是相关的” 简单的说,学习算法,就是为了掌握并灵活运用已有的算法 策略解决实际问题,并设计新的更有效的新算法。
A(1,0) 2 A(0, m) 1 m 0 A(n, m) n 2 n 2 A(n,0) n 2 A(n, m) A( A(( n 1), m), m 1)
n, m 1
注意:只有具备这两个要素,才能在有限次计算后得到结果,否则,
C++语言,类型丰富,语言精练,具有面向对象和面向过程的双重优点.
C++语言既能描述算法所处理的数据结构,又能描述算法过程.
用C++来描述算法可使整个算法结构紧凑、简洁明了可读性强.
1.2 问题求解方法
1.2.1问题和问题求解
问题:当前状况与目标不一致时就会产生问题 问题求解: 寻找一种方法来实现目标. 问题求解过程: 是人们通过使用问题领域知识来理解和定义问题,并
算法的特征:
算法的三个要素:
1.1 算法概述
算法的分类:
从解法上 数值型算法:算法中的基本运算为算术运算. 非数值型算法:算法中的基本运算为逻辑运算. 从处理方式上
串行算法:串行计算机上执行的算法.
并行算法:并行计算机上执行的算法.
从解的精确程度上
1.1 算法概述
程序的概念:
当一个算法用某种程序设计语言来描述时,得到的就是程序,也就是 说,程序是用某种程序设计语言对算法的具体实现.
程序与算法的区别与联系:
区别:
算法必须可以终止; 程序则可以不满足算法的有限性,如操作系统程序
联系:当算法用计算机语言来描述之后,便得到程序。
C++语言的特点:
课时安排
课程的教学任务和目标
学习并掌握各种基本的算法设计策略。
学习算法分析的基本方法。 学习用基本的算法设计策略解决实际问题的方法. 通过对常用的、有代表性的算法的学习研究,让学生理解并 掌握算法设计的基本技术。 培养学生分析算法复杂度的初步能力,锻炼其逻辑思维能力 和想象力,并使之了解算法理论的发展。 使学生掌握算法设计过程与方法,并学会用所学知识解决实 际问题,培养他们的独立科研的能力和理论联系实践的能力。
自然语言描述: 1,输入a,b,c 2,将a和b中最 大者赋值给变 量max; 3,将max与c 比较,将两者中 的大者赋值给 max; 4,输出max的 值. 流程图描述
开始 输入a,b,c 真 max=a a>=b 真
N-S描述:
输入a,b,c a>=b
伪 代 码 描 述
假
max=b
输入a,b,c; If (a>=b) max=a; else max=b if(max>=c) 输出max; else 输出c;
1.4 递归和归纳
例1-3 汉诺塔问题
假定有三个塔座:X,Y,Z,在塔座X上有n个直径大小各不相同的圆盘, 现要求依据如下原则,将此n个圆盘从X移到Z塔座: (1)每次只能移动一个盘子; (2)盘子可以放在任意一个塔座上; (3)任意时刻任意塔座都不能允许有大压小的情况. 移动过程可描述如下: (1)以塔座Z为中介,将前n-1个圆盘从X->Y; (2)将第n个圆盘移到塔座Z; (3)以塔座X为中介,将前n-1个圆盘从Y->Z.
伪 代 码 描 述
1->i
if i<=100
s+i->s i+1->I print s main() { int i,s=0; for(i=1;i<=100;i++) s=s+i; cout<<s; }
:
s+i->s
i+1->I
T
C++
i+1->i
输出s的值
i<=100? 输出s 结束
语 言 描 述
1.4 递归和归纳
递归求解问题的过程:类似于使用一本大词典查询一个单词的情形.如 递归定义:是一种直接或间接引用自身的定义方法。
基础情况(边界条件):列举新事物的若干简单对象 两个基本要素: 递归部分:给出简单对象定义新对象的条件和方法
例:阶乘函数、斐波那契数列、阿克曼函数
n 0,1 1 Fn Fn 1 Fn 2
什么是归纳?
通过列举少量的特殊情况,经过分析,最后找出一般的关系。 它是一个数学概念,也是一种程序设计的方法 它是一种直接或间接调用自身的技术,如老和尚给小和尚讲故事。
什么是递归?
1.4.1 递归
定义:直接或间接引用自身的技术 本质:是一种循环结构,如老和尚给小和尚讲故事. 它通常是把“较复杂”的计算逐次归结为“较简单”的计算,直 至归结到“最简单”的计算,并最终得到计算结果为止.如n!的递归 计算。
精确算法:能够得到问题的精确解的算法. 近似算法:只能得到问题的近似解的算法.
算法的描述方法:
自然语言描述(但不够严谨) 流程图(早期)和N-S图(对于复杂算法,难于建图和理解) 伪代码(比自然语言精确,比程序设计语言简洁) 高级程序设计语言(描述精确,但一般细节较多)—程序
1.1 算法概述
举例:从三个数a,b,c中取最大数
Fib(2) Fib(1) Fib(0)
Fib(1)
递归树:用以描述某一递归函数在执行过程中的 调用关系的树,称为关系树.
1.4 递归和归纳
1.4.2递归算法示例
重点掌握递归算法的设计方法.
例1-2逆序输出正整数的各位数
设有正整数n=12345,要求以各位数的逆序形式输出,即输出54321。 设k位正整数为d1d2…dk,为了以逆序形式输出各位数dkdk-1…d2d1,可以分成 两步: (1)首先输出末位数dk; (2)如果k>1(即n>=10),则再输出由前k-1位组成的正整数d1d2…dk-1的逆序 形式. void PrintDigit(unsigned int n) { cout<<n%10; if(n>=10) PrintDigit(n/10); }
将会无限循环
1.4 递归和归纳
long Fib ( int n ) { if (n<=1) return 1; else return Fib(n-2)+Fib(n-1); }
Fib()函数的执行过程:
Fib(4) Fib(3) Fib(2) Fib(1) Fib(0)
递归调用:在函数体内调用自己的做法 称为递归调用 递归函数 定义:包含递归调用的函数. 种类:直接递归、间接递归 递归算法(函数) 定义:直接或间接调用自身的算法, 称为递归算法。
教材、参考书与课时安排
教材
算法设计与分析--C++语言描述 陈慧南 电子工业出版社
参考书
苏德富主编,《计算机算法设计与分析》,电子工业出版社,2000年6月; 王晓东主编,《计算机算法设计与分析》(第2版),电子工业出版社, 2004年7月; 卢开澄主编 清华大学出版社出版的《计算机指导引论-设计与分析》 Sartaj Sahni著(美) ,汪诗林等译,《数据结构、算法与应用》,机械 工业出版社,1999 授课 :48学时 实验: 10学时
:
假
max=b 真
max=a
max>=c
假
输出max 真 输出max
输出c
max>=c
假 输出c
语 言 描 述
结束
main() { int a,b,c,max; cin>>a>>b>>c; if (a>=b) max=a; else max=b if(max<=c) max=c; cout<<max; }
程序排错的方法
程序测试
定义:指对程序模块或程序总体,输入事先准备好的样本数据, 检查该程序的输出,来发现程序存在的错误及判定程序是否满 足其设计要求的一项积极活动
目的:发现错误 定义:诊断和纠正错误的过程
调试
1.3.4如何分析算法
算法分析主要是指对算法的执行时间和所需空间的估算.
1.4 递归和归纳
作对象有关的引理、定理以及公式。 程序的正确性证明——证明所给出的一系列指令确实做了所要求 的工作。 程序正确性证明的方法: 大型程序—将其分解为小的相互独立的互不相交的模块,分 别验证。 小模块程序—可以使用以下方法验证:数学归纳法,软件形式 方法等。
1.3 算法设计与分析
1.3.3 如何确认算法(正确性)
ຫໍສະໝຸດ Baidu
1.2.2 问题求解过程
问题求解的四步法简述如下:
理解问题 设计方案 实现方案 回顾复查
1.2 问题求解方法
1.2.3 系统生命周期
计算机求解问题的过程就是一个计算机软件的开发过程, 被称为软件生命周期或系统生命周期。
课后认真、独立、按时完成并提交作业.
本课程平时分数的组成
平时分 = 学习态度 + 课堂考勤 + 平时作业
第一章 算法问题求解基础
算法概述 问题求解方法
算法设计与分析
递归和归纳
第一讲 算法概述及算法设计与分析
教学目的:
1、理解算法、递归定义及递归的概念; 2、理解问题求解的方法; 3、理解用算法求解问题的过程。 4、理解并掌握使用递归的思想求解问题的方法; 算法的概念,问题求解的过程和方法、用算法求解问题的过程,递归的概 念,递归定义中的两个要素,递归算法举例,递归算法正确性的归纳证明. 算法的概念、算法求解问题的过程、递归的思想,递归算法的设计
主要教学内容
第一章 算法问题求解基础
第二章 算法分析基础 第五章 分治法 第六章 贪心法 第七章 动态规划法
第八章 回溯法
第九章 分枝限界法 第十章 NP完全问题
课程的基本要求
课前做好充分的预习 保持课堂安静,头脑清醒,思维活跃
重视上机实践,有效利用宝贵的上机时间,做到上机前事
先对实验题目进行预习、分析并写出代码.
设计算法
证明正确性
分析算法
设计程序
1.3 算法设计与分析
1.3.3 如何确认算法(正确性)
算法的正确性的定义:在给定有效输入后,算法经过有限时间的计
算并产生正确的答案,就称算法是正确的。
正确性证明的目的:确认一个算法能正确无误的工作. 正确性证明的内容: 方法的正确性证明——算法思路的正确性.证明一系列与算法的工
void move(char x, int n,char y) { cout<<“The disk”<<n<<“is moved from”<< x<<“to top of tower”<<y<<endl; }
教学内容:
教学重点:
拟教课时:
3(理论)
教学过程:
1.1 算法概述
算法的概念:
是对特定问题求解步骤的一种描述,是指令的有限序列。 输 入:有零个或多个外部量作为算法的输入。 输 出:算法产生至少一个量作为输出。 确定性:算法的每个步骤必须有明确的意义,对每种可能的情况,算法 都要给出确定的操作. 能行性: 算法的每一条指令必须能够实现,算法执行结果要达到预期 的目的; 有限性:算法必须在执行有穷个指令后终止,并且每条指令都在执行 有限时间后结束。 1).数据: 运算序列中作为运算对象和结果的数据. 2).运算: 运算序列中的各种运算:赋值,算术和逻辑运算 3).控制和转移: 运算序列中的控制和转移.
C++
1.1 算法概述
举例:计算
s i
i 1 100
0s
写出其算法
流程图描述 N-S描述: 0->s 1->i i<=100? s+i->s
自然语言描述:
1,0s
2,1->I 3,s+i->s 4,i+1->I 5,判断i<=100 是,转3,否则转6 6,输出s的值
开始
0->s 1->i
软件生命周期可划分为如下5个阶段:
分析 设计 编码 测试 维护
开发期
运行期
1.3 算法设计与分析
1.3.1算法问题求解过程
理解问题
1.3.2 如何设计算法
精确解或近似解 选择数据结构 算法设计策略
学习一些基本的算法设计策略. 分析问题的特性,当该问题的特性符合 于某种算法设计策略处理的问题特性时, 就可使用该算法设计策略设计算法,求 解问题.
算法分析与设计
主讲:徐晓蓉 计算机科学与技术学院
学习算法的必要性及目的
算法是计算机科学的基础,更是程序的基石,为了成为训练 有素的软件人才,必须有良好的算法基础。 哈雷尔在他的<算法学—计算的灵魂>一书中说:”算法不仅 是计算机学科的一个分支,它更是计算机科学的核心,而且可 以毫不夸张地说,它和绝大多数科学、商业和技术都是相关的” 简单的说,学习算法,就是为了掌握并灵活运用已有的算法 策略解决实际问题,并设计新的更有效的新算法。
A(1,0) 2 A(0, m) 1 m 0 A(n, m) n 2 n 2 A(n,0) n 2 A(n, m) A( A(( n 1), m), m 1)
n, m 1
注意:只有具备这两个要素,才能在有限次计算后得到结果,否则,
C++语言,类型丰富,语言精练,具有面向对象和面向过程的双重优点.
C++语言既能描述算法所处理的数据结构,又能描述算法过程.
用C++来描述算法可使整个算法结构紧凑、简洁明了可读性强.
1.2 问题求解方法
1.2.1问题和问题求解
问题:当前状况与目标不一致时就会产生问题 问题求解: 寻找一种方法来实现目标. 问题求解过程: 是人们通过使用问题领域知识来理解和定义问题,并
算法的特征:
算法的三个要素:
1.1 算法概述
算法的分类:
从解法上 数值型算法:算法中的基本运算为算术运算. 非数值型算法:算法中的基本运算为逻辑运算. 从处理方式上
串行算法:串行计算机上执行的算法.
并行算法:并行计算机上执行的算法.
从解的精确程度上
1.1 算法概述
程序的概念:
当一个算法用某种程序设计语言来描述时,得到的就是程序,也就是 说,程序是用某种程序设计语言对算法的具体实现.
程序与算法的区别与联系:
区别:
算法必须可以终止; 程序则可以不满足算法的有限性,如操作系统程序
联系:当算法用计算机语言来描述之后,便得到程序。
C++语言的特点:
课时安排
课程的教学任务和目标
学习并掌握各种基本的算法设计策略。
学习算法分析的基本方法。 学习用基本的算法设计策略解决实际问题的方法. 通过对常用的、有代表性的算法的学习研究,让学生理解并 掌握算法设计的基本技术。 培养学生分析算法复杂度的初步能力,锻炼其逻辑思维能力 和想象力,并使之了解算法理论的发展。 使学生掌握算法设计过程与方法,并学会用所学知识解决实 际问题,培养他们的独立科研的能力和理论联系实践的能力。
自然语言描述: 1,输入a,b,c 2,将a和b中最 大者赋值给变 量max; 3,将max与c 比较,将两者中 的大者赋值给 max; 4,输出max的 值. 流程图描述
开始 输入a,b,c 真 max=a a>=b 真
N-S描述:
输入a,b,c a>=b
伪 代 码 描 述
假
max=b
输入a,b,c; If (a>=b) max=a; else max=b if(max>=c) 输出max; else 输出c;
1.4 递归和归纳
例1-3 汉诺塔问题
假定有三个塔座:X,Y,Z,在塔座X上有n个直径大小各不相同的圆盘, 现要求依据如下原则,将此n个圆盘从X移到Z塔座: (1)每次只能移动一个盘子; (2)盘子可以放在任意一个塔座上; (3)任意时刻任意塔座都不能允许有大压小的情况. 移动过程可描述如下: (1)以塔座Z为中介,将前n-1个圆盘从X->Y; (2)将第n个圆盘移到塔座Z; (3)以塔座X为中介,将前n-1个圆盘从Y->Z.
伪 代 码 描 述
1->i
if i<=100
s+i->s i+1->I print s main() { int i,s=0; for(i=1;i<=100;i++) s=s+i; cout<<s; }
:
s+i->s
i+1->I
T
C++
i+1->i
输出s的值
i<=100? 输出s 结束
语 言 描 述
1.4 递归和归纳
递归求解问题的过程:类似于使用一本大词典查询一个单词的情形.如 递归定义:是一种直接或间接引用自身的定义方法。
基础情况(边界条件):列举新事物的若干简单对象 两个基本要素: 递归部分:给出简单对象定义新对象的条件和方法
例:阶乘函数、斐波那契数列、阿克曼函数
n 0,1 1 Fn Fn 1 Fn 2
什么是归纳?
通过列举少量的特殊情况,经过分析,最后找出一般的关系。 它是一个数学概念,也是一种程序设计的方法 它是一种直接或间接调用自身的技术,如老和尚给小和尚讲故事。
什么是递归?
1.4.1 递归
定义:直接或间接引用自身的技术 本质:是一种循环结构,如老和尚给小和尚讲故事. 它通常是把“较复杂”的计算逐次归结为“较简单”的计算,直 至归结到“最简单”的计算,并最终得到计算结果为止.如n!的递归 计算。
精确算法:能够得到问题的精确解的算法. 近似算法:只能得到问题的近似解的算法.
算法的描述方法:
自然语言描述(但不够严谨) 流程图(早期)和N-S图(对于复杂算法,难于建图和理解) 伪代码(比自然语言精确,比程序设计语言简洁) 高级程序设计语言(描述精确,但一般细节较多)—程序
1.1 算法概述
举例:从三个数a,b,c中取最大数
Fib(2) Fib(1) Fib(0)
Fib(1)
递归树:用以描述某一递归函数在执行过程中的 调用关系的树,称为关系树.
1.4 递归和归纳
1.4.2递归算法示例
重点掌握递归算法的设计方法.
例1-2逆序输出正整数的各位数
设有正整数n=12345,要求以各位数的逆序形式输出,即输出54321。 设k位正整数为d1d2…dk,为了以逆序形式输出各位数dkdk-1…d2d1,可以分成 两步: (1)首先输出末位数dk; (2)如果k>1(即n>=10),则再输出由前k-1位组成的正整数d1d2…dk-1的逆序 形式. void PrintDigit(unsigned int n) { cout<<n%10; if(n>=10) PrintDigit(n/10); }
将会无限循环
1.4 递归和归纳
long Fib ( int n ) { if (n<=1) return 1; else return Fib(n-2)+Fib(n-1); }
Fib()函数的执行过程:
Fib(4) Fib(3) Fib(2) Fib(1) Fib(0)
递归调用:在函数体内调用自己的做法 称为递归调用 递归函数 定义:包含递归调用的函数. 种类:直接递归、间接递归 递归算法(函数) 定义:直接或间接调用自身的算法, 称为递归算法。
教材、参考书与课时安排
教材
算法设计与分析--C++语言描述 陈慧南 电子工业出版社
参考书
苏德富主编,《计算机算法设计与分析》,电子工业出版社,2000年6月; 王晓东主编,《计算机算法设计与分析》(第2版),电子工业出版社, 2004年7月; 卢开澄主编 清华大学出版社出版的《计算机指导引论-设计与分析》 Sartaj Sahni著(美) ,汪诗林等译,《数据结构、算法与应用》,机械 工业出版社,1999 授课 :48学时 实验: 10学时
:
假
max=b 真
max=a
max>=c
假
输出max 真 输出max
输出c
max>=c
假 输出c
语 言 描 述
结束
main() { int a,b,c,max; cin>>a>>b>>c; if (a>=b) max=a; else max=b if(max<=c) max=c; cout<<max; }
程序排错的方法
程序测试
定义:指对程序模块或程序总体,输入事先准备好的样本数据, 检查该程序的输出,来发现程序存在的错误及判定程序是否满 足其设计要求的一项积极活动
目的:发现错误 定义:诊断和纠正错误的过程
调试
1.3.4如何分析算法
算法分析主要是指对算法的执行时间和所需空间的估算.
1.4 递归和归纳
作对象有关的引理、定理以及公式。 程序的正确性证明——证明所给出的一系列指令确实做了所要求 的工作。 程序正确性证明的方法: 大型程序—将其分解为小的相互独立的互不相交的模块,分 别验证。 小模块程序—可以使用以下方法验证:数学归纳法,软件形式 方法等。
1.3 算法设计与分析
1.3.3 如何确认算法(正确性)