57
第 1第 第第第第 第第第第 (Data Structure, DS) 第第 email [email protected] 第第ltyong.cai.swufe.edu.cn 2005 第 2 第 22 第

课程名称: 数据结构 (Data Structure, DS) 课程 email : ds05@163

Embed Size (px)

DESCRIPTION

课程名称: 数据结构 (Data Structure, DS) 课程 email : [email protected] 主页: ltyong.cai.swufe.edu.cn 2005 年 2 月 22 日. 预修课程: C 语言、离散数学 教材: 《 数据结构 (C 语言版 )》 ,严蔚敏,吴伟民,清华大学出版社 (TUP) 参考资料: 《 数据结构题集 》 严蔚敏 等, TUP - PowerPoint PPT Presentation

Citation preview

Page 1: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 1页

课程名称: 数据结构 (Data Structure, DS)

课程 email : [email protected]

主页: ltyong.cai.swufe.edu.cn

2005 年 2 月 22 日

Page 2: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 2页

预修课程: C 语言、离散数学

教材:《数据结构 (C 语言版 ) 》,严蔚敏,吴伟民,清华大学出版社 (TUP)

参考资料:

《数据结构题集》 严蔚敏 等, TUP《数据结构 ( 用面向对象方法和 C++ 描述 ) 》,殷人昆等, TUPThe.Art.Of.Computer.Programming.Volume.1 、 2 、 3 Donald.E.Knuth , ebook

Page 3: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 3页

本 课 程 教 学 内 容第一章 绪论第二章 线性表第三章 栈和队列第四章 串第五章 数组和广义表第六章 树和二叉树第七章 图第八章 查找第九章 内部排序

Page 4: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 4页

本 课 程 内 容 结 构

数据结构

线性结构

非线性结构

线性表

栈队列串数组和广义表

顺序表

链表单链表

双向链表

循环链表

两种存储结构

顺序存储

链式存储

二叉树的遍历树和森林哈夫曼树及哈夫曼编码图的存储图的遍历最小生成树拓扑排序和关键路径最短路径

查找

排序

静态

动态

哈希表

内部

外部

Page 5: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 5页

课程安排

课堂讲授 上机实践 ( 时间地点待定 )期末成绩计算方式

平时成绩 30%~40% :出勤、上机作业期末考试 60%~70%部分同学做报告 +5

Page 6: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 6页

第一章 绪 论

本章主要内容: 数据结构的基本概念 抽象数据类型的定义与实现 算法的概念、分析和评价

学习重点及要求: 掌握数据结构的基本概念 掌握算法的概念及评价

Page 7: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 7页

数据数据元素数据结构数据类型抽象数据类型算法及其设计原则时间复杂度空间复杂度

Page 8: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 8页

1.1 1.1 数据结构的基本概念数据结构的基本概念1.2 抽象数据类型的定义与实现1.3 算法的概念、分析和评价

Page 9: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 9页

1.1 数据结构的基本概念

算法 + 数据结构 = 程序设计程序设计:为计算机处理问题编制的一组指令集算法:处理问题的策略数据结构:问题的数学模型

Page 10: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 10页

数值计算问题

数值计算的程序设计问题——线性代数方程组。

ax2+bx+c=0

将系数 a 、 b 、 c 构成一个线性表 (a,b,c) ,解决此方程的实质是对 (a,b,c) 的处理。

Page 11: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 11页

非数值计算的程序设计问题

求 n 个数的最大值计算机对奕小区间天然气管道的铺设

Page 12: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 12页

数据结构的定义

数据结构描述现实世界实体的数学模型( 非数值计算 ) 及其上的操作在计算机中的表示和实现。

为在计算机上解决具体问题,应如何对所需的数据 / 信息及其关系进行组织 ( 组织起来的数据就具有了结构关系 ) ,以及如何对它们进行基本操作。

或者

Page 13: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 13页

基本概念和术语

数据是所有能被输入到计算机中,且能被计算机处理的符号 ( 数字、字符等 ) 的集合,它是计算机操作对象的总称。是计算机处理的信息的某种特定的符号表示形式。

Page 14: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 14页

数据元素是数据 ( 集合 )中的一个“个体”,在计算机中通常作为一个整体进行考虑和处理,是数据结构中讨论的“基本单位”。不可分割的“原子”型数据元素由多个款项构成的数据元素其中每个款项被称为一个“数据项”组合项原子项数据项是数据结构中讨论的 "最小单位 "。

Page 15: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 15页

关键字指的是能识别一个或多个数据元素的数据项。若能起唯一识别作用,则称之为 "主 " 关键字,否则称之为 " 次 " 关键字。在由多个数据项构成的数据元素中必定存在关键字。

数据对象具有相同特性的数据元素的集合,如:整数、实数等。它是数据的一个子集。

Page 16: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 16页

数据结构若在特性相同的数据元素集合中的数据元素之间存在一种或多种特定的关系,则称该数据元素的集合为“数据结构”数据结构是带 "结构 "的数据元素的集合。 "结构 " 即指数据元素之间存在的关系。

Page 17: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 17页

eg1:长整数 123456789012可用 {x=1234,y=5678,z=9012}表示x最高 4位, y中间 4位, z最低 4位

Page 18: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 18页

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>}

a1 a2 a3

a4 a5 a6

Page 19: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 19页

Page 20: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 20页

数据结构的数学定义形式: DS=(D,R) 二元组

D:数据元素的集合 ( 数据对象 )R:D 上关系的集合,用二元组表示的序偶的集合,表示数据元素之间的前驱、后继关系。

Page 21: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 21页

数据结构的分类

集合

线性结构

树型结构

图状结构

Page 22: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 22页

数据结构应该包括数据的“逻辑结构”和数据的“物理结构”两个方面(层次)。

数据逻辑结构是对数据元素之间存在的逻辑关系的描述,它可以用一个数据元素的集合和定义在此集合上的若干关系表示。数据物理结构是数据逻辑结构在计算机中的表示和实现,故又称数据“存储结构”。是逻辑结构在存储器中的映象,包含数据元素的映象和关系的映象。

Page 23: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 23页

数据元素的映象关系的映象

顺序存储 ( 顺序映像 )只存储结点 ( 数据元素 ) 的值。结点之间的关系:由存储单元的相邻关系隐含地表示。逻辑上相邻的结点物理上存储单元相邻,适合于线性结构。在高级语言中常用数组表示顺序存储结构。

链接存储(非顺序映像)存储结点的值和结点之间的关系。用指针表示结点之间的关系,是各结点的后继结点的地址。数据域指针域

Page 24: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 24页

地址 data link0001 63 00020002 54 00050003 82 00040004 66 00010005 50 ^

0003 0004 0001 0002 0005

存储结构

82 66 5463 50

逻辑表示

eg1 :有一线性结构结点集合:

D={63 , 54 , 82 , 66 , 50}

关系为结点值的降序:

R={<82,66>,<66,63>,<63,54>,

<54,50>}

Page 25: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 25页

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>}逻辑表示: 存储结构:

add data Llink Rlink0000 A 0001 0002

0001 B 0003 0004

0002 C 0005 ^

0003 D ^ ^

0004 E ^ ^

0005 F 0006 ^

0006 G ^ ^

Page 26: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 26页

1.1 数据结构的基本概念1.2 1.2 抽象数据类型的定义与实现抽象数据类型的定义与实现1.3 算法的概念、分析和评价

Page 27: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 27页

在用高级语言编写的程序中,必须对程序使用的变量、常量和表达式明确说明它们所属的数据类型。

数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

Page 28: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 28页

英文含义Abstract Data Type 简称 ADT 。是指一个数学模型以及定义在此数学模型上的一组操作。

ADT 的两个重要特征数据抽象

用 ADT 描述程序处理的实体时,强调的是其本质的特征、其所完成的功能以及它和外部用户的接口。

数据封装将实体的外部特性和其内部实现细节分离,并且

对外部用户隐藏其内部实现细节。

Page 29: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 29页

抽象数据类型的描述抽象数据类型定义用三元组表示:

( D , S , P)其中, D是数据对象,

S是 D 上的关系集,P是对 D 的基本操作集。

Page 30: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 30页

定义格式:ADT 抽象数据类型名{ 数据对象: <数据对象的定义 >

数据关系: <数据关系的定义 >基本操作: <基本操作的定义 > (相当于声明若干函数 )}ADT 抽象数据类型名

Page 31: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 31页

如: 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 。 }

Page 32: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 32页

抽象数据类型的表示与实现抽象数据类型是通过固有的数据类型(高级语言中已实现的数据类型)来实现。

Page 33: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 33页

1.1 数据结构的基本概念1.2 抽象数据类型的定义与实现1.3 1.3 算法的概念、分析和评价算法的概念、分析和评价

Page 34: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 34页

算法和算法的五个重要特性算法的设计原则时间复杂度和空间复杂度

Page 35: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 35页

算法是对特定问题求解步骤的一种描述,是有限长的操作序列。

算法有五个重要特性:

1.有穷性 2. 确定性 3. 可行性4.输入 5. 输出

Page 36: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 36页

1. 有穷性:执行有穷步后结束,且每一步在有穷时间内完成。2.确定性:每一条指令必须有确切的含义,不会产生二义性。 并且在任何条件下,算法都只有一条执行的路径。3.可行性:算法中描述的操作都是可以通过基本运算执行有 限次实现。

Page 37: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 37页

4.输入:有 0 个或多个输入。作为算法加工对象的量值,通常 体现为算法中的一组变量值,有些是算法执行过程 中输入的,有些已被嵌入在算法中。5.输出:有一个或多个输出。是一组与输入有确定关系的量值, 是算法加工信息对象后得到的结果。这种确定关系 即为算法的功能。

Page 38: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 38页

衡量算法性能的标准。

设计算法时,通常应考虑达到以下目标:

1.正确性

2.可读性

3.健壮性

4.高效率与低存储量的需求

Page 39: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 39页

1. 正确性(有效性)

首先,算法能够正确地实现预先规定的功能。

其次,对正确性理解的四个层次:

(1) 程序中不含语法错误

(2) 程序对几组输入数据能够得出满足要求的结果

(3) 程序对精心选择的典型、苛刻而带有刁难性的几

组输入数据能得出满足要求的结果

(4) 对一切合法的输入数据都能产生满足要求的结果

Page 40: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 40页

2. 可读性

可读性好。算法的逻辑必须是清晰的、简单的和结构

化的。有助于人对算法的理解,为了人的阅读与交流。

3.健壮性

很好的容错性,即提供例外处理,对不合理的数据作

出反应或进行处理,而不会产生莫明其妙的结果或出现异

常中断、死机等现象,对于出错应报告出错信息。

Page 41: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 41页

4. 高效率与低存储量的需求

效率:指的是算法执行的时间;

存储量:指的是算法执行过程中所需的最大存储空间。

通常,用时间复杂度来度量效率;用空间复杂度来试

题存储量。

Page 42: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 42页

1. 时间复杂度 时间复杂度是指算法的运行时间。(1) 和算法执行时间相关的因素:ⅰ 算法选用的策略ⅱ 问题规模ⅲ 编写程序的语言ⅳ 编译程序 ⅴ 计算机执行指令的速度

Page 43: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 43页

(2) 算法的时间复杂度与运行算法的目标计算机及描述算法的工具无关。取决于以下三方面: 问题性质 问题规模 算法性质

Page 44: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 44页

一个算法的时间复杂度通常描述为问题规模的函数。 算法 =控制结构 + 原操作

以基本操作重复执行的次数作为算法的时间量度。重复执行的次数是问题的规模 n的某个函数 f(n) 。

通常时间复杂度是一个估计值。考虑算法在最坏情况下的时间代价,主要采用大 O表示法来描述。 时间复杂度记作: T(n)=O(f(n)) 算法执行时间的增长率和 f(n) 的增率相同。

算法中选取一种对于所研究的问题来说是基本操作的原操作

Page 45: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 45页

 基本操作大多在循环和递归中。 时间复杂度通常具有的形式: 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!)

Page 46: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 46页

eg1 两个 n 阶矩阵相加,即 C=A+B ,其算法如下:#define MAX 20void 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 }

Page 47: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 47页

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

Page 48: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 48页

因此,该算法中基本运算的次数和为: f(n)=n+1+n(n+1)+n2=2n2+2n+1 T(n)=O(f(n))=O(n2) 影响算法时间复杂度的主要部分是循环体最内层语句 (3) ,只需分析它的时间复杂度,即: T(n)=n2=O(n2)

Page 49: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 49页

2.空间复杂度 空间复杂度是算法在执行过程中占用存储容量的度量。 算法的存储量包含:输入数据、程序和辅助变量所占的存储空间。 空间复杂度是问题规模的函数,记为 g(n) 。 表示为: S(n)=O(g(n)) 其中: n为问题的规模, g(n) 与解决问题所用的存储空间的增长率相同。

Page 50: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 50页

一般分析空间复杂度,只分析除输入和程序之

外的辅助变量所占的额外空间。

若所需额外的空间相对于输入数据量是常数,

则称此算法为原地工作。

若所需存储量依赖于特定的输入,通常则考

虑最坏情况。

Page 51: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 51页

小结

数据结构的基本概念抽象数据类型的定义与实现算法的概念、分析和评价

Page 52: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 52页

数据是计算机操作对象的总称,它是计算机处理的符号的集合,集合中的个体为一个数据元素。数据元素可以是不可分割的原子,也可以由若干数据项合成,因此在数据结构中讨论的基本单位是数据元素,而最小单位是数据项。

Page 53: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 53页

数据结构是由若干特性相同的数据元素构成的集合,且在集合上存在一种或多种关系。由关系不同可将数据结构分为四类:线性结构、树形结构、图状结构和集合结构。数据的存储结构是数据逻辑结构在计算机中的映象,由关系的两种映象方法可得到两类存储结构:一类是顺序存储结构,它以数据元素相对的存储位置表示关系,则存储结构中只包含数据元素本身的信息;另一类是链式存储结构,它以附加的指针信息(后继元素的存储地址)表示关系。

Page 54: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 54页

数据结构的操作是和数据结构本身密不可分的,两者作为一个整体可用抽象数据类型进行描述。抽象数据类型是一个数学模型以及定义在该模型上的一组操作,因此它和高级程序设计语言中的数据类型具有相同含义,而抽象数据类型的范畴更广,它不局限于现有程序设计语言中已经实现的数据类型(它们通常被称为固有数据类型),但抽象数据类型需要借用固有数据类型表示并实现。抽象数据类型的三大要素为数据对象、数据关系和基本操作,同时数据抽象和数据封装是抽象数据类型的两个重要特性。

Page 55: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 55页

算法是进行程序设计的另一不可缺少的要素。算法是对问题求解的一种描述,是为解决一个或一类问题给出的一种确定规则的描述。一个完整的算法应该具有下列五个要素:有穷性、确定性、可行性、有输入和有输出。一个正确的算法应对苛刻且带有刁难性的输入数据也能得出正确的结果,并且对不正确的输入也能作出正确的反映。

Page 56: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 56页

算法的时间复杂度是比较不同算法效率的一种准则,算法时间复杂度的估算基于算法中基本操作的重复执行次数,或处于最深层循环内的语句的频度。算法空间复杂度可作为算法所需存储量的一种量度,它主要取决于算法的输入量和辅助变量所占空间,若算法的输入仅取决于问题本身而和算法无关,则算法空间复杂度的估算只需考察算法中所用辅助变量所占空间,若算法的空间复杂度为常量级,则称该算法为原地工作的算法。

Page 57: 课程名称:  数据结构 (Data Structure, DS) 课程 email : ds05@163

第 57页

1. 设 n 为正整数,给出下列各种算法关于 n 的时间复杂度。(1)   void fun1(int n) (2) void fun2(int b[],int n){ { int i,j,k,x; int i=1,k=100; for(i=0;i<n-1;i++) while(i<n) {k=i; { for(j=i+1;j<n;j++)k=k+1; if(b[k]>b[j]i+=2; k=j;} x=b[i];} b[i]=b[k]; b[k]=x; (3) void fun3(int n) } { int i=0,s=0; } while (s<n) {i++; s=s+i;}}