2014/4/7 课程简介 ●先修课程及条件 数据结构 程序设计的经验、C、离散数学、概率分析 ■教材:数据结构,黄刘生,经济科学出版社 计算机学院 数据结构(C语言版),严蔚敏,清华大学出版社 肖明军 ■考核:考试+作业+上机 Email:xiaomj@ustc.edu.cn ■参考书 http://staff.ustc.edu.cn/~xiaomj C++数据结构,William Ford清华影印版 数据结构和程序设计,Robert,,Kruse.2nd版 sCh.1绪论 ·量要性 ◆人类社会已步入信惠杜会 ◆计算机不再仅仅局限于科学计算,已深入到社会生活 的各个领城 “给我一根杠杆,我就能捕动地球” 2045 “给我一个接口,我就能驱动地球” sCh.1绪论 sCh.1绪论 重要性 编写解决实际问题的程序的一般过程: 计算机:硬件+软件 ◆如何用数据形式描述问题?一即由问题抽象出一 个适当的数学模型: 算法+数据结构一程序设计(NwM山84年围奥奖得主) 。两个问题:信惠的表示和处理 ·问题所涉及的数据量大小及数据之间的关系: 信息的表示和组织又直接关系到处理信息的程 ·如何在计算机中存储数据及体现数据之间的关系? 序的效率。随着应用问题的不断复杂,导致信息量 处理问题时需要对数据作何种运算? 剧增与信息范图的拓宽,使许多系统程序和应用程 序的规模很大,结构又相当复杂。因此,必须分析 ◆】 所编写的程序的性能是否良好? 待处理问题中的对象的特征及各对象之间存在的关 上面所列举的问题基本上由数据结构这门课程来回答。 系,这就是数据结构这门课所要研究的问题
2014/4/7 1 数据结构 1 计 算 机 学 院 肖明军 Email: xiaomj@ustc.edu.cn http://staff.ustc.edu.cn/~xiaomj 课程简介 先修课程及条件 程序设计的经验、C、离散数学、概率分析 教材:数据结构,黄刘生,经济科学出版社 数据结构(C语言版) 严蔚敏 清华大学出版社 2 数据结构(C语言版),严蔚敏,清华大学出版社 考核:考试+作业+上机 参考书 C++ 数据结构,William Ford 清华影印版 数据结构和程序设计, Robert,Kruse.2nd版 §Ch.1 绪论 重要性 人类社会已步入信息社会 计算机不再仅仅局限于科学计算,已深入到社会生活 的各个领域 3 “给我一根杠杆,我就能撬动地球” “给我一个接口,我就能驱动地球” 4 § Ch.1 绪论 重要性 计算机:硬件+软件 算法+数据结构=程序设计(N.Wirth,84年图灵奖得主) 两个问题 信息的表示和处理 5 两个问题:信息的表示和处理 信息的表示和组织又直接关系到处理信息的程 序的效率。随着应用问题的不断复杂,导致信息量 剧增与信息范围的拓宽,使许多系统程序和应用程 序的规模很大,结构又相当复杂。因此,必须分析 待处理问题中的对象的特征及各对象之间存在的关 系,这就是数据结构这门课所要研究的问题。 编写解决实际问题的程序的一般过程: 如何用数据形式描述问题?—即由问题抽象出一 个适当的数学模型; 问题所涉及的数据量大小及数据之间的关系; § Ch.1 绪论 6 问题所涉及的数据量大小及数据之间的关系; 如何在计算机中存储数据及体现数据之间的关系? 处理问题时需要对数据作何种运算? 所编写的程序的性能是否良好? 上面所列举的问题基本上由数据结构这门课程来回答
2014/4/7 例1:电话号码查询系统 例2:磁盘目录文件系统 设有一个电话号码幕,它记录了N个人的名字和其 磁盘根目录下有很多子目录 相应的电话号码,假定按如下形式安排:(a1,b), 及文件,每个子目录里又可以包 (,b2),.(an,bnJ,其中a,b1(i=1,2.n)分别 含多个子目录及文件,但每个子 表示某人的名字和电话号码。本问题是一种典型的 目录只有一个父目录,依此类推: 表格问题。如表所示,数据与数据成简单的一对一的 本问题是一种典型的树型结 线性关系。 构问题,如图所示,数据与数据 姓名 电话号码 成一对多的关系,是一种典型的 陈海 13612345588 非线性关系结构一树形结构。 李四锋 13056112345 线性表结构 例3:交通网络图 S1.1基本概念和术语 从一个地方到另外一个地方可以有多条路径。本 ■数据:信息载体 问题是一种典型的网状结构问题,数据与数据成多对多 的关系,是一种非线性关系结构。 客观事物的符号表示,能由计算机程序识别、 存储和加工处理的符号集合 州 韩山 所有能够数字化的信息均可认为是数据 州 东 ■数据元素:数据的基本单位,在程序中通常作 山 为一个整体来进行考虑和处理 同义词:元素、结点、顶点、记录、对像、元组等 ■数据项:具有独立含义的最小标识单位,客观 周状抽构 事物某一方面特性的数据描述 同义词:字段、域、属性等 S1.1基本概念和术语 S1.1基本概念和术语 ■数据结构举例 系别 晚名 移 SCI 经量 数据结构:相互之间存在一种或多种特定关系 童明 触漫 5 的数据元素的集合,即数据的组织形式 王华业夏 B 数据的逻辑结构:数据元素之间的逻辑关系 23 李立般设情 6 60 ◆数据的存储结构:数据元素及其关系在计算机存储 器内的表示 行:结点(对象、记录、元组等: 数据的运算:对数据施加的操作 列:数据项(具性、罐、字段等) ◆逻辑结构:开始结点?终端结点?内部结点? 推关 ◆存储结构:用数组实现,还是用指针实现? ◆运算:创建、插入、除、查找等 2
2014/4/7 2 例1:电话号码查询系统 设有一个电话号码薄,它记录了N个人的名字和其 相应的电话号码,假定按如下形式安排:(a1, b1), (a2, b2),…(an, bn),其中ai, bi(i=1,2…n) 分别 表示某人的名字和电话号码。 本问题是一种典型的 表格问题。如表所示,数据与数据成简单的一对一的 7 姓名 电话号码 陈海 13612345588 李四锋 13056112345 。。。 。。。 线性关系。 线性表结构 例2:磁盘目录文件系统 磁盘根目录下有很多子目录 及文件,每个子目录里又可以包 含多个子目录及文件,但每个子 目录只有一个父目录,依此类推: 本问题是一种典型的树型结 8 本问题是 种典型的树型结 构问题,如图所示,数据与数据 成一对多的关系,是一种典型的 非线性关系结构—树形结构。 树形结构 例3:交通网络图 从一个地方到另外一个地方可以有多条路径。本 问题是一种典型的网状结构问题,数据与数据成多对多 的关系,是一种非线性关系结构。 佛山 广州 9 惠州 中山 东莞 深圳 珠海 网状结构 §1.1 基本概念和术语 数据:信息载体 客观事物的符号表示,能由计算机程序识别、 存储和加工处理的符号集合 所有能够数字化的信息均可认为是数据 10 数据元素:数据的基本单位,在程序中通常作 为一个整体来进行考虑和处理 同义词:元素、结点、顶点、记录、对象、元组等 数据项:具有独立含义的最小标识单位,客观 事物某一方面特性的数据描述 同义词:字段、域、属性等 §1.1 基本概念和术语 数据结构:相互之间存在一种或多种特定关系 的数据元素的集合,即数据的组织形式 数据的逻辑结构:数据元素之间的逻辑关系 数据的存储结构:数据元素及其关系在计算机存储 11 器内的表示 数据的运算:对数据施加的操作 §1.1 基本概念和术语 数据结构举例 系别 姓名 职称 SCI EI 经费 1 张明 教授 5 1 20 1 王华 教授 6 3 15 … 23 李立 教授 1 6 60 12 行:结点(对象、记录、元组等); 列:数据项(属性、域、字段等) 逻辑结构:开始结点?终端结点?内部结点? 结点之间的逻辑关系:有且仅有1个开始结点和1个终端结 点,表中任1结点最多只有1个直接前驱和1个直接后继----- 线性关系 存储结构:用数组实现,还是用指针实现? 运算:创建、插入、删除、查找等
20144/7 S1.1基本概念和术语 S1.1基本概念和术语 ■逻辑结构 ■存储结构 线性结构:任一结点最多只有1个直接前驱和1个直接后继 (2)链接存俄方法 ◆非袋性结构:一结点可有多个直接前坚和多个直接后罐 ◆集合结构:元素间无关系,只有元素是否属于集合的关系 该方法不要求逻辑上相邻的结点在物理位置上亦相邻 借助于指针来表示结点闻的逻辑关系 (③)家引存储方法 ·存储结构◆一 在存储结点信息的同时,建立附加的索引表。 ()顺序存储方法 表中每项称为索引项(关键字,地址) 逻辑上相邻的结点存储在物理位置上相邻的存储单元里 测密素引:每个结点对应1个索引项 结点问的逻辑关系由存储单元的邻接关系来体现 希疏索引:一组结点对应1个索引项 借助于数组描述 (④)散列存俄方法 应用于线性的败据结构,非袋性的败据结构的线性化 根据结点的K©y直接计算出该结点的存储地址。 s1.1基本概念和术语 S1.1基本橛念和术语 ■数据结构的主要运算 ■数据结构3方面之联系 (i)建立(Create)一个数据结构; ·同一逻辑结构的不同存储结构,则用不同名称称调 (2)消除Destroy).一个数据结构; 例如, (3)从一个数据结构中副除(Del©t©)一个数据元素; 线性表中顺序表,链表,散列表 (4)把一个数据元素插入(Insert)到一个数据结构中: ◆运算不同,称训也不同 (5)对一个数据结构进行访问(Acoe8s); 线性表→栈、队列户顺序栈、顺序队列 (6)对一个数据结构(中的数据元素)进行修改 (Modify); ◆数据的逻辑结构和物理结构是密不可分的两个方面 一个算法的设计取决于所选定的逻辑结构,而算法 (7)对一个数据结构进行排序(Sort); 的实现依赖于所采用的存储结构。 (8)对一个数据结构进行查找(Search)。 ◆在C语言中,用一维数组表示顺序存储结构;用结 构体类型表示链式存储结构。 逻辑结构 物理结构 S1.1基本概念和术语 线性表 :顺序存储结构 ■数据类型:是一个值的集合以及定义在这些值 树 链式存储结构 上的一组操作的总称,可看作是高级语言提供 的数据结构 复合存储结构 原子类型:值不可分,一般是基本的预定义类型 望辑纳构与所采用的存铺地构 int,char等,定义了“+”,“.等 败物的理填纳构 结构类型:可供用户定义的新类型,构造类型、导 要独兰纳构 出类型、派生类型等 受限线性表} 性表广爆司 树形结构 图状袖构 由基本类型组织而成,如数组、structs等 础性表楼和队列中食恒广义表款闲三又钢有向图无向面 败塘逗辑结构层次关系田 3
2014/4/7 3 §1.1 基本概念和术语 逻辑结构 线性结构:任一结点最多只有1个直接前驱和1个直接后继 非线性结构:一结点可有多个直接前驱和多个直接后继 集合结构:元素间无关系,只有元素是否属于集合的关系 13 存储结构 (1)顺序存储方法 逻辑上相邻的结点存储在物理位置上相邻的存储单元里 结点间的逻辑关系由存储单元的邻接关系来体现 借助于数组描述 应用于线性的数据结构,非线性的数据结构的线性化 §1.1 基本概念和术语 存储结构 (2)链接存储方法 该方法不要求逻辑上相邻的结点在物理位置上亦相邻 借助于指针来表示结点间的逻辑关系 (3)索引存储方法 14 在存储结点信息的同时,建立附加的索引表。 表中每项称为索引项 (关键字,地址) 稠密索引:每个结点对应1个索引项 稀疏索引:一组结点对应1个索引项 (4)散列存储方法 根据结点的Key直接计算出该结点的存储地址。 数据结构的主要运算 ⑴ 建立(Create)一个数据结构; ⑵ 消除(Destroy)一个数据结构; ⑶ 从一个数据结构中删除(Delete)一个数据元素; ⑷ 把一个数据元素插入(Insert)到一个数据结构中; §1.1 基本概念和术语 15 ⑸ 对一个数据结构进行访问(Access); ⑹ 对一个数据结构(中的数据元素)进行修改 (Modify); ⑺ 对一个数据结构进行排序(Sort); ⑻ 对一个数据结构进行查找(Search)。 §1.1 基本概念和术语 数据结构3方面之联系 同一逻辑结构的不同存储结构,则用不同名称称谓 例如, 线性表顺序表,链表,散列表 运算不同 称谓也不同 16 , 线性表栈、队列 顺序栈、顺序队列 数据的逻辑结构和物理结构是密不可分的两个方面, 一个算法的设计取决于所选定的逻辑结构,而算法 的实现依赖于所采用的存储结构。 在C语言中,用一维数组表示顺序存储结构;用结 构体类型表示链式存储结构。 逻辑结构与所采用的存储结构 线性表 树 图 顺序存储结构 链式存储结构 复合存储结构 逻辑结构 物理结构 17 数据的逻辑结构 非线性结构 集合 图状结构 有向图 无向图 树形结构 一般树 二叉树 线性结构 一般线性表 线性表推广 串 数组 广义表 受限线性表 栈和队列 数据逻辑结构层次关系图 §1.1 基本概念和术语 数据类型:是一个值的集合以及定义在这些值 上的一组操作的总称,可看作是高级语言提供 的数据结构 原子类型:值不可分,一般是基本的预定义类型 int,char等,定义了“+”,“-”等 18 int,char等,定义了 , 等 结构类型:可供用户定义的新类型,构造类型、导 出类型、派生类型等 由基本类型组织而成,如数组、struct等
20144/7 S1:1基本概念和术语 61.1基本概念和术语 ■抽象数据类型(Abstract Data Type) ■抽象数据类型(Abstract Data Type) 抽象的数据组织和与之相关的燥作,可看作是数据的逻辑 ADTADT Namef 结构及其在逻辑结构上定义的抽象操作 Data:数据结构(数据对和数据关系)说明 特点 Operations: Constructor:构造函数,创建对象实例 ①封装与德藏:将数据和操作封装在一起,内部结构和 Operation1:用C++或C函数原型描述 实现细节对外屏蔽,实现信息隐藏 input: ②抽象:用户只能通过DT里定义的接口和说明来访问和 Preconditions:M初始条件,执行本操作前系统 操作数据。他反映了程序设计的两层抽象: 需满足的状态 ◆绿念层(抽)-ADT、类说明 process:对数据执行的操作 。实现层类实现,相当于普通类型 output:对返回数据的说明 一应用层一如main0K.),通过操作对象解决实际 Postconditions:执行本操作后系统的状态 问题 Operation2: S1.1基本概念和术语 §1.1基本概念和术语 例:抽象数据类型复数的定义 ADT Complex ■抽象数据类型的表示与实现 意时海 1e.e少是的实分2是复的数分 通过程序设计语言中的类型来实现 本作: omple&Zvl.2) ◆C 排作站果:构迪复章Z其实海取应物分敏腻似常y1和2的直。 DestroyComplex&Z☑ >抽象数据类型 输作谢果:复取放州眼, GetReak(Z &realPart) 数据对象 结构体 初抛条件:复康已存在, 基本操作 作轴果:用eP国直数Z的实善值 函数 件,复已有 ◆Ct+,Java >抽象数据类型 类class 数据对搬 数据成员 操作的果:用am域回两个复章、2的和值, >基本操作 成员函数(方法) 】ADT Complex ADT复数的C描述 ADT复数的C++描述 typedef struct class Complex(∥类的声明 double imagpart: protected: Complex: double realpart; boolean assign(Complex *pSre,Complex *pDes) double magpart; if(pSre-NULL pDes--NULL retur ERROR public: pDes>realpart-pSro>realpart: Complex(方 pDes->imagpart-pSre->imagpart Complex(double realval,double imagVal) return TRUE: Complex(Complex&z){assign(z);} -Complex(片: Complex *add(Complex *pZ1,Complex "pZ2){ void assign(Complex&z); Complex "pSum -(Complex ")malloc(sizeofComplex)): if pSum -NULL )return NULL: double getReal(void)const return realpart;) pSum>realpart-pZI>realpart +pz2>realpart: double getlmag(void)const return imagpart;) pSum->imagpart-pZI-imagpart+pZ2->imagpart: friend Complex add(Complex&z1,Complex&z2); return pSum; 4
2014/4/7 4 §1.1 基本概念和术语 抽象数据类型(Abstract Data Type) 抽象的数据组织和与之相关的操作,可看作是数据的逻辑 结构及其在逻辑结构上定义的抽象操作 特点 ①封装与隐藏:将数据和操作封装在一起,内部结构和 实现细节对外屏蔽 实现信息隐藏 19 , ②抽象:用户只能通过ADT里定义的接口和说明来访问和 操作数据。他反映了程序设计的两层抽象: 概念层(抽象)---ADT、类说明 实现层---类实现,相当于普通类型 应用层----如main(){…},通过操作对象解决实际 问题 §1.1 基本概念和术语 抽象数据类型(Abstract Data Type) ADT ADT_Name{ Data: 数据结构(数据对象和数据关系)说明 Operations: Constructor://构造函数,创建对象实例 Operation1://用C++或C函数原型描述 20 input: Preconditions://初始条件,执行本操作前系统 //需满足的状态 process://对数据执行的操作 output://对返回数据的说明 Postconditions://执行本操作后系统的状态 Operation2: } 例:抽象数据类型复数的定义 ADT Complex { 数据对象:D={e1,e2|e1,e2∈RealSet } 数据关系:R1={<e1,e2> | e1是复数的实数部分,e2 是复数的虚数部分} 基本操作: InitComplex( &Z, v1, v2 ) 操作结果:构造复数Z,其实部和虚部分别被赋以参数v1和v2的值。 DestroyComplex( &Z) 操作结果 复数Z被销毁 §1.1 基本概念和术语 21 操作结果:复数Z被销毁。 GetReal( Z, &realPart) 初始条件:复数已存在。 操作结果:用realPart返回复数Z的实部值。 GetImag( Z, &ImagPart) 初始条件:复数已存在。 操作结果:用ImagPart返回复数Z的虚部值。 Add( z1,z2, &sum ) 初始条件:z1, z2是复数。 操作结果:用sum返回两个复数z1、z2的和值。 } ADT Complex 抽象数据类型的表示与实现 通过程序设计语言中的类型来实现 C 抽象数据类型 数据对象 结构体 §1.1 基本概念和术语 22 数据对象 结构体 基本操作 函数 C++,Java 抽象数据类型 类class 数据对象 数据成员 基本操作 成员函数(方法) ADT复数的C描述 typedef struct { double realpart; double imagpart; }Complex; boolean assign(Complex *pSrc, Complex *pDes){ if (pSrc ==NULL || pDes==NULL ) return ERROR; pDes->realpart = pSrc->realpart; pDes >imagpart = pSrc >imagpart; 23 ->imagpart = pSrc->imagpart; return TRUE; } Complex *add(Complex *pZ1, Complex *pZ2){ Complex *pSum = (Complex *)malloc(sizeof(Complex)); if ( pSum==NULL )return NULL; pSum->realpart = pZ1->realpart + pZ2->realpart; pSum->imagpart = pZ1->imagpart + pZ2->imagpart; return pSum; } ADT复数的C++描述 class Complex{ // 类的声明 protected: double realpart; double magpart; public: Complex( ); 24 Complex(double realVal,double imagVal); Complex(Complex& z){ assign(z) ;} ~Complex( ); void assign(Complex& z); double getReal(void) const { return realpart;} double getImag(void) const { return imagpart;} friend Complex add(Complex& z1, Complex& z2); };
2014/4/7 812算法描迷分析 /类的实现部分 Complex::Complex(double realVal,double imagVal){ ◆ 算法 realpart=realVal; ◆重要性:数据的运算是通过算法描述的 imagpart=imagVal; 定义:非形式地说,算法是任意一个良定义的计 void Complex::assign(Complex&z)( 算过程,它以一个或多个值作为输入,并产生 realpart =z.realpart; 个或多个值作为输出。因此,一个算法就是一系 imagpart=z.imagpart; 列将输入转换为输出的计算步骤。 Complex add(Complex&z1,Complex&z2)( ”5要素 Complex sum(z1片 粮入、输出、有穷性(有穷步骤,每步时间有限) sum.realpart +=z2.realpart; 、捧哥凝老卖的柔限次所有 执行路径) sum.imagpart+=z2.imagpart: return sum; ◆ 算法与程序的联系与区别 S1.2算法描迷分析 S1.2算法描述分析 输入实例 ■算法分析 一个问题的输入实例是由满足问题陈述中的限制、 并能计算出该问题解的所有输入构成的。 算法效率的度量 。事后统计:利用计算机内部的计时功能 算法描述 缺陷 自然语言、数学语言、伪语言、程序语言等均可 ,必须先运行依据算法编制的程序 本课程以C为主,但不拘泥于细节 时间统计量依赖于计算机的软硬件环境 double start,stop; 算法评价 time (&start); 正确性、可读性、健壮性、 时空性能 main process(n,…月 time(&stop): double runTime stop-start; printf ("%d%dIn",n,runTime ) s1.2算法描迷与分折 81.2算法描述分析 ◆ 算法分析 算法的时间是每语句执行时间的总和 。事前分析估算(时间) 每语句的执行时间=该语句执行次数(频度) 求出该算法的一个时间界限函数 一些影响因素: X该语句执行1次的时间 算法的策略 假定:每语句执行1次的时间为1个时间单位 问题的规模 则:算法的执行时间=Σ各语句频度 书写程序的语言 问题的规模(Size)n 编译器产生的机器代码的质量 机器执行指令的速度 输入量的大小,如 时间复杂度:算法的运行时间,是问题规模的函数
2014/4/7 5 // 类的实现部分 Complex::Complex(double realVal, double imagVal){ realpart = realVal; imagpart= imagVal; } void Complex::assign(Complex& z){ realpart = z.realpart; imagpart= z imagpart; 25 imagpart= z.imagpart; } Complex add(Complex& z1, Complex& z2){ Complex sum(z1); sum.realpart += z2.realpart; sum.imagpart += z2.imagpart; return sum; } §1.2 算法描述 分析 算法 重要性:数据的运算是通过算法描述的 定义:非形式地说,算法是任意一个良定义的计 算过程,它以一个或多个值作为输入,并产生一 个或多个值作为输出。因此,一个算法就是一系 列将输入转换为输出的计算步骤 26 。 5要素 输入、输出、有穷性(有穷步骤,每步时间有限) 确定性(算法只有唯一执行路径)、可行性(所有 操作可通过已经实现的基本运算有限次实现之) 算法与程序的联系与区别 §1.2 算法描述 分析 输入实例 一个问题的输入实例是由满足问题陈述中的限制、 并能计算出该问题解的所有输入构成的。 算法描述 自然语言、数学语言、伪语言、程序语言等均可 27 自然语言、数学语言、伪语言、程序语言等均可 本课程以C为主,但不拘泥于细节 算法评价 正确性、可读性、健壮性、 时空性能 算法分析 算法效率的度量 事后统计:利用计算机内部的计时功能 缺陷 必须先运行依据算法编制的程序 §1.2 算法描述 分析 28 必须先运行依据算法编制的程序 时间统计量依赖于计算机的软硬件环境 double start, stop; time (&start); main process(n, …); time (&stop); double runTime = stop -start; printf ("%d%d\n" , n, runTime ); 事前分析估算(时间) 求出该算法的一个时间界限函数 一些影响因素: 算法的策略 §1.2 算法描述 分析 29 算法的策略 问题的规模 书写程序的语言 编译器产生的机器代码的质量 机器执行指令的速度 §1.2 算法描述与分析 算法分析 算法的时间是每语句执行时间的总和 每语句的执行时间=该语句执行次数(频度) X该语句执行1次的时间 假定:每语句执行1次的时间为1个时间单位 30 假定 每语句执行 次的时间为 则:算法的执行时间=∑各语句频度 问题的规模(Size)n 输入量的大小,如… 时间复杂度:算法的运行时间,是问题规模的函数