660 likes | 817 Views
数据结构. 课程名称:数据结构 预修课程: C 语言, 高等数学 教材:1.《数据结构》( C 语言版)清华大学出版社 2.《数据结构题集》( C 语言版)清华大学出 版社 教师:吴志芳. 关于习题与实验题. 教材中习题放在每章结束,但学生在每周都应该完成与上课内容相应的部分小题 有精力的同学应该思考《数据结构题集》中未列为必做的练习,这会有助于理解课程内容 习题包括理论习题和上机实验题 实验题要求用 C 语言编写,并在计算机上调试通过. 参考书目 1. 数据结构 - 使用 C 语言 朱战力编著 西安交通大学出版社 2. 数据结构与算法
E N D
数据结构 课程名称:数据结构 预修课程: C语言, 高等数学 教材:1.《数据结构》(C语言版)清华大学出版社 2.《数据结构题集》(C语言版)清华大学出 版社 教师:吴志芳
关于习题与实验题 • 教材中习题放在每章结束,但学生在每周都应该完成与上课内容相应的部分小题 • 有精力的同学应该思考《数据结构题集》中未列为必做的练习,这会有助于理解课程内容 • 习题包括理论习题和上机实验题 • 实验题要求用C语言编写,并在计算机上调试通过
参考书目 1.数据结构 -使用C语言 朱战力编著 西安交通大学出版社 2.数据结构与算法 许卓群等编著 高等教育出版社 3.数据结构与算法 -C++版 Adam Drozdek著 陈曙晖 译 清华大学出版社
第一章绪论 • 1.1 什么是数据结构 • 1.2 基本概念和术语 • 1.3 抽象数据类型的表示与实现 • 1.4 算法和算法分析
1.1 什么是数据结构 • 计算机解决问题的步骤 • 实际问题 --- 数学模型---算法---程序--- 结果 • 工程师 数学家 程序员 • 计算机的用途 • 科学计算(数值运算): 解方程(组), 函数求值, 概率统计等 • 非数值运算: 字符, 表格, 图象, 声音等
原始数据 结果数据 程序 计算机的用途---数值运算 • 水库大坝的应力计算 • 预报人口增长 • 天气预报
计算机的用途---数值问题例已知:游泳池的长len和宽wide,求面积area计算机的用途---数值问题例已知:游泳池的长len和宽wide,求面积area ◆建模型:问题涉及的对象:游泳池的长len 宽wide,面积area;对象之间的关系:area=lenwide ◆设计 求解问题的方法 ◆编程 main ( ) { int len, wide ,area ;scanf (“%d %d%\n”, &l,&w);area=len*wide ;printf (“area=%d”,area); }
计算机的用途---非数值运算 • 书目检索系统
树 …….. …….. …... …... …... …... • 人机对奕问题
图 C D AB AC AD B BA BC BD E DA DB DC A EA EB EC ED • 多叉路口交通灯管理问题 • 有连线的节点用不同的颜色标记, 表示不能同时通行. • 要求使用的颜色数尽可能少, 以使减少等待时间. • 图论中的四色问题.
田径赛的时间安排问题 田径赛的时间安排问题(无向图的着色问题) 设有六个比赛项目,规定每个选手至多可参加三个项目,有五人报名参加比赛(如下表所示)设计比赛日程表,使得在尽可能短的时间内完成比赛。
田径赛的时间安排问题 (1)设用如下六个不同的代号代表不同的 项目: • 跳高 跳远 标枪 铅球 100米 200米 • A B C D E F • (2)用顶点代表比赛项目 • 不能同时进行比赛的项目之间连上一条边。 • (3)某选手比赛的项目必定有边相连(不能同时比赛)。
只需安排四个单位时间进行比赛 A B F E C D
数据结构的定义 • 描述非数值计算问题的模型是--- • 如表、树、图之类的数据结构 • 数据结构是--- • 研究计算机的操作对象(数据)以及它们之间的关系和操作等的学科.
综合性的专业基础课 《数据结构》在计算机科学中所处的地位
课程目的 • 能够分析研究计算机加工的对象的特性,获得其逻辑结构,根据需求,选择合适存贮结构及其相应的算法; • 学习一些常用的算法; • 复杂程序设计的训练过程,要求编写的程序结构清楚和正确易读; • 初步掌握算法的时间分析和空间分析技术;
1.2 基本概念和术语 • 数据:计算机程序处理的符号的总称。 • 数据元素:数据的基本单位。 • 数据记录与数据项:数据的不可分割的最小单位。 • 数据对象:性质相同的数据元素的集合。 • 数据结构:相互间存在一种或多种关系的数据元素的集合。 • 数据类型与抽象的数据类型
数据(Data) 能够被计算机加工的对象,或者能够被计算机输入、存储、处理和输出的一切信息。 在计算机科学中,数据是指能够输入到计算机中,并且能够被计算机程序处理的符号的总称。
数据处理 (Data Processing) 对数据进行检索、插入、删除、合并、拆分、排序、统计、简单计算、转换、输入、输出等的操作过程。
数据元素(Data Element) 简称“元素”,是数据基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 如:字符串的数据元素是其中的每个字符 数组的数据元素是其中的每一个成分 文件的数据元素是其中的每一个记录
数据记录(Data Record) 简称“记录”,它是数据处理领域组织数据的基本单位。 数据中的每个数据元素在许多应用场合被组织成记录的结构。
姓 名学 号班 号性别出生日期入学成绩 年 月 日 数据记录可以由数据项(Item)构成。 描述一个学生的数据记录 例如: 其中每个款项称为一个“数据项” 它是数据结构中讨论的最小单位 简单数据项 称之为组合数据项
数据结构(Data Structures) 有一个特性相同的数据元素的集合,如果在数据元素之间存在一种或多种特定的关系,则称为一个数据结构。 具有结构的数据元素的集合 简单的说是指数据以及相互之间联系
逻辑结构 数据元素之间的逻辑关系。 根据数据元素之间的逻辑结构可将数据结构分为四类: 集合——同属于一个集合。 线性结构——一个对一个。如,线性表、栈、队列。 树形结构——一个对多个。如,树。 图状结构——多个对多个,如,图。
物理结构 存储结构 具有某种逻辑结构的数据在计算机存储器中的存储方式(存储映象)。 顺序存储结构 用一组地址连续的存储单元依次存放数据元素, 数据元素之间的逻辑关系通过元素的地址直接反映。 链式存储结构 用一组地址任意的存储单元依次存放数据元素, 数据元素之间的逻辑关系通过指针间接地反映。
刘晓光 男 汉 16 … 马广生 男 回 17 … 王 民 男 壮 21 … … … … … … 张玉华 女 汉 25 … … d1 d2 d3 d4… d30 a1 a2 a4 a30 a3 例 姓 名 性 别 民 族 年 龄 其 他 a1 a2 a3 a30 逻辑结构 线性结构(线性表) 存储结构 1. 顺序存储结构
… d1 d2 d3 d4 a2 a4 a3 a1 list … a1 a2 a3 a30 ∧ d1 d3 d5 d4 2. 链式存储结构
逻辑结构 存储结构 算法 数据结构课程研究的主要内容 1. 研究数据元素之间的客观联系。 2.研究具有某种逻辑关系的数据在计算机 存储器内的存储方式。 3. 研究如何在数据的各种结构(逻辑的和物理的)的基础上对数据实施一系列有效的基本操作。
数据结构 逻辑结构:线性结构(一对一)linearity (数据之间的 树形结构(一对多)tree 相互联系) 图状或网状结构(多对多)graph 集合结构(同属一个集合)set 物理结构(存储结构): (在计算机中的存储方式) 顺序存储(利用在存储器中相对 位置之间的特定关系) 链式存储(利用附加的“指针”) 索引、散列等
逻辑结构和物理结构 • 算法的设计取决于选定的逻辑结构 • 算法的实现依赖于采用的存储结构
数据结构的数学定义 • 数据结构是一个二元组 • Data_Structure = (D,S)D –数据元素的有限集合S –定义在D上的关系的有限集合 例如 • Complex = (C,R) • C = {(c1,c2)| c1,c2是实数} • R = {P|P是定义在C上的关系,<c1,c2>表示c1是实部,c2是虚部}
数据类型与抽象的数据类型 • 数据类型(Data Type): • 值的集合以及定义在这个集合上的一组操作。 • 例如: C语言中的整数类型 • 抽象数据类型(ADT) • 数学模型以及定义在该模型上的一组操作。 • 与其在计算机中的表示和实现无关。 • ADT可用三元组表示:(D,S,P) D – 数据对象; S – D上的关系; P – 对D的基本操作集
抽象数据类型的定义格式: • ADT抽象数据类型名{ 数据对象:<数据对象的定义> 数据关系:<数据关系的定义> 基本操作:<基本操作的定义>}ADT抽象的数据类型名 • 基本操作的定义格式为:基本操作名(参数表)初始条件:<初始条件描述>操作结果:<操作结果描述>
抽象数据类型三元组的定义 • ADT Triplet{ • 数据对象:D = {e1,e2,e3 | e1,e2,e3属于Elemset(定义了关系的某个集合)} • 数据关系:R1 = {<e1,e2>|<e2,e3>} • 基本操作: • InitTriplet(&T,v1,v2,v3) • 初始条件: • 操作结果: 构造三元组T,元素e1,e2和e3分别被赋予参数v1,v2和v3的值。
抽象数据类型三元组的定义(2) • DestroyTriplet(&T) • 初始条件: 三元组T已经存在。 • 操作结果: 销毁三元组T。 • Get(T,i,&e) • 初始条件: 三元组T已经存在,1<=i<=3。 • 操作结果: 用e返回三元组T的第i个元素。 • Put(&T,i,e) • 初始条件: 三元组T已经存在,1<=i<=3。 • 操作结果: 用e值取代三元组T的第i个元素。
抽象数据类型三元组的定义(3) • IsAscending(T) • 初始条件: 三元组T已经存在。 • 操作结果: 如果三元组T的三个元素按升序排列,则返回TRUE; 否则返回FALSE。 • IsDescending(T) • 初始条件: 三元组T已经存在。 • 操作结果: 如果三元组T的三个元素按降序排列,则返回TRUE; 否则返回FALSE。
抽象数据类型三元组的定义(4) • Max(T,&e) • 初始条件: 三元组T已经存在,。 • 操作结果: 用e返回三元组T的最大值。 • Min(T,&e) • 初始条件: 三元组T已经存在,。 • 操作结果: 用e返回三元组T的最小值。 }ADT Triplet
1.3抽象数据类型的表示与实现 • 类C语言(作了扩充和修改)的表示 • 如:预定义常量和类型 • #define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2 typedef int Status
三元组基本操作实现---举例 Status Get(Triple T, int i, Elemtype *e) // 初始条件: 三元组T已经存在,1<=i<=3。 // 操作结果: 用e返回三元组T的第i个元素。 { if (i<1 || i>3) return ERROR; *e=T[i-1]; return OK; }
1.4算法和算法分析1.4.1 算法 • 算法(Algorithm):对特定问题求解步骤的一种描述. • 算法的五个重要特性: • 1)有穷性 • 2)确定性 • 3)可行性 • 4)输入 • 5)输出
(1)有穷性对于任意一组合法输入值,在执行有穷步骤之后一定能结束。即:算法中的每个步骤都能在有限时间内完成;(1)有穷性对于任意一组合法输入值,在执行有穷步骤之后一定能结束。即:算法中的每个步骤都能在有限时间内完成; (2)确定性对于每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行。并且在任何条件下,算法都只有一条执行路径;
(3)可行性算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现之;(3)可行性算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现之; (4)有输入作为算法加工对象的量值,通常体现为算法中的一组变量。有些输入量需要在算法执行过程中输入,而有的算法表面上可以没有输入,实际上已被嵌入算法之中; (5)有输出它是一组与“输入”与确定关系的量值,是算法进行信息加工后得到的结果,这种确定关系即为算法的功能。
算法描述描述一个算法可以用文字叙述,也可以采用传统的流程图、N-S图或PAD图。但在计算机实现中,最终必须采用一种程序设计语言编写为程序。算法描述描述一个算法可以用文字叙述,也可以采用传统的流程图、N-S图或PAD图。但在计算机实现中,最终必须采用一种程序设计语言编写为程序。 例题:从 n 个整数元素中查找出最大值下面分 别用流程图、文字以及程序设计语言对其描述
开始 为 n 个元素a 1-a n 输入数值 (一)流程图 a 1 x 2 i N i <= n Y N a i > x 输出 x 结束 a i x i+1 i
(二)文字描述 • 给n 个元素a 1-a n输入数值 • 把第一个元素a 1赋给用于保存最大值元素的变量x • 把表示下标的变量i赋初值2 • 如果i <= n则向下执行,否则输出最大值x 后结束算法 • 如果a i > x则将a i赋给x,否则不改变x的值,这使得x 始终保存着当前比较过的所有元素的最大值 • 使下标i 增1,以指示下一个元素 • 转向(4)步继续执行
(三) C语言描述 const n=10; void main(void) { int i, x, a[n]; //用a[0]-a[n-1]保存元素a1-an printf(“请输入10个整数:”); for (i =0; i<n; i++) scanf(“%d”,&a[i]); x=a[0]; i=1; while (i<n) { if (a[i]>x) x=a[i]; i++; } printf(“10个整数中最大值为:%d”,x); }
1.4.2 算法设计的要求 • 算法应达到的目标 • 1)正确性 • 2)可读性 • 3)健壮性 • 4)效率与低存贮量
1.4.3 算法效率的度量 (1) 事后统计法 (2) 事前分析估算法 • 用高级语言编写的程序运行的时间主要取决于如下因素: • 算法; • 问题规模; • 使用语言:级别越高,效率越低; • 编译程序; • 机器;
1.4.3 算法效率的度量 • 特定算法“运行工作量”的大小只依赖于问题的规模(通常用整数n表示),或者说是问题规模的函数。 • 算法主要由程序的控制结构(顺序,分支,循环)和原操作(必须的操作)构成,算法的时间主要取决于两者。 算法的执行时间= 原操作(i)的执行次数×原操作(i)的执行时间 算法的执行时间 与 原操作执行次数之和成正比
算法度量:从算法中选取一种对于所研究的问题来说是 基本操作 的原操作,以该基本操作 在算法中重复执行的次数 作为算法运行时间的衡量准则。