数据结构的基本概念.ppt

上传人:za****8 文档编号:16590809 上传时间:2020-10-16 格式:PPT 页数:52 大小:314.01KB
返回 下载 相关 举报
数据结构的基本概念.ppt_第1页
第1页 / 共52页
数据结构的基本概念.ppt_第2页
第2页 / 共52页
数据结构的基本概念.ppt_第3页
第3页 / 共52页
点击查看更多>>
资源描述
1 前言 数据结构是计算机系的专业基础课,它不但是 计算机学科的理论基础之一,也是软件开发的 必备基础。因此,无论是从事计算机行业,还 是希望在计算机方面继续深造,都应该学好这 门课程。 2 第 1章 数据结构的基本概念 抽象数据类型和算法描述 抽象和实现 术语和概念 抽象数据类型 算法与伪码 程序结构化与设计风格 程序分析的方法 时间复杂性分析 渐进式表示法 递归式的复杂性计算 3 1.1 抽象和实现 什么是抽象和实现? 抽象 是信息隐蔽的方法,用这种方法将数据表 示或处理过程中的细节对不需要(或不想)了 解的人隐藏起来。 实现 是已屏蔽掉的繁琐的细节。 4 1.1.1数和变量 平时使用的数据类型中哪些是抽象出来的? 整型、实型、字符型、枚举型等。 抽象出来的数据类型是怎样实现处理过程的? 各种计算机语言的编译程序有它们各自所抽象出来的数 据类型与计算机自身的数值进制有相应的转换规则,也 能够对其进行存储和计算。 变量是抽象的吗?其作用是什么? 变量是一种抽象。它的作用是减少程序设计人员对内存 细节的考虑,而将主要精力用于程序算法的编写。 5 1.1.2两维数组 计算机存储是按一维方式还是二维方式? 计算机存储区是按字节或字的一维或线性序列 方式进行编址。 计算机是如何解释带有二维数组的语句的? 通过编译程序。 二维数组的应用 矩阵 6 1.1.3过程和抽象 过程是什么? 过程是程序设计的基本工具和方法,它将操作符 和操作对象的概念一般化,使程序员不受程序设 计语言提供的基本数据类型和操作符的约束,可 以利用过程自由地定义操作数和操作方法。 过程的优点 利用过程的优点在于信息的隐蔽和模块化,它实 现了对算法的若干部分的封装。 抽象都是程序设计语言提供的吗? 过程是一种抽象吗? 7 1.2 术语和概念 1.2.1数据、数据元素和数据对象 数据 就是指所有能被输入到计算机中,且被计算机处理的符号 的集合,它也是计算机操作的对象的总称。是计算机处理的信 息的某种特定的符号表示形式。 注意:数据的范围是随着计算机的发展而不断扩大的。 数据元素 是数据中的一个个体,是数据结构中讨论的基本单位。 一个数据元素还可以由若干个数据项组成。数据项是具有独立 含义的最小标识单位。如整数这个集合中, 10这个数就可称是 一个数据元素 .又比如在一个数据库表 (关系式数据库 )中,一个 记录可称为一条数据,每一个字段可称为一个数据元素,而每 个字段的组成部分可称为一个 数据项 (例如出生日期中的年、月、 日 )。 数据对象 是性质相同的数据元素的集合,是数据的一个子集。 8 1.2.2 数据类型 在用高级语言编写的程序中,必须对程序中出 现的每个变量、常量和表达式,明确说明它们 所属的数据类型。 数据类型是程序设计语言中对于给定变量的所 有可能取值的集合。 数据类型是一个值的集合和定义在此集合上的 一组操作的总称。 每一个对象仅由单值构成的类型称为标量类型 或原子类型。每一个对象可由一组值构成的类 型称为组合类型或结构类型(有时也称为 数据 结构 ) 9 1.2.3 抽象数据类型 抽象数据类型 (abstract data type简称 ADT)是 一种数据类型及在这个类型上定义的一组合法 的操作。 程序设计语言提供的 ADT定义工具 Ada提供包、 c+提供类 使用 ADT的作用 减少程序的复杂性 10 1.2.4 数据结构 (带结构的数据元素的集合 ) 定义: 数据结构是以某种方式联系在一起的数据元素的集合。 数据结构研究的内容 数据结构研究的是数据元素之间抽象化的相互关系及这 种关系在计算机中的存储表示,对每种结构定义各自的 运算,设计出相应的算法,并用某种语言实现该算法。 数据结构包含的内容: 逻辑结构和物理结构,甚至包括对数据的操作。 数据的 逻辑结构 是指各数据元素之间的逻辑关系,是用 户按使用需要建立起来的,呈现在用户面前的结构形式。 数据的 物理结构 又称为数据的存储结构,是指数据在计 算机内的表示方法,即存储形式。 11 比如一个表 (数据库 ),我们就称它为一个数据结构, 它由很多记录 (数据元素 )组成,每个元素又包括很多 字段 (数据项 )组成。那么这张表的 逻辑结构 是怎么样 的呢 ? 对于这个表中的任一个记录 (结点 ),它只有一 个直接前趋,只有一个直接后继 (前趋后继就是前相邻 后相邻的意思 ),整个表只有一个开始结点和一个终端 结点,那我们知道了这些关系就能明白这个表的逻辑 结构了。 常见的逻辑结构有:线性结构、树形结构、图状结构 和集合结构。 12 存储结构 是逻辑结构在存储器中的映像。 数据元素的映像方法: 用二进制位 (bit)的位串表示数据元素。 (320)10=(501)8=(101000001)2 (A)=(101)8=(001000001)2 关系的映像方法 (表示 的方法 ) 顺序映像 :以存储位置的相邻表示后继关系。 Y的存储位置和 X的存储位置之间相差一个常量 C,而 C是一 个隐含值(与数据在内存中占据的宽度有关),整个存储 结构中只含数据元素本身的信息。 13 链式映像 :以附加信息 (指针 )表示后继关系 需要一个和 X在一起的附加信息指示 Y的存储位置。 在不同的存储环境中,存储结构可有不同的描述方 法。 当用高级程序设计语言进行编程时,通常可用高级 编程语言提供的数据类型描述之。 14 例如:以三个带有次序关系的整数表示一个长 整数时,可利用 C语言中提供的整数数组类型, 定义长整数为: typedef int Long_int3 15 对 数据的运算 :比如一张表格,我们需要进行 查找,增加,修改,删除记录等工作,而怎么 样才能进行这样的操作呢 ? 这也就是数据的运 算,它不仅仅是加减乘除这些算术运算了,在 数据结构中,这些运算常常涉及算法问题。 16 1.3 抽象数据类型 1.3.1抽象数据类型的描述 研究抽象数据类型的原因? 人们认识到在问题的描述和程序的实现之间存 在着一个可适当定义的中间领域,这个中间领 域比问题的描述具体些,但比最终的程序抽象 些。 数据结构的类型:线性、层次、网状 抽象数据类型的组成部分:元素 (Elements)、 结构 (Structure)和操作 (Operation) 17 1.3.2抽象数据类型的说明 元素 结构 操作 ADT的说明基本上是功能性的说明,对具体的 实现并不作过多的约束。在具体现实时,完成 任务的算法、数据类型、数据结构、程序的逻 辑组织甚至采用哪种程序设计语言都是可自由 选择的。 18 ADT的主要目的:对用户隐蔽所有的表示方法、 算法的详细细节、实现操作的具体代码及其他 所有不必要的细节,这些细节被局限于具体实 现的模块内部,从而实现了信息的隐蔽。 ADT的重要优点:简单性。 抽象的目的:将数据的本质特征、它们的结构 及操作同它们的非本质的具体表示及实现细节 区别开来,从而得到了简化。 19 1.3.3抽象数据类型的表示 为扑克牌设计抽象数据类型,你会怎样设计? 使用枚举类型 使用整数型 使用位向量表示法 程序设计的主要目标是产生一个正确的程序, 并能尽量避免错误的输入对程序的结果造成不 良的影响,但是还有其他第二位重要的目标。 好的程序不仅要运行正确,而且要具有通用性、 模块化和信息隐蔽性。 20 1.3.4实现的独立性 由于在 ADT的说明中,只指明了其功能而未指 明要采用的何种方法,因此实现的独立性是显 而易见的。 具体的实现只要根据 ADT的数据类型及说明的 各个抽象操作和 ADT的表示,用某种程序设计 语言写出一个个独立的过程和函数的具体语句 来即可。 21 1.3.5一个复数抽象数据类型 元素介绍 复数的实部 (rpart)和虚部 (ipart) 结构说明 复数的元素之间不存在任何结构 操作部分 复数的生成 (Create),两个复数的加 (Add)、减 (Sub)、乘法 (Product)运算 22 编程练习: 试分别用结构和类两种方式实现复数抽象数据 类型的定义。 设两个复数 c1=x1+iy1, c2=x2+iy2 和 sum=(x1+y1)+i(y1+y2) 差 difference=(x1-x2)+i(y1-y2) 积 product=(x1*x2-y1*y2)+i(x1*y2+x2*y1) 23 1.4算法分析 算法 +数据结构 =程序 (N.沃恩 )这个公式的含义是什 么? 1.4.1算法的概念 算法是能在计算机上经过有限的时间内完成,毫不 含糊的有限的指令序列。 程序设计:为计算机处理问题编制的一组指令集。 计算机对某类问题进行某种处理,包含了两方面的 问题:一个是怎样进行处理;另一个是对处理的信 息怎样表示。 算法:处理问题的策略(怎样处理问题) 数据结构:问题的数学模型(处理的问题怎样表示) 24 例如 :数值计算的程序问题 结构静力分析计算 数据模型:线性代数方程组 全球天气预报 数据模型:环流模型方程 25 非数值计算的程序设计问题 例一:求一组 (n个 )整数中的最大值。 算法:基本操作是比较两个数的大小 模型:存储这组整数所需的数据类型。 26 例二:计算机对弈 算法:对弈的规则和策略 模型:棋盘、棋子的表示 27 例三:医院的数据库管理 算法:需要管理的项目?如何管理?界面? 模型:各种表格和数据库 28 综合各种程序设计问题,抽去它具体的物理含 义,就可以得到几类基本的数学模型,比如和 数值计算相关的数学模型就有线性代数方程、 非线性代数方程、微分方程等。它们的数值解 问题,也就是计算求解的问题,就是计算数学 要解决的问题。而类似的非数值计算问题,它 的数学模型的表示和求解的方法就是数据结构 研究的内容。 概括的说: 数据结构描述现实世界实体的数学模型(非数 值计算)及其上的操作在计算机中的表示和实 现。 29 算法与代码 算法是为了解决某类问题而规定的一个有限长 的操作序列。 简单的说,算法是对求解某一问题的描述。 算法都必须满足下列几个条件: 有穷性:对于任意一组合法输入值,在执行有 穷步骤之后一定能结束,即:算法中的每个步 骤都能在有限时间内完成。 30 确定性:对于每种情况下所应执行的操作,在 算法中都有确切的规定,使算法的执行者或阅 读者都能明确其含义及如何执行。并且在任何 条件下,算法都只有一条执行路径 (对同样的输 入值,不管在什么条件下,重复执行多遍,都 能够得到相同的结果 )。 可行性:算法中的所有操作都必须足够基本,都 可以通过已经实现的基本操作运算有限次实现之 。 例如:将 x和 y两个正整数的最大公因子赋值给 z, 由于求最大公因子本身就是一个算法,因此这个 操作不是基本操作。 例如:将变量 x的值增加,看似简单,但到底给 x 增加多少却并不明确,因此它也不是基本操作。 31 有输入:作为算法加工对象的量值,通常体现为 算法中的一组变量。有些输入量需要在算法执行 过程中输入,而有的算法表面上可以没有输入, 实际已被嵌入算法之中。 例如求 100以内的素数。数据的范围是从 1到 100, 此时的数据就没有从键盘输入而是嵌入到了算法 之中。 有输出:它是一组与输入有确定关系的量值,是 算法进行信息加工后得到的结果,这种确定关系 即为算法的功能。 32 算法设计的原则 1.正确性 程序中不含语法错误 程序对于几组输入数据能够得出满足要求的结 果 程序对于精心选择的、典型、苛刻且带有刁难 性的几组输入数据能够得出满足要求的结果 程序对一切合法的输入数据都能得出满足要求 的结果 33 2.可读性 算法主要是为了人的阅读与交流,其次才是为 计算机执行。因此算法易于人的理解,另一方 面,晦涩难读的程序易于隐藏较多错误而难以 调试。 3.健壮性 当输入的数据合法时,算法应当恰当地作出反 应或进行相应的处理,而不是莫名其妙地输出 结果。并且处理出错的方法不应时中断程序的 执行,而应是返回一个表示错误或错误性质的 值,以便在更高的抽象层次上进行处理。 34 4.高效率与低存储量需求 通常,效率指的是算法执行的时间;存储量指 的是算法执行过程中所需的最大存储空间。两 者都与问题的规模有关。 35 用来写算法的方式有好几种,一般而言,我们可以 分为下列 4种方式: 条列式的步骤: 以条列式的步骤来描述解决问题的方法。 流程图: 以图形符号来描述解决问题的方法。仅适用于小 问题,不过现在已很少用。 伪码: 以夹杂程序语法和自然语言 (如:中文、英文 )的 形式来描述解决问题的方法。 程序语句: 直接以程序语法来描述解决问题的方法。 36 程序结构化与设计风格 注释 变量命名 变量名要遵守以下规则: (1)不能是 C+保留字。 (2)第一个字符必须是字母或下划线。 (3)变量名中除了使用 26个英文大小写字母和数字 外,只能使用下划线。 (4)一般不要超过 31个字符。 (5)变量名不要与 C+中的库函数名、类名和对象名 相同。 程序缩排 段落 37 1.4.2算法的时间复杂性 算法衡量的方法和准则 一个程序结构的好坏,关键通常在于该程序是 否能以最短的时间及最小的空间来运行出结果。 但是“时间”与“空间”常常是“鱼与熊掌” 无法兼得,如果希望以最短的时间来完成该程 序,则常常需要运用更多的存储空间,来换取 最短的执行时间;如果希望以最小的存储空间 来完成该程序,相反的也必须用较久的时间, 才能完成该程序。 38 通常有两种衡量算法的方法: 1.事后统计法 缺点: 必须执行程序 其它因素掩盖算法本质 2.事前统计法(推荐) 39 和算法执行时间相关的因素 1.算法选用的策略 2.问题的规模 3.编写程序的语言(汇编语言的速度比 C语言快 ) 4.编译程序产生的机器代码的质量 5.计算机执行指令的速度 其中后 3条与计算机本身的运算速度有关,与算法 无关。因此我们在设计算法的时候不考虑后 3条。 一个特定算法的“运行工作量”的大小,只依赖于 问题的规模 (通常用整数 n表示 ),或者说,它是问 题规模的函数。 40 定义 :如某算法执行时间 T(n)是 O(f(n),意思 是说存在常数 c和 n0,使得对于一切 nn0, T(n)cf(n)都成立。如果一个程序的时间复杂 性是 O(f(n),就说该程序的运行时间增加一个 上界为 f(n),或说 T(n)是 f(n)的大 O函数。 假如,随着问题规模 n的增长,算法执行时间 的增长率与 f(n)相同,则可记作: T(n)=O(f(n) 称 T(n)为算法的 (渐近 )时间复杂性。 其中, O()表示函数 T(n)与 f(n)成正比,或者说 它们是一个数量级的。 41 算法的时间复杂性 我们将每个程序所花费的运行次数称为该程序的 “时间复杂性 (Time complexity)”,运用时间复杂 性的概念,我们即可判断该程序的执行效率是否 良好,也方便对两个程序进行分析与比较。 从算法中选取一种对于所研究的问题来说是基本 操作的原操作,以该基本操作在在算法中重复执 行的次数作为算法运行时间的衡量标准。 最佳状况( Best-Case),记做: B(n) 最坏状况 (Worst-Case) ,记做: W(n) 一般状况的时间复杂性,记做: E(n) 平均状况的时间复杂性,记做: A(n) 42 1.4.3大 O运算规则 规则 1: 对于任何的常数 k和任何的函数 f, kf(n)=O(f(n) 规则 2 If f(n)=O(g(n) and g(n)=O(h(n) Then f(n)=O(h(n) 规则 3 f(n)+g(n)=O(maxf(n),g(n) 规则 4 If f1(n)=O(g1(n) and f2(n)=O(g2(n) Then f1(n)*f2(n)=O(g1(n)*g2(n) 43 1.4.4 事件复杂性分析 如何估算算法的时间复杂性 算法 =控制结构 +若干原操作 这里所说的原操作本来应该是计算机的基本指令, 但当我们用高级语言来描述算法的时候,也可以 把固有数据类型的操作看成是原操作。 算法的执行时间 = 原操作的执行次数 *原操作的执行时间 由于原操作的执行时间对于不同的算法来说都是 一个定值。因此,算法的执行时间与原操作执行 次数之和成正比。 44 从算法中选取一种对于所研究的问题来说是基 本操作(在所有原操作中起到决定性的作用) 的原操作,以该基本操作在算法中重复执行的 次数作为算法运行时间的衡量标准。 45 例一:矩阵相乘 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; 原操作:赋值、加法、乘法 基本操作:乘法操作 时间复杂性 O(N3) 46 例 2:选择排序(时间复杂性是问题规模的函数,与输入数据无关) Void select_sort(int a,int n) /将 a中整数序列重新排列成从小至大有序的整数序列 for (i=0;in-1; i+) j=i; for (k=i+1;kn;k+) If akaj j=k; If (j!=i) Ajai; 基本操作:比较数据元素 当 I=0时比较的次数为 N-1次,当 I=N-2时比较的次数为 1次,即总次数为 (N-1)+(N-2)+1= N*(N -1)/2 也就是说比较次数与 N2/2成正比,即与 N2成正比 时间复杂性: O(N2) 47 例 3:冒泡排序 (时间复杂性既是问题规模的函数,又与输入数据有关) Void bubble_sort(int a,int n) /将 a中整数序列重新排列成从小至大有序的整数序列 for (i=n-1,change=TRUE;i1 -i) change=FALSE; for (j=0;jaj+1) ajaj+1; change=TRUE; 基本操作:赋值操作 (交换需要三次赋值来完成 ) 当 i=n-1时交换的最大次数为 N-1次,当 I=2时交换的最大次数为 2次,及总 次数为 (N-1)+(N-2)+2= N*(N -1)/2-1 时间复杂性: O(n2) 注意:这里的时间复杂性是以排序的最坏情况来计算的。 48 1.4.5再论增长率的决定作用 在一台计算机上所能解决的问题大小主要取决 于程序运行时间的增长率,这就是要尽可能降 低算法时间复杂性的原因。 常见增长率的比较: lgnnnlgnn2n32n 49 1.4.6算法的空间复杂性 算法的空间复杂度 S(n)=O(g(n) 表示随着问题规模 n的增长,算法运行所需存 储量的增长率与 g(n)相同。 50 算法的存储量包括 1.输入数据所占空间 2.程序本身所占空间 3.辅助变量所占空间 比较算法时可以不考虑程序本身所占的空间。 若输入数据所占空间只取决于问题本身,而与算法无 关,则只需分析除输入和程序之外的辅助变量所占额 外空间。 若所需额外空间相对于输入数据量来说是常数,则称 此算法为原地工作。 若所需存储量依赖于特定的输入,则通常按最坏情况 考虑。 51 1.5 递归式的复杂度计算 参见教材 P16-17 52 本章学习要点 熟悉各名词、术语的含义,掌握基本概念 理解算法五个要素的确切含义 掌握计算语句频度和估算算法时间复杂度的方 法。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!