Upload
donagh
View
51
Download
4
Embed Size (px)
DESCRIPTION
程序设计语言(也被称为“编程语言”, Programming Language )是人们 描述(编制) 程序 所使用的规范和方法( 语言 )。 机器语言 汇编语言 高级语言. 上堂课的主要内容. 第六讲 算法设计. 北京大学 信息科学技术学院. 2014年10月7日. 了解算法的基本概念 掌握描述算法的三种基本结构 学会算法的流程图描述 介绍几种基本算法. 主要内容. 计算机只是一个计算工具,它本身不能主动帮助我们做任何事情,需要我们告诉它如何进行计算。 - PowerPoint PPT Presentation
Citation preview
23/4/20 北京大学 1
上堂课的主要内容
程序设计语言(也被称为“编程语言”,Programming Language )是人们描述(编制)程序所使用的规范和方法(语言)。 机器语言 汇编语言 高级语言
第六讲 算法设计
北京大学 信息科学技术学院
2023年4月20日 星期四
23/4/20 北京大学 3
主要内容
了解算法的基本概念 掌握描述算法的三种基本结构 学会算法的流程图描述 介绍几种基本算法
23/4/20 北京大学 4
1 算法的基本概念
计算机只是一个计算工具,它本身不能主动帮助我们做任何事情,需要我们告诉它如何进行计算。
程序设计就是要告诉计算机如何进行计算的。这与我们中学时代的数学解题过程是一样的,只不过描述的手段有所变化而已。
23/4/20 北京大学 5
1 算法的基本概念
1984 年图灵奖获得者瑞士科学家尼克劳斯 · 沃斯( Niklaus
Wirth , Pascal 语言的发明者和结构化程序设计创始者) 1976 年出版了《算法 + 数据结构 = 程序设计》一书,提出了著名的公式:“程序 = 数据结构 + 算法” 。
程序:刻画现实世界,解决现实世界中的问题 程序设计语言:实现的工具 算法:问题的解的描述 数据结构:现实世界的数据模型
程序就是在数据的某些特定的表示方式和结构的基础上对抽象算法的具体表述。
23/4/20 北京大学 6
1 算法的基本概念
算法的定义 设计程序的目的是为了求解问题,为解决一个问题
所采取的方法和步骤,就称为“算法” 算法是一个由一组严格定义的指令组成的过程,给
定一个出始状态,这个过程能够结束在一个确定终止状态。
大多数算法都可以用程序实现。 常用算法一般都被实现为算法库,供程序员调用。
23/4/20 北京大学 7
1 算法的基本概念
一个实例:找出一组正整数中的最大的数
23/4/20 北京大学 8
1 算法的基本概念
逐步求解,定义算法的动作 S1: 设 Largest 为第一个数 S2: 若第二个数比 Largest 大,则设 Largest 为第二个数 S3: 若第三个数比 Largest 大,则设 Largest 为第三个数 S4: 若第四个数比 Largest 大,则设 Largest 为第四个数 S5: 若第五个数比 Largest 大,则设 Largest 为第五个数
23/4/20 北京大学 9
1 算法的基本概念
算法动作精化 S0: 设 Largest 为 0
S1: 若当前数比 Largest 大,则设 Largest 为当前数 S2: 若当前数比 Largest 大,则设 Largest 为当前数 S3: 若当前数比 Largest 大,则设 Largest 为当前数 S4: 若当前数比 Largest 大,则设 Largest 为当前数 S5: 若当前数比 Largest 大,则设 Largest 为当前数
23/4/20 北京大学 10
1 算法的基本概念
算法范化从 N个正整数中找出最大数的通用算法
S0: 设 Largest 为 0 ,当前位置 p为 0
S1: 若当前数比 Largest 大,则设 Largest 为当前数 S2: 若 p比 N小,则 p增加 1 ,返回 S1 ,否则返回
Largest
23/4/20 北京大学 11
1 算法的基本概念
算法的基本性质 通用性:即适用于某一类问题中的所有个体,而不只是用
来解决一个具体的问题。 有效性:即应有明确的步骤一步一步地引导计算的进行。 确定性:即每个步骤都是机械的、有明确定义的动作,不
需要计算者临时动脑筋。 有限性:对满足算法要求的输入数据,算法应在有限多步
内结束,并给出明确的计算结果。 离散性:算法的输入数据及输出数据都应是离散的符号。
23/4/20 北京大学 12
1 算法的基本概念
算法的基本要求 正确 易维护(可读,易修改) 方便使用 高效
速度快 运行时间少,时间复杂度低 占用内存少 空间复杂度低
算法的效率可以测试,用大量输入数据测量运行的时间和占用的内存,通过比较判别和选择效率高的算法。
更重要的是编程前的分析和估计,即理论的计算,给出事前的判断。
23/4/20 北京大学 13
1 算法的基本概念
不了解施加于数据上的算法就无法决定如何构造数据;反之,算法的结构和选择却常常在很大程度上依赖于作为基础的数据结构。简而言之,程序的构成(算法)与数据结构是两个不可分割地联系在一起的问题。
23/4/20 北京大学 14
2 描述算法的三种基本结构
已经证明,只使用如下三种结构,就可以描述任何算法,且算法结构优良 顺序结构( Sequence ) 分支结构( Decision ) 循环结构( Repetition )
每一种基本结构分别只有一个入口和一个出口
23/4/20 北京大学 15
2.1 顺序结构
顺序结构:动作(语句)序列,顺序执行
动作 1 动作 2 动作 3 … 动作 n
动作 1
动作 2
动作 3
…
动作 1
23/4/20 北京大学 16
2.2 分支结构
分支结构:根据条件判断执行什么动作(语句)
如果 条件成立 则 动作 1
否则 动作 2
分支结束
条件成立?
动作 1 动作 2
是 否
23/4/20 北京大学 17
2.3 循环结构
循环结构:重复执行一系列动作
当 条件成立 做 动作 1 动作 2 … 动作 n
循环结束处
条件成立?
动作 1
动作 n
…
是
否
23/4/20 北京大学 18
3 流程图表示算法
算法是让人来理解的,因此需要有效的算法表示机制 自然语言表示法 伪代码表达法 流程图表示法
23/4/20 北京大学 19
3 流程图表示算法
流程图显示了程序的流程判断结构。通常包含如下符号: 开始和结束 流程线 输入和输出 处理(动作) 条件判断
开始 / 结束 处理(动作)流程线
输入 / 输出 条件判断
23/4/20 北京大学 20
3 流程图表示算法
判断
x>0
y = x y = -x
Yes No
23/4/20 北京大学 21
3 流程图表示算法
循环k<10
动作
k=k+1
Yes
No
动作
k=0
23/4/20 北京大学 22
3 流程图表示算法
判断闰年 能被 4 整除且不能被 100 整除; 能被 400 整除
23/4/20 北京大学 23
3 流程图表示算法
判断闰年 能被 4 整除且不能被 100 整除; 能被 400 整除
用 C 语言实现算法
23/4/20 北京大学 24
3 流程图表示算法
另一种表示: N-S 图
23/4/20 北京大学 25
4 基本算法
数值算法 加减乘除、最大最小值、解方程、求微积分
非数值算法 排序、查找、文本处理、流程处理
算法设计与分析需要坚实的数学基础
23/4/20 北京大学 26
4.1 基本算法 - 求平方根
求一个数的平方根: x = 迭代公式 x1 = 1
xn+1 = (xn + a/xn)/2
迭代计算,直到 xn+1 – xn 的绝
对值小于误差要求,例如小于0.00001 ,即保留小数点后 5 位。
输入数 a
开始
初始化: x2=1
x1 = x2
x2 = (x1 + a/x1)/2
x2-x1的绝对值小于 0.00001?
N
结束
输出 x2Y
a
23/4/20 北京大学 27
4.1 基本算法 - 求平方根 (C 语言实现 )
23/4/20 北京大学 28
4.2 基本算法 – 排序
排序( Sort )是指对一些数据的重新组织,使得数据由大到小(降序)或者由小到大(升序)存储。排序是很一种基本的要求。我们所感兴趣的是如何寻找到一个好(计算速度快或占用内存少)的办法来进行排序。 选择排序 冒泡排序
23/4/20 北京大学 29
4.2排序——选择排序
选择排序, Selection sort 数据列表被分为两个子列表:已排序和未排序。
找到未排序列表中值最小(或最大)的元素,并把它和未排序列表中的第一个元素进行交换。
23/4/20 北京大学 30
4.2 选择排序——示例(续)
23/4/20 北京大学 31
4.2 选择排序——示例
23/4/20 北京大学 32
4.2 选择排序——算法、程序
初始化: wall=0
开始
找到未排序列表中的最小元素
与未排序列表中第一个元素交换
是否还有未排序元素?
N
结束
Y
wall = wall+1
23/4/20 北京大学 33
4.2 排序——冒泡排序
冒泡排序, Bubble sort 数据列表被分为两个子列表:已排序和未排序。未排序列表中最小(或最大)的元素通过冒泡的形式(从后往前冒泡)从未排序列表中交换到已排序列表中。
23/4/20 北京大学 34
4.2 冒泡排序——示例
比较
比较并交换冒泡的过程
23/4/20 北京大学 35
4.2 冒泡排序——示例(续)
23/4/20 北京大学 36
4.2 冒泡排序——示例(续)
23/4/20 北京大学 37
4.2 冒泡排序——算法、程序
初始化: wall=0
开始
还有未排序的数?
N
结束
Y
交换相邻数
还有未冒泡的数?
比较相邻数
Y
N
23/4/20 北京大学 38
4.2 基本算法 – 排序
各种排序方法简介:就地排序算法(不增加新的存储空间)1 、插入排序法( Insert Sort )将一个数插入到序列中的合适位置。
2 、选择排序法( Selection Sort )每次把最小(大)的元素交换到最前面。
3 、冒泡排序法( Bubble Sort比较并交换相邻的元素,直到所有元素都被放到合适的位置。
4 、堆排序( Heap Sort )一种效率非常高,但原理较复杂的排序方法。
5 、快速排序算法( Quick Sort )一种通常情况下效率非常高,但原理较复杂的排序
23/4/20 北京大学 39
4.2 基本算法 – 搜索
搜索( Search )是利用给出的关键值,在一个数据集合或数据序列中找出与关键值匹配的一个或一组数据的过程。
顺序查找:最简单的查找算法。 从数据序列的第一个数据开始,逐个与关键值比较,直到找到一个或所有的匹配数据为止(也可能找不到)。顺序查找不要求待查找的数据序列已经排好序。但当待查找数据序列中数据比较多时,顺序查找的效率将十分低。
二分查找:二分查找可以提高查找效率,但要求待查找的数据序列已经排好序。
以序列中间数据为界将待查找的数据序列分成两个子序列,比较匹配关键值与中间数据的大小,再确定去哪个子序列中继续查找。这样逐步缩小范围,直到找到所需数据。
23/4/20 北京大学 40
4.2 基本算法 – 二分法搜索
二分法搜索, Binary search
找一个数在给定已排序列表中的位置。例如在 A 中查找45 的位置。
1 63 12 24 3532 41 43 5145 53 56 8875
0
91
157
(0+16)/2
158
(8+15)/2
11
108
(8+10)/2
9
43 5145 53 56 8875 91
43 5145
1 63 12 24 3532 41
1 63 12 24 3532 41 53 56 8875 91
A
A
A
1 63 12 24 3532 41 43 5145 53 56 8875
0
91
157
(0+16)/2
158
(8+15)/2
11
108
(8+10)/2
9
43 5145 53 56 8875 91
43 5145
1 63 12 24 3532 41
1 63 12 24 3532 41 53 56 8875 91
A
A
A
(0+15)/2
45>41
45<53
45=45
23/4/20 北京大学 41
4.3 二分法搜索——算法、程序
开始
返回 -1
子序列为空?
low=0, high=n-1
mid=(low+high)/2
返回 mid
x ==A[mid]?
x<A[mid]?
high=mid-1
low=mid+1
Y
Y
Y
N
N
N
23/4/20 北京大学 42
4.4 基本算法 – 迭代与递归
迭代 (iterative) 与递归 (recursive)
23/4/20 北京大学 43
1974 年图灵奖获得者美国科学家唐纳德 ·克努特 (Donad E.Knuth ,排版软件的先驱 (TEX) )经典巨著《计算机程序设计的艺术》(The Art of Computer Programming)
The Art of Computer Programming 卷 1 为基础运算法则,该书以基本的编程概念和技术为开始,然后讲述信息结构——计算机内信息的表示法,数据元素间的结构关系以及处理它们的有效方法。主要应用于模拟、数字方法、符号计算、软件和系统设计。 卷 2 对半数值算法领域做了全面介绍,分 "随机数 " 和 " 算术 "两章。本卷总结了主要算法范例及这些算法的基本理论,广泛剖析了计算机程序设计与数值分析间的相互联系。 卷 3 为分拣和搜索,它对计算机分拣和搜索的一流技术的最全面的研究,它扩展了卷 1 中数据结构的处理方法,将数据库以及内存和外部存储都包含在内。
23/4/20 北京大学 44
小结
算法的概念 描述算法的三种基本结构
顺序结构、分支结构、循环结构 算法的流程图表示与算法的程序实现
闰年判断 基本算法介绍
迭代计算:求平方根 排序:选择排序、冒泡排序 二分查找 迭代与递归
23/4/20 北京大学 45
编程网格。 算法设计练习—输入算法。
上机练习(第 2 次上机)