《数据结构基础》ppt课件

上传人:xiao****1972 文档编号:73010614 上传时间:2019-01-24 格式:PPT 页数:58 大小:412.81KB
返回 下载 相关 举报
《数据结构基础》ppt课件_第1页
第1页 / 共58页
《数据结构基础》ppt课件_第2页
第2页 / 共58页
《数据结构基础》ppt课件_第3页
第3页 / 共58页
《数据结构基础》ppt课件_第4页
第4页 / 共58页
《数据结构基础》ppt课件_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《《数据结构基础》ppt课件》由会员分享,可在线阅读,更多相关《《数据结构基础》ppt课件(58页珍藏版)》请在金锄头文库上搜索。

1、JYP,1,数据结构基础,教材: 数据结构(C+描述)(金远平编著,清华大学出版社),JYP,2,第1章 基本概念和方法,本章论述学习和研究数据结构所必须的并且将反复出现的基本概念和方法。,3,1.1 数据结构与软件系统,设计解决实际问题的计算机软件系统,首先需要建立被处理对象的数据模型。 数据和世上万物一样,都是具有结构的。人们很自然地用数据结构表示应用领域的被处理对象。例如,树和图。 数据结构由一个数据对象以及该对象中的所有数据元素之间的关系组成。 数据元素本身可以是数据结构,因此,可以构造非常复杂的数据结构。,4,为了模拟实际问题的求解过程和现实对象的行为,还必须提供对数据结构的相应操作

2、。 数据结构的实现是以下一层数据结构表示上一层数据结构,直至以程序设计语言提供的基本数据类型表示的过程。 评价数据结构表示能力的标准主要是它能否方便且有效地实现需要的操作,而实现操作的算法设计及其效率高低也依赖于数据结构表示。 数据结构的定义、表示及其操作的实现相互关联,都是数据结构研究的重要内容。,5,计算机软件系统可看成是通过不同层次的数据结构及其操作实现的。例如:,6,中间层数据结构起着核心作用,称之为建模层。 对数据结构的研究产生了一批通用性强、具有很高实用价值的中间层数据结构,如数组、字符串、集合、线性表、栈、队列、链表、树、图、符号表等。 系统地学习进而掌握数据结构的知识和方法,对

3、于提高设计与开发软件系统尤其是复杂软件系统的能力,无疑是十分重要的。,7,1.2 数据抽象与封装,抽象和封装的概念在日常生活中是普遍存在的,例如,人们常用的手机。 通过数据封装,将一个数据对象的内部结构和实现细节对外屏蔽。 通过数据抽象,将一个数据对象的规格说明与其实现分离,对外提供简洁、清晰的接口。 数据结构多层表示的过程反过来也就是从基础数据结构到应用领域数据结构的不断抽象与封装的过程。,8,用抽象数据类型(ADT)描述数据抽象与封装是一种自然、有效的方法。 数据类型由一个数据对象的集合和一组作用于这些数据对象的操作组成。例如,C+的基本数据类型char、int、float和double等

4、。 抽象数据类型是一个数据类型,该数据类型的组织遵循将数据对象及对这些数据对象的操作的规格说明与这些数据对象的表示、操作的实现相分离的原则。,9,当强调一个数据对象的结构时,使用数据结构的概念。 与数据结构的概念对比,抽象数据类型包含了一个数据结构的集合,还包含了对数据结构的操作。 抽象数据类型成为描述数据结构及其操作的有效方式。 定义ADT的语言本质上不依赖具体的程序设计语言,这里采用C+描述。,10,例1.1 抽象数据类型“圆”的定义为: class Circle / 对象: 几何圆 public: Circle(float r); / 构造函数,创建一个半径为r的对象实例 float C

5、ircumference( ); / 返回该实例的周长 float Area( ); / 返回该实例的面积 ; 该抽象数据类型的名称为Circle,数据对象定义为几何圆,操作包括构造函数、计算周长和面积等。注意:这些定义不依赖于数据对象的具体表示,也没有给出操作实现的过程。,11,数据抽象和封装机制的意义: (1)简化软件开发: 假设一个问题经分析将使用A、B、C三个数据类型和协调代码求解。 (a)四位程序员,可由其中三位程序员各开发一个数据类型,另一位程序员实现协调代码。 (b)一位程序员,数据抽象也可减少其在某一具体时间需要考虑的范围。,12,(2)易于测试和排除错误: 如下图所示,数据抽

6、象明显提高了测试和排除错误的效率。,13,(3)有利于重用: 数据抽象和封装机制使开发人员可以将数据结构及其操作实现为可重用的软件组件。这些组件具有清晰的界面定义,更容易从一个软件系统中提取出来,应用于另一个软件系统。 (4)便于改变数据类型的表示: 由于数据封装,外界不能直接访问数据类型的内部表示。因此,只要操作接口不变,数据类型内部表示和实现的改变不会影响使用该数据类型的其他程序。,14,1.3 算法定义,数据结构的操作实际上是以算法的形式实现的。 定义:算法是一个有限的指令集合,执行这些指令可以完成某一特定任务。一个算法还应当满足以下特性: 输入 零个或多个由外界提供的输入量。 输出 至

7、少产生一个输出量。 确定性 每一指令都有确切的语义,无歧义。 有限性 在执行有限步骤后结束。 有效性 每一条指令都应能经过有限层的表示转化为计算平台的基本指令,即算法的指令必须是可行的。,15,程序和算法不同,程序可以不满足有限性。例 如,一个软件的总控程序在未接受新的任务之前一直处于“等待”循环中。 实现数据结构操作的程序总是可结束的,因此,后面将不再严格区分算法和程序这两个术语。 必须保证指令的有效性,例如,指令“if (哥德巴赫猜想是真)then x = y;”是无效的。 作业:P253,16,1.4 递归算法,直接递归:函数在执行过程中调用本身。 间接递归:函数在执行过程中调用其它函数

8、再经过这些函数调用本身。 表达力:,函数定义 赋值 if-else while,函数定义 赋值 if-else 递归,17,当问题本身是递归定义的,其解法适合用递归描述。 例1.3 阶乘函数的定义是 1 当n=1 n! = n(n-1)! 当n1 用递归方法计算阶乘函数简明扼要,易于理解,如下所示: long Factorial ( long n ) if ( n = = 1 ) return 1; / 终止条件 else return n*Factorial ( n-1); / 递归步骤 ,18,用参数n= 5调用Factorial的过程如下: Factorial (5) = (5* Fac

9、torial (4) = (5* (4* Factorial (3) = (5* (4* (3* Factorial (2) = (5* (4* (3* (2* Factorial (1) = (5* (4* (3* (2* 1) = (5* (4* (3* 2) = (5* (4* 6) = (5* 24) = 120,19,递归算法有四个特性: (1)必须有可最终达到的终止条件,否则程序将陷入无穷循环; (2)子问题在规模上比原问题小,或更接近终止条件; (3)子问题可通过再次递归调用求解或因满足终止条件而直接求解; (4)子问题的解应能组合为整个问题的解。,20,例1.4 全排列生成器:

10、给定一个具有n1个元素的集合,打印该集合的全排列。 分析四个元素(a,b,c,d)的情况,结果可以如下构造: (1) a后接(b,c,d)的全排列 (2) b后接(a,c,d)的全排列 (3) c后接(a,b,d)的全排列 (4) d后接(a,b,c)的全排列 这表明,如果能生成n 1个元素的全排列,就能生成n个元素的全排列。,21,对于只有1个元素的集合,可以直接生成其全排列。于是,全排列生成问题的递归步骤和终止条件可以确定。 求解函数perm: void perm (char *a, const int k,const int n) / n 是数组a的元素个数,生成ak,an-1的全排列

11、int i; if (k = = n-1) / 终止条件,输出排列 for ( i=0; in; i+) cout ai “ ”; / 输出包括前 / 缀,以构成整个问题的解 cout endl; ,22,else / ak,an-1 的排列大于1,递归生成 for ( i = k; i n; i+) char temp = ak; ak = ai; ai = temp; / 交换ak / 和 ai perm(a,k+1,n); / 生成 ak+1,an-1的全排列 temp = ak; ak = ai; ai = temp; / 再次交换 ak 和 / ai , 恢复原顺序 / else结束

12、 / perm结束 通过调用perm(a, 0, n),可以生成n个元素的全排列。,23,用n = 3 和 a02 = (a, b, c)调用perm的示意如下:,24,当算法操作的数据结构是递归定义的时候也适合使用递归。后面将有许多此类的重要例子。 作业:P255,6,25,1.5 性能分析,除了正确性、可用性、可读性和容错性以外,算法的性能是评价算法优劣的重要指标。 空间复杂性:算法开始运行直至结束过程中所需要的最大存储资源开销的一种度量。 时间复杂性:算法开始运行直至结束所需要的执行时间的一种度量。 性能评价分为事前估计和事后测量。 性能分析就是指对算法的空间复杂性和时间复杂性进行事前估

13、计。,26,1.5.1 空间复杂性,程序P的空间需求 S(P) = c + SP(实例特性) 其中,c是常数,SP(实例特性) 是实例特性的函数。 分析的重点是SP(实例特性)。 对于一个给定问题,首先要确定其实例特性,才可能分析求解算法的空间要求。 确定实例特性与具体问题密切相关。,27,例如: 1 float rsum (float *a, const int n) 2 if (n = 0 ) return 0; / 当n = 1时返回a0 3 else return rsum( a, n1) + an1; 4 rsum是一个递归求和算法,其实例特性是n。每次递归调用需在栈顶保存n的值、a

14、的值、返回值和返回地址,共需4个存储单元。 由于算法的递归深度是n+1,故所需栈空间是4(n+1),即Srsum(n) = 4(n+1)。,28,1.5.2 时间复杂性,算法P的运行时间 T(P) = c + TP(实例特性) 时间复杂性分析的目的在于揭示算法的运行时间随着其实例特性变化的规律。 将一组与实例特性无关的操作抽象为一个程序步,从而有效地简化性能分析的过程。 程序步:算法中的一个在语法和语义上有意义的指令序列,而且该序列执行时间与算法的实例特性无关。,29,各类C+语句的程序步数详见教科书。 可以通过列出各个语句的程序步数确定整个程序的程序步数。 例1.5 程序sum: 1 flo

15、at sum (float *a, const int n) 2 float s = 0; 3 for (int i = 0; i n; i+) 4 s += ai; 5 return s; 6 ,30,其中各语句的程序步数如下所示:,其总程序步数是2n+3。,31,例1.6 设rsum(a, n)的程序步数为Trsum(n),其各语句的程序步数如下:,可见,当n = 0时Trsum(0) = 2;当n 0时Trsum(n) = 2+ Trsum(n-1)。,32,通过反复代入可得: Trsum(n) = 2+ Trsum(n-1) = 2+2+Trsum(n-2) = 2*2+ Trsum(

16、n-2) = 2+2+2+ Trsum(n-3) = 2*3+ Trsum(n-3) = 2n+ Trsum(0) = 2n+2 所以rsum的程序步数为2n+2。,33,许多程序的实例特性并不仅仅依赖于实例规模n,还可能与实例内容密切相关。 例如,二分查找的程序步数,不仅与元素个数n,而且与集合内容有关。 有时需要按最好、最坏和平均三种情况分析算法的时间复杂性。,34,1.5.3 O表示法,程序步本身就不是一个准确的概念,而是一个抽象的概念。 再作一次抽象,从由多种因素构成的时间复杂性中抽取出其主要因素,将常数抽象为1,有利于抓住主要矛盾,简化复杂性分析。 假设函数f和g是非负函数。 定义:f(n) = O(g(n) 当且仅

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号