1、数据结构,范国华,1.1 数据结构讨论的范畴 1.2 基本概念和术语 1.3 抽象数据类型的表示与实现 1.4 算法及其量度,第一章 绪言,1.1 数据结构讨论的范畴Niklaus wirth程序设计: 为计算机处理问题编制的一组指令集。 算法: 处理问题的策略。 数据结构: 问题的数学模型。,Algorithm + Data Structures=Programs,数值计算的程序设计问题,梁架结构中应力的分析计算: 线性代数方程组天气预报:环流模式方程,非数值计算的程序设计问题: 例1 个人电话簿问题设有一个电话号码薄,它记录了N个人的名字和其相应的电话号码,要求设计一个算法,当给定任何一个
2、人的名字时,该算法能够打印出此人的电话号码,如果该电话簿中根本就没有这个人,则该算法也能够报告没有这个人的标志。,例2 人机对奕问题,例3 多叉路口交通灯管理问题,数据结构定义: 数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等等的学科。,数据结构是一门综合性的专业课程,是一门介于数学、计算机硬件、计算机软件之间的一门核心课程。是设计和实现编译系统、操作系统、数据库系统及其他系统程序和大型应用程序的基础。,1.2 基本概念和术语 数据(data)是对客观事物的符号表示,在计算机科学中则是指所有能被输入到计算机中,并能被计算机处理的符号的总称; 数据元素(d
3、ata element)数据中的一个“个体”,数据的基本单位; 数据项(data item)数据结构中讨论的最小单位; 数据对象(data object) 性质相同的数据元素的集合。 数据结构(data structure)带结构的数据元素的集合;,例如:,一个含12位数的十进制数可以用3个4位的十进制数来表示。 4217,3558,6119a1(4217),a2(3558),a3(6119) 在a1、a2、a3存在“次序”关系4217,3558,6119 = 3558,6119,4217a1 a2 a3 a2 a3 a1,数据元素之间的关系可以分为以下四类:线性结构 一个对一个,如线性表、栈
4、、队列树形结构 一个对多个,如树图状结构 多个对多个,如图集合 数据元素间除“同属于一个集合”外,无其它关系,线性结构,树形结构,树 二叉树 二叉搜索树,14,13,12,11,2,3,4,5,6,7,8,9,10,3,1,5,8,7,10,11,9,9,8,7,4,5,6,6,2,3,13,1,bin,dev,etc,lib,user,1,1,2,5,6,4,3,1,2,5,4,3,6,11,33,18,14,6,6,5,16,19,21,图结构,网络结构,数据结构的形式定义为:数据结构是一个二元组:Data-Structure = ( D,S ) 其中:D是数据元素的有限集,S是D上关系的
5、有限集,数据的逻辑结构只抽象反映数据元素的逻辑关系 数据的存储(物理)结构数据的逻辑结构在计算机存储器中的映象(表示),数据元素的映象方法,计算机中的数据元素是用二进制位(bit)的位串来表示的。 (321)10 = (501)8 = (101000001)2A = (101)8 = (001000001)2,关系的映象方法,所有的关系都可以用有序对的形式来表示 即 顺序映象:借助数据元素在存储器中的相对位置来表示数据元素间的逻辑关系。 y的存储位置和x的存储位置之间差一个常量C 整个存储结构中只包含数据元素本身的信息链式映象:借助指示元素存储地址的指针表示数据元素间的逻辑关系。 y的存储位置
6、和x的存储位置之间没有固定的关系 存储结构中不光包含数据元素本身的信息还包含指向后继元素的指针。,1536,y,1400,x,1346,元素3,元素4,1345,h,链式存储,h,数据类型高级语言中指数据的取值范围及其上可进行的操作的总称。,数据类型可分为2种: 简单型和结构型 例如C语言中的:基本类型:整型、浮点型、字符型构造类型:数组、结构、联合、指针、枚举型、自定义,抽象数据类型(ADT):一个数学模型以及定义在该模型上的一组操作。抽象数据类型实际上就是对该数据结构的定义。因为它定义了一个数据的逻辑结构以及在此结构上的一组算法。,1.3 抽象数据类型的表示与实现,ADT的两个重要特征,数
7、据抽象: 用ADT描述程序处理的实体时,强调的是其本质特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。数据封装: 将实体的外部特性和其内部的实现细节分离,并且对外部用户隐藏其内部实现细节。,例:复数的抽象数据类型,ADT Complex 数据对象: =e1,e2 | e1,e2 属于 RealSet 数据关系: R1= |e1是复数的实数部分,|e2是复数的虚数部分 ,基本操作:,InitComplex(&Z,v1,v2) 操作结果: 构造复数Z,其实部和虚部分别被赋予参数v1和v2的值。DestroyComplex(&Z) 操作结果: 复数Z被销毁。GetReal(Z,&
8、realPart) 初始条件: 复数已存在。 操作结果: 用realpart返回复数Z的实部值。,GetImag(Z,&Imagpart) 初始条件:复数已存在。 操作结果:用Imagpart返回复数Z的虚部值。Add(z1,z2,&sum) 初始条件:z1,z2是复数。 操作结果:用sum返回2个复数z1,z2的和值。 ADT Complex,抽象数据类型的描述方法,用三元组描述如下:(,)其中: 是数据对象;是上的关系集;是对的基本操作集。,1.4 算法及其量度算法(algorithm)对特定问题求解步骤的一种描述,是指令的有限序列。 一个算法必须满足以下5个特性 ,设计算法时,通常要考虑
9、达到以下的目标: 正确性(correctness) 可读性(readability) 健壮性(robustness) 高效率与低存储量,算法设计的要求,两种衡量效率的方法: 1.事后统计法缺点:必须先运行依据算法编制的程序所得时间统计量依赖于硬件、软件等 环境因素,掩盖算法本身的优劣,算法效率的衡量方法和准则,2. 事前分析估算法一个高级语言程序在计算机上运行所消耗的时间取决于:依据的算法选用何种策略问题的规模程序语言编译程序产生机器代码质量机器执行指令速度 一个特定算法的“运行工作量” 的大小。只依赖于问题的规模(通常用整数n表示),或者说,它是问题规模的函数。,时间复杂度(T(n):一般来
10、说:算法执行时间的增长率和问题规模n的某个函数f(n)的增长率是相同的,记作:T(n)=O(f(n),它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率成正比。,算法的时间复杂度的估算,算法=控制结构+原操作 算法执行时间=原操作(i)的执行次数*原操作(i)的执行时间算法的执行时间与原操作执行次数之和成正比,从算法中选取一种对于研究的问题来说是基本操作的原操作,以该基本操作在算法中重复执行的次数作为算法运行时间的衡量准则。基本操作一般是最深层循环内的语句中的原操作。,例1:N*N 矩阵相乘,for( i=1; i=n; i+ )for( j=1; j=n; j+ ) cij =
11、 0; for( k=1; k=n; k+ ) cij = cij + aik * bkj;,基本操作:乘法操作 由于是一个三重循环,每个循环从1到n,则总次数为: nnn,Void bubble-sort(int a,int n)for ( i = n-1, change = TURE; i1 change = TURE ,例2.将a中整数序列重新排成自小到大的有序整数序列,最好情况:0 次最坏情况:1+2+3+n-1 = n(n-1)/2 平均时间复杂度为: O(n2) 最坏时间复杂度为: O(n2),基本操作:交换序列中相邻的两个整数,以下六种计算算法时间的多项式是最常用的。其关系为:O
12、(1) O(logn) O(n) O(nlogn) O(n2) O(n3) 指数时间的关系为:O(2n) O(n!) O(nn)当n取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊。因此,只要有人能将现有指数时间算法中的任何一个算法化简为多项式时间算法,那就取得了一个伟大的成就。,算法的存储空间需求空间复杂度:算法所需存储空间的度量,记作:S ( n ) = O ( f ( n ) ) 其中n为问题的规模(或大小)它表示随问题规模n的增大,算法运行所需存储量的增长率和f(n)的增长率成正比。,算法存储量包括,1.输入数据所占的空间; 2.程序本身所占空间; 3.辅助变量所占空间。,若输入数据所占的空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的辅助变量所占的额外空间。若所需存储量依赖于特定的的输入,则通常按最坏的情况考虑。,