450 likes | 597 Views
数据结构 Data Structures. 任课教师: 胡军 Email: hujun@cqupt.edu.cn 办公电话:6246 1684 办公地点:信科190 1 -> Please let me know if you have any questions. 数据结构. 教材 数据结构 ( C 语言版) 严蔚敏 吴伟民 清华大学出版社 参考书 1 数据结构题集 ( C 语言版) 严蔚敏 吴伟民 清华大学出版社
E N D
数据结构Data Structures 任课教师: 胡军 Email: hujun@cqupt.edu.cn 办公电话:62461684 办公地点:信科1901-> Please let me know if you have any questions.
数据结构 • 教材 数据结构 ( C语言版) 严蔚敏 吴伟民 清华大学出版社 参考书 1 数据结构题集 ( C语言版) 严蔚敏 吴伟民 清华大学出版社 2 R. Kruse and A. Ryba Data Structures and Program Design In C++, Higher Education Press, 2001. 3 Sartaj Sahni. Data Structures, Algorithms, and Applications In C++, China Machine Press,1999。
教学内容 第1章 绪论 第2章 线性表 第3章 栈和队列 第4章 串 第5章 数组和广义表 第6章 树和二叉树 第7章 图 第9章 查找 第10章 排序
课程特点 • 十分重要,为多门后续课程打好基础。 • 难度大 综合性强 必须下苦功学习 • 目标是:不再下手难,有信心、有能力编写(设计)较大的程序、有用的程序,好的程序
课程考核 • 成绩评定方法 百分制 • 闭卷考试 70% • 提问、讨论 • 作业,开发、实践性成果、实验 • 考勤
绪 论 • 1.1 什么是数据结构 • 1.2 基本概念和术语 • 1.3 抽象数据类型的表示和实现 • 1.4 算法和算法分析
数据结构 + 算 法 实际问题中元素的数学抽象 1.1 问题引入 实际问题 程序 数学模型 计算机 建立和解决数学模型的方法
我们怎样 解决问题? 步骤:建立数学模型和设计算法 建立数学模型过程:分析问题、提取操作对象、找出对象间关系,对此用数学语言加以描述。 算法设计:利用建立的数学模型,根据具体问题,设计出解决问题的方法。
问题分类 • 从数学模型上分: • 数值问题(数学方程) • 非数值问题 • 集合 • 线性表 • 树 • 图
例1 图书检索 线性 图书馆书目检索(各级编码建索引)
人机对弈图 O O X X X X O O 树 (A) (B)
AB AC AD BA BC BD DA DB DC EA EB EC ED 多路口交通灯的管理问题 图 C D B E A
田径赛的时间安排问题(无向图的着色问题) : 设有六个比赛项目,规定每个选手至多可参加三个项目,有五人报名参加比赛(如下表所示)设计比赛日程表,使得在尽可能短的时间内完成比赛。
(1)设用如下六个不同的代号代表不同的项目:(1)设用如下六个不同的代号代表不同的项目: • 跳高 跳远 标枪 铅球 100米 200米 • A B C D E F • (2)用顶点代表比赛项目 • 不能同时进行比赛的项目之间连上一条边。 • (3)某选手比赛的项目必定有边相连(不能同时比赛)。
A B F E C D • 只需安排四个单位时间进行比赛
地位: • “数据结构”在计算机科学中是一门综合性的专业基础课。 • 数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。 • 数据结构这一门课的内容不仅是编写有价值的程序(特别是非数值性程序设计)的支撑,而且是设计和实现一般应用软件、系统软件(如:编译程序、操作系统、数据库系统等)的重要基础。
1.2基本概念和术语 数据:信息在计算机中的表现形式 数据是信息的载体,是描述客观事物的数、字符、以及所有能输入到计算机中,被计算机程序识别和处理的符号的集合。 • 数值性数据 • 非数值性数据 数据元素:数据基本单位,通常作为一个整体来考虑,如学生信息等,含数据项等。
集合 树1:m 线性结构 1:1 图m:m • 数据对象:数据的子集。具有相同性质的数据成员(数据元素)的集合。 整数数据对象 N = { 0, 1, 2, … } 数据结构:相互之间存在一种或多种关系的数据元素的集合。其中关系称结构。 结构有: 关系种类?
数据结构形式定义: 数据结构是一个二元组:记为: Data_Structure = {D, S} 其中,D是数据元素的有限集,S是D上关系的有限集。 例:复数 Complex=(C,R) C={c1,c2},c1,c2为两个实数 R={P}, P是定义在C上的一种关系(有序偶): {<c1,c2>}
数据结构依据视点的不同,分为数据逻辑结构和物理结构:数据结构依据视点的不同,分为数据逻辑结构和物理结构: • 逻辑结构:从解决问题的需要出发,为实现必要的功能所建立的数据结构,它属于用户的视图,是面向对象的。 • 物理结构:指数据该如何在计算机中存放,是数据逻辑结构的物理存储方式,是属于具体实现的视图,是面向计算机的。 • 二者关系:物理结构是逻辑数据的存储映象 任何一个算法的设计取决于选定的数据(逻辑)结构, 而算法的实现依赖于采用的存储结构
逻辑结构 • 数据元素之间的逻辑关系称为数据的逻辑结构。 • 在例中所示的表格数据中,各结点之间在逻辑上有一种线性关系,它指出了各个结点在表中的排列顺序。根据这种线性关系,可以看出表中第一本书是什么书,第二本书是什么书,等等。 存储结构 • 数据在计算机中的存储表示称为数据的存储结构。 • 在上例中所示的表格数据中,数据在计算机中可以有多种存储表示,例如,可以表示成数组,存放在内存中;也可以表示成文件,存放在磁盘上,等等。
数据结构的分类 按照逻辑结构的不同分为: 集合、线性结构、树状结构、网状结构 按照物理结构的不同分为: 顺序存储结构:利用在存储器中的物理关系来表示逻辑关系。 链式存储结构:用在存储器中附加指针的方式来表示逻辑关系。
数据类型和抽象数据类型 数据类型: 值的集合+该集合上定义的一组操作 C语言中的数据类型(原子类型和结构类型) char int float double void 字符型 整型 浮点型 双精度型 无值 基于基本数据类型的构造组合类型:数组型、构造型、文件型
数据类型 • 数据类型是指程序设计语言中各变量可取的数据种类。数据类型是高级程序设计语言中的一个基本概念,它和数据结构的概念密切相关。 • 一方面,在程序设计语言中,每一个数据都属于某种数据类型。类型明显或隐含地规定了数据的取值范围、存储方式以及允许进行的运算。可以认为,数据类型是在程序设计中已经实现了的数据结构。 • 另一方面,在程序设计过程中,当需要引入某种新的数据结构时,总是借助编程语言所提供的数据类型来描述数据的存储结构。
抽象数据类型 抽象数据类型ADT: 数据结构+定义在此结构上的一组操作 (取决于一组逻辑特性,与其在计算机内部表示和实现无关)。 数据类型与抽象数据类型二者实质上是一个概念 例“整数”
根据值的不同特性: • 原子类型(Atomic Data Type) • 固定聚合类型(Fixed-aggregate Data Type) • 可变聚合类型(Variable-Aggregate Data Type) • 多形数据类型(Polymorphic data Type) 一个含抽象数据类型的软件模块通常包含:定义、表示、实现、
一个含抽象数据类型的软件模块通常包含:定义、表示、实现、一个含抽象数据类型的软件模块通常包含:定义、表示、实现、 • 抽象数据类型定义: ADT 抽象数据类型名{ 数据对象:数据对象定义 数据关系:数据关系定义 基本操作:基本操作定义 } ADT 抽象数据类型名 三元组表示 (D,S,P) D: 数据,S:D上的关系,P:D上基本操作
例 • 例如 ADT 成绩表 { D = {d1, … , dn}//n个学生的成绩 S = {<di, di+1> | di > di+1} P: Input(…); Insert(…); Delete(…); Search(…); } ADT 成绩表;
1.3 抽象数据类型的表示和实现 可以通过固有数据类型表示和实现,由此利用类C 类C语言描述:P9-13 typedef 数据类型定义 ElemType数据元素类型 Status 函数结果状态的整数描述 几组特殊的赋值形式:交换赋值, 数组赋值,条件赋值 三种结束语句 return, break, exit 与运算&&, 或运算|| 形参中T为值参,值不可变, &T为引用参数,值可变。
内存的动态分配与释放 指针变量= new 数据类型 delete 指针变量 函数结果主要状态代码: TRUE, OK=1 FALSE, ERROR=0 OVERFLOW = -2
1.4算法和算法分析 • 算法定义:一个有穷的指令集,这些指令为解决某一特定任务规定了一个运算序列 • 特性: • 输入有0个或多个输入 • 输出 有一个或多个输出(处理结果) • 确定性 每步定义都是确切、无歧义的 • 有穷性 算法应在执行有穷步后结束 • 可行性 每一条运算应可通过已经实现的基本运 算执行有限次来实现 算法的描述:c,c++,或类语言
算法和算法分析 • 算法设计的要求 • 正确性:无编辑、编译错误,逻辑正确 • 可读性:注释齐备、风格良好 • 健壮性:具有错误识别和报告功能 • 高效低耗:速度快,所需系统资源少 时间复杂度和空间复杂度是一对矛盾,可以相互转化
算法效率的度量 • 事后统计的方法 • 事前分析估算的方法 • 时间复杂度T(n):算法中基本操作的重复执行次数 • 考察算法最坏情况下的时间复杂度 • 只计阶数,如多项式阶O(nk),指数阶O(kn)
算法和算法分析 • 算法的时间复杂度: • 一个算法由控制结构和原操作构成,我们用对所研究的问题来说是基本操作的原操作的重复执行次数作为算法时间复杂度的量度。
算法分析 • {++x;s=0;} O(1) • for(i=1; i <=n;++ i) {++x;s+=x;} O(n) • for(i =1; i <=n;++ i) for(j=1;j<=n;++j) {++x;s+=x;} O(n2)
for (i=1;i<n;i++) • { y=y+1; • for (j=0; j<=(2*n); j++) • x++; } • 分析:语句的频度指的是该语句重复执行的次数。一个算法中所有语句的频度之和构成了该算法的运行时间。 • 语句1的频度是:n-1 • 语句2的频度是: • 则该程序段的时间复杂度: • T(n)= /* 1 * / /* 2 * /
分析以下程序段的时间复杂度 i=1; while (i<=n) i=i*2 语句1的频度是:1 设语句2的频度是f(n),则有: 即 ,取最大值 则该程序段的时间复杂度为: /* 1 * / /* 2 * /
for (i=1; i<=n; ++i) • for (j=1; j<=n; ++j) { • c[i][j] = 0; • for (k=1; k<=n; ++k) • c[i][j] += a[j][k] * b[k][j]; • } • 时间复杂度T(n) = O(n3) 算法分析 • for(i=2;i<=n;++i) • for(j=2;j<=i-1;++j) • {++x;a[i,j]=x;} 分析:1+2+3+…+n-2=(1+n-2) ×(n-2)/2 =(n-1)(n-2)/2 =n2-3n+2 ∴时间复杂度为O(n2)
复杂度的性质 常见关系:
时间复杂度的运算 • 加法规则 针对并列程序段 T(n, m) = T1 (n) + T2 (m) = O(max (f (n), g (m)))
乘法规则 针对嵌套程序段 T (n, m) = T1 (n) * T2 (m) = O(f (n)*g (m))
算法的空间复杂度 • 算法存储空间需求的度量 • 空间复杂度S(f(n)) • n为问题规模 • f(n)不是指算法中指令、常数、变量和输入数据所占内存的量,而是指为了对数据进行操作而设置的工作单元的内存量。 • 考察最坏情况下的空间占用量
算法和算法分析 • 如何衡量一个正确算法的好坏? • 衡量的三个尺度: • 运行所花费的时间(算法的时间特性) • 所占用存储空间的大小(算法的空间特性) • 其他(可读性、易调性、健壮性等) • 时间和空间特性的巨大改进源于更好的数据结构或算法。
习题一 • 1 简述下列概念:数据、数据元素、数据类型、数据结构、逻辑结构、存储结构。