570 likes | 704 Views
课程名称: 数据结构 (Data Structure, DS) 课程 email : ds05@163.com 主页: ltyong.cai.swufe.edu.cn 2005 年 2 月 22 日. 预修课程: C 语言、离散数学 教材: 《 数据结构 (C 语言版 )》 ,严蔚敏,吴伟民,清华大学出版社 (TUP) 参考资料: 《 数据结构题集 》 严蔚敏 等, TUP
E N D
课程名称: 数据结构 (Data Structure, DS) 课程email:ds05@163.com 主页:ltyong.cai.swufe.edu.cn 2005年2月22日
预修课程:C语言、离散数学 教材:《数据结构(C语言版)》,严蔚敏,吴伟民,清华大学出版社(TUP) 参考资料: 《数据结构题集》 严蔚敏 等, TUP 《数据结构(用面向对象方法和C++描述)》,殷人昆等, TUP The.Art.Of.Computer.Programming.Volume.1、2、3 Donald.E.Knuth,ebook
本 课 程 教 学 内 容 • 第一章 绪论 • 第二章 线性表 • 第三章 栈和队列 • 第四章 串 • 第五章 数组和广义表 • 第六章 树和二叉树 • 第七章 图 • 第八章 查找 • 第九章 内部排序
本 课 程 内 容 结 构 线性表 栈 队列 串 数组和广义表 顺序表 链表 单链表 双向链表 循环链表 顺序存储 链式存储 两种存储结构 线性结构 静态 动态 哈希表 数据结构 查找 排序 二叉树的遍历 树和森林 哈夫曼树及哈夫曼编码 树 图 非线性结构 内部 外部 图的存储 图的遍历 最小生成树 拓扑排序和关键路径 最短路径
课程安排 • 课堂讲授 • 上机实践 (时间地点待定) • 期末成绩计算方式 • 平时成绩 30%~40%:出勤、上机作业 • 期末考试 60%~70% • 部分同学做报告+5
第一章 绪 论 • 本章主要内容: • 数据结构的基本概念 • 抽象数据类型的定义与实现 • 算法的概念、分析和评价 • 学习重点及要求: • 掌握数据结构的基本概念 • 掌握算法的概念及评价
数据 • 数据元素 • 数据结构 • 数据类型 • 抽象数据类型 • 算法及其设计原则 • 时间复杂度 • 空间复杂度
1.1 数据结构的基本概念 • 1.2 抽象数据类型的定义与实现 • 1.3 算法的概念、分析和评价
1.1 数据结构的基本概念 • 算法+数据结构 =程序设计 • 程序设计:为计算机处理问题编制的一组指令集 • 算法:处理问题的策略 • 数据结构:问题的数学模型
数值计算问题 • 数值计算的程序设计问题——线性代数方程组。 ax2+bx+c=0 将系数a、b、c构成一个线性表(a,b,c),解决此方程的实质是对(a,b,c)的处理。
非数值计算的程序设计问题 • 求n个数的最大值 • 计算机对奕 • 小区间天然气管道的铺设
数据结构的定义 • 数据结构描述现实世界实体的数学模型(非数值计算)及其上的操作在计算机中的表示和实现。 或者 • 为在计算机上解决具体问题,应如何对所需的数据/信息及其关系进行组织(组织起来的数据就具有了结构关系),以及如何对它们进行基本操作。
基本概念和术语 • 数据 • 是所有能被输入到计算机中,且能被计算机处理的符号(数字、字符等)的集合,它是计算机操作对象的总称。 • 是计算机处理的信息的某种特定的符号表示形式。
数据元素 • 是数据(集合)中的一个“个体”,在计算机中通常作为一个整体进行考虑和处理,是数据结构中讨论的“基本单位”。 • 不可分割的“原子”型数据元素 • 由多个款项构成的数据元素 • 其中每个款项被称为一个“数据项” • 组合项 • 原子项 • 数据项是数据结构中讨论的"最小单位"。
关键字 • 指的是能识别一个或多个数据元素的数据项。若能起唯一识别作用,则称之为 "主" 关键字,否则称之为 "次" 关键字。 • 在由多个数据项构成的数据元素中必定存在关键字。 • 数据对象 • 具有相同特性的数据元素的集合,如:整数、实数等。它是数据的一个子集。
数据结构 • 若在特性相同的数据元素集合中的数据元素之间存在一种或多种特定的关系,则称该数据元素的集合为“数据结构” • 数据结构是带"结构"的数据元素的集合。"结构"即指数据元素之间存在的关系。
eg1: • 长整数123456789012可用{x=1234,y=5678,z=9012}表示 • x最高4位,y中间4位,z最低4位
eg2: • 2×3的二维数组{a1,a2,a3,a4,a5,a6} • 行的次序关系: • row={<a1,a2>,<a2,a3>,<a4,a5>,<a5,a6>} • 列的次序关系: • Col={<a1,a4>,<a2,a5>,<a3,a6>}
数据结构的数学定义形式: DS=(D,R) 二元组 • D:数据元素的集合(数据对象) • R:D上关系的集合,用二元组表示的序偶的集合,表示数据元素之间的前驱、后继关系。
数据结构的分类 集合 线性结构 树型结构 图状结构
数据结构应该包括数据的“逻辑结构”和数据的“物理结构”两个方面(层次)。数据结构应该包括数据的“逻辑结构”和数据的“物理结构”两个方面(层次)。 • 数据逻辑结构是对数据元素之间存在的逻辑关系的描述,它可以用一个数据元素的集合和定义在此集合上的若干关系表示。 • 数据物理结构是数据逻辑结构在计算机中的表示和实现,故又称数据“存储结构”。是逻辑结构在存储器中的映象,包含数据元素的映象和关系的映象。
数据元素的映象 • 关系的映象 • 顺序存储(顺序映像) • 只存储结点(数据元素)的值。 • 结点之间的关系:由存储单元的相邻关系隐含地表示。 • 逻辑上相邻的结点 • 物理上存储单元相邻,适合于线性结构。 • 在高级语言中常用数组表示顺序存储结构。 • 链接存储(非顺序映像) • 存储结点的值和结点之间的关系。 • 用指针表示结点之间的关系,是各结点的后继结点的地址。 • 数据域 • 指针域
0001 63 0002 0002 54 0005 0003 82 0004 0004 66 0001 0005 50 ^ 82 66 63 54 50 eg1:有一线性结构结点集合: D={63,54,82,66,50} 关系为结点值的降序: R={<82,66>,<66,63>,<63,54>, <54,50>} 存储结构 地址data link 逻辑表示 0003 0004 0001 0002 0005
eg2:有一树型结构: B=(D,R) D={A,B,C,D,E,F,G} R={<A,B>,<A,C>,<B,D>,<B,E>,<C,F>,<F,G>} 逻辑表示: 存储结构:
1.1 数据结构的基本概念 • 1.2 抽象数据类型的定义与实现 • 1.3 算法的概念、分析和评价
在用高级语言编写的程序中,必须对程序使用的变量、常量和表达式明确说明它们所属的数据类型。在用高级语言编写的程序中,必须对程序使用的变量、常量和表达式明确说明它们所属的数据类型。 • 数据类型是一个值的集合和定义在这个值集上的一组操作的总称。
英文含义 • Abstract Data Type 简称ADT。 • 是指一个数学模型以及定义在此数学模型上的一组操作。 • ADT的两个重要特征 • 数据抽象 • 用ADT描述程序处理的实体时,强调的是其本质的特征、其所完成的功能以及它和外部用户的接口。 • 数据封装 • 将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。
抽象数据类型的描述 • 抽象数据类型定义用三元组表示: (D,S,P) • 其中,D是数据对象, • S是D上的关系集, • P是对D的基本操作集。
定义格式: • ADT 抽象数据类型名 • { 数据对象:<数据对象的定义> • 数据关系:<数据关系的定义> • 基本操作:<基本操作的定义>(相当于声明若干函数) • }ADT抽象数据类型名
如:ADT List { 数据对象:D={ai|ai∈ElemSet, i=1,2,3,…,n,n≥0} 数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…n} 基本操作: InitList(&L)要点: 操作结果:构造一个空的线性表L。 ListLength(L) 初始条件:线性表L已存在。 操作结果:返回L中数据元素个数(线性表的长度) ListInsert(&L,i,e) 初始条件:线性表L已存在,1≤i≤ListLength(L)+1 操作结果:在L中第I个位置之前插入新的数据元素e,L的 长度加1。 }
抽象数据类型的表示与实现 • 抽象数据类型是通过固有的数据类型(高级语言中已实现的数据类型)来实现。
1.1 数据结构的基本概念 • 1.2 抽象数据类型的定义与实现 • 1.3 算法的概念、分析和评价
算法和算法的五个重要特性 • 算法的设计原则 • 时间复杂度和空间复杂度
算法是对特定问题求解步骤的一种描述,是有限长的操作序列。 算法有五个重要特性: 1.有穷性 2.确定性 3.可行性 4.输入 5.输出
1.有穷性:执行有穷步后结束,且每一步在有穷时间内完成。1.有穷性:执行有穷步后结束,且每一步在有穷时间内完成。 2.确定性:每一条指令必须有确切的含义,不会产生二义性。 并且在任何条件下,算法都只有一条执行的路径。 3.可行性:算法中描述的操作都是可以通过基本运算执行有 限次实现。
4.输入:有0个或多个输入。作为算法加工对象的量值,通常4.输入:有0个或多个输入。作为算法加工对象的量值,通常 体现为算法中的一组变量值,有些是算法执行过程 中输入的,有些已被嵌入在算法中。 5.输出:有一个或多个输出。是一组与输入有确定关系的量值, 是算法加工信息对象后得到的结果。这种确定关系 即为算法的功能。
衡量算法性能的标准。 设计算法时,通常应考虑达到以下目标: 1.正确性 2.可读性 3.健壮性 4.高效率与低存储量的需求
1.正确性(有效性) 首先,算法能够正确地实现预先规定的功能。 其次,对正确性理解的四个层次: (1)程序中不含语法错误 (2)程序对几组输入数据能够得出满足要求的结果 (3)程序对精心选择的典型、苛刻而带有刁难性的几 组输入数据能得出满足要求的结果 (4)对一切合法的输入数据都能产生满足要求的结果
2.可读性 可读性好。算法的逻辑必须是清晰的、简单的和结构 化的。有助于人对算法的理解,为了人的阅读与交流。 3.健壮性 很好的容错性,即提供例外处理,对不合理的数据作 出反应或进行处理,而不会产生莫明其妙的结果或出现异 常中断、死机等现象,对于出错应报告出错信息。
4.高效率与低存储量的需求 效率:指的是算法执行的时间; 存储量:指的是算法执行过程中所需的最大存储空间。 通常,用时间复杂度来度量效率;用空间复杂度来试 题存储量。
1.时间复杂度 时间复杂度是指算法的运行时间。 (1)和算法执行时间相关的因素: ⅰ 算法选用的策略 ⅱ 问题规模 ⅲ 编写程序的语言 ⅳ 编译程序 ⅴ 计算机执行指令的速度
(2)算法的时间复杂度与运行算法的目标计算机及描述算法的工具无关。取决于以下三方面: 问题性质 问题规模 算法性质
一个算法的时间复杂度通常描述为问题规模的函数。一个算法的时间复杂度通常描述为问题规模的函数。 算法=控制结构+原操作 算法中选取一种对于所研究的问题来说是基本操作的原操作 以基本操作重复执行的次数作为算法的时间量度。重复执行的次数是问题的规模n的某个函数f(n)。 通常时间复杂度是一个估计值。考虑算法在最坏情况下的时间代价,主要采用大O表示法来描述。 时间复杂度记作: T(n)=O(f(n)) 算法执行时间的增长率和f(n)的增率相同。
基本操作大多在循环和递归中。 时间复杂度通常具有的形式: O(1)、O(log2n)、O(n)、O(n*log2n)、O(n2)、O(n3)、O(2n)、O(n!) 不同数量级对应的值的关系: O(1)<O(log2n)<O(n)<O(n*log2n)<O(n2)<O(n3)<O(2n)<O(n!)
eg1两个n阶矩阵相加,即C=A+B, 其算法如下: #define MAX 20 void matrixadd(int n,int a[MAX][MAX],int b[MAX][MAX],int c[MAX][MAX]) { int i,j; for(i=0;i<n;i++) (1) //执行n+1次,频度n+1 for(j=0;j<n;j++) (2)//频度n(n+1) c[i][j]=a[i][j]+b[i][j];(3)//频度为n2 }
void select_sort(int a[], int n){// 将 a 中整数序列重新排列成自小至大有序的整数序列。for ( i = 0; i< n-1; ++i ) {j = i; for ( k = i+1; k < n; ++k )if (a[k] < a[j] ) j = k;if ( j != i ) { w = a[j]; a[j] = a[i]; a[i] = w;}} // select_sort
因此,该算法中基本运算的次数和为: f(n)=n+1+n(n+1)+n2=2n2+2n+1 T(n)=O(f(n))=O(n2) 影响算法时间复杂度的主要部分是循环体最内层语句(3),只需分析它的时间复杂度,即:T(n)=n2=O(n2)
2.空间复杂度 空间复杂度是算法在执行过程中占用存储容量的度量。 算法的存储量包含:输入数据、程序和辅助变量所占的存储空间。 空间复杂度是问题规模的函数,记为g(n)。 表示为:S(n)=O(g(n)) 其中:n为问题的规模,g(n)与解决问题所用的存储空间的增长率相同。
一般分析空间复杂度,只分析除输入和程序之 外的辅助变量所占的额外空间。 若所需额外的空间相对于输入数据量是常数, 则称此算法为原地工作。 若所需存储量依赖于特定的输入,通常则考 虑最坏情况。