1、第一章第一章 绪论绪论1.1 什么是数据结构什么是数据结构1.2 基本概念和术语基本概念和术语1.4 算法和算法分析算法和算法分析1.3 抽象数据类型的表示与实现抽象数据类型的表示与实现一、算法一、算法二、算法设计的要求二、算法设计的要求三、算法效率的度量三、算法效率的度量四、算法的存储空间需求四、算法的存储空间需求1.4 算法和算法分析算法和算法分析1 1有穷性有穷性 2 2确定性确定性 3 3可行性可行性4 4有输入有输入 5 5有输出有输出一、算法一、算法 算法算法(algorithm):是对特定问题求解步骤的一种描:是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示
2、一个或多述,它是指令的有限序列,其中每一条指令表示一个或多个操作。个操作。一个算法还具有以下一个算法还具有以下5个重要特性:个重要特性:1 1有穷性有穷性 对于任意一组合法输入值,在执行有穷步骤有穷步骤之后一定能结束,即:算法中的每个步骤都能在有限时间有限时间内完成;2 2确定性确定性 对于每种情况每种情况下所应执行的操作,在算法中都有确切确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行。并且并且在任何条件下,算法都只有一在任何条件下,算法都只有一条执行路径;条执行路径;3 3可行性可行性 算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现之;4 4有输入有输
3、入 作为算法加工对象的量值,通常体现为算法中的一组变量。有些输入量需要在算法执行过程中输入,而有的算法表面上可以没有输入,实际上已被嵌入算法之中;5 5有输出有输出 它是一组与“输入”与确定关系的量值,是算法进行信息加工后得到的结果,这种确定关系即为算法的功能。二、算法设计的原则二、算法设计的原则设计算法时,通常应考虑达到以下目标:1正确性正确性2.可读性可读性3健壮性健壮性4高效率与低存储量需求高效率与低存储量需求1 1正确性正确性 首先,首先,算法应当满足满足以特定的“规格规格说明说明”方式给出的需求需求。其次,其次,对算法是否“正确正确”的的理解可以有以下四个层次四个层次:a a程序中不
4、含语法错误;b b程序对于几组输入数据能够得出满足要求的结果;c c程序对于精心选择的、典型、苛刻且程序对于精心选择的、典型、苛刻且带有刁难性的几组输入数据能够得出满足带有刁难性的几组输入数据能够得出满足要求的结果;要求的结果;通常以第 c c 层意义的正确性作为衡量一个算法是否合格的标准。d d程序对于一切合法的输入数据都能得出满足要求的结果;2.可读性可读性 算法主要是为了人的阅读与交流阅读与交流,其次才是为计算机执行。因此算法应该易易于于人的理解理解;另一方面,晦涩难读的程序易于隐藏较多错误而难以调试;3健壮性健壮性 当输入的数据非法非法时,算法应当恰当地作出反映或进行相应处理进行相应处
5、理,而不是产生莫名奇妙的输出结果。并且,处理出处理出错的方法错的方法不应是中断程序的执行,而应是返回返回一个表示错误或错误性质的值表示错误或错误性质的值,以便在更高的抽象层次上进行处理。4高效率与低存储量需求高效率与低存储量需求 通常,效率指的是算法执行时间;存储量指的是算法执行过程中所需的最大存储空间。两者都与问题的规模有关。三三、算法效率的度量算法效率的度量通常有两种两种衡量算法效率的方法:事后统计法事后统计法事前分析估算法事前分析估算法缺点:缺点:1。必须执行程序 2。其它因素掩盖算法本质和算法执行时间时间相关的因素因素:1 1算法算法选用的策略的策略2 2问题的规模问题的规模3 3编写
6、程序的语言语言4 4编译编译程序产生的机器代码的质量的质量5 5计算机计算机执行指令的速度的速度 一个特定算法的算法的“运行工作量运行工作量”的大小,只依赖于问题的规模(通常用整数量n表示),或者说,它是问题规模的函数是问题规模的函数。一个算法是由控制结构(顺序、分支和循环三种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。为了便于比较同一问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题(或算法类型)来说是基本操作的原操作,以该基本操作重复执行的次数作为算法的时间量度。假如,随着问题规模 n 的增长,算法执行时间的增长率和算法执行时间的增长率和 f(n)
7、的增长的增长率相同率相同,则可记作:T(n)=O(f(n)称称T(n)为算法的为算法的(渐近)时间复杂度时间复杂度如何估算如何估算 算法的时间复杂度?算法的时间复杂度?算法算法 =控制结构控制结构 +原操作原操作 (固有数据类型的操作)算法的执行时间算法的执行时间=原操作原操作(i)(i)的执行次数的执行次数原操作原操作(i)(i)的执行时间的执行时间 算法的执行时间算法的执行时间 与与 原操作执行次数之和原操作执行次数之和 成正比成正比 从算法中选取一种对于所研究的问题来说是 基本操作基本操作 的原操作,以该基本操作 在算法中重复执行的次在算法中重复执行的次数数 作为算法运行时间的衡量准则。
8、语句频度是指的是该语句重复执行的次数。例例一一两两个个矩矩阵阵相相乘乘void mult(int a,int b,int&c)/以二维数组存储矩阵元素,c 为 a 和 b 的乘积 for(i=1;i=n;+i)for(j=1;j=n;+j)ci,j=0;for(k=1;k=n;+k)ci,j+=ai,k*bk,j;/for/mult基本操作:乘法乘法操作时间复杂度:O(n3)由于算法的时间复杂度考虑的只是对由于算法的时间复杂度考虑的只是对于问题规模于问题规模n的增长率,在难以精确计算的增长率,在难以精确计算基本操作执行次数(语句频度)的情况下,基本操作执行次数(语句频度)的情况下,只需要求出它
9、关于只需要求出它关于n的增长率或阶即可。的增长率或阶即可。通常算法中基本操作重复执行的次数随问通常算法中基本操作重复执行的次数随问题的输入数据集不同而不同,对这类算法题的输入数据集不同而不同,对这类算法的分析,的分析,其一是计算算法的平均时间复杂其一是计算算法的平均时间复杂度,其二是计算最坏情况下的时间复杂度度,其二是计算最坏情况下的时间复杂度。常用的时间复杂度有如下的关系:常用的时间复杂度有如下的关系:O(1)=O(log2n)=O(n)=O(nlog2n)=O(n2)=O(2n)四、算法的存储空间需求四、算法的存储空间需求算法的空间复杂度定义为空间复杂度定义为:表示随着问题规模表示随着问题
10、规模 n 的增大,的增大,算法运行所需存储量的增长率算法运行所需存储量的增长率与与 g(n)的增长率相同。的增长率相同。S(n)=O(g(n)算法的存储量算法的存储量包括:1输入数据输入数据所占空间2程序本身程序本身所占空间;3辅助变量辅助变量所占空间。若输入数据输入数据所占空间只取决与问题 本身,和算法无关和算法无关,则只需要分析除 输入和程序之外的辅助变量辅助变量所占额外额外 空间空间。若所需额外空间相对于输入数据量 来说是常数,则称此算法为原地工作原地工作。若所需存储量依赖于特定的输入,则通常按最坏情况考虑。1.熟悉各名词、术语的含义,掌握基本概念。2.理解算法五个要素的确切含义。本章学习要点本章学习要点3.了解估算算法时间复杂度的方法。