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