收藏 分享(赏)

数据结构教程第1章 绪论.ppt

上传人:myw993772 文档编号:7179375 上传时间:2019-05-08 格式:PPT 页数:80 大小:889KB
下载 相关 举报
数据结构教程第1章  绪论.ppt_第1页
第1页 / 共80页
数据结构教程第1章  绪论.ppt_第2页
第2页 / 共80页
数据结构教程第1章  绪论.ppt_第3页
第3页 / 共80页
数据结构教程第1章  绪论.ppt_第4页
第4页 / 共80页
数据结构教程第1章  绪论.ppt_第5页
第5页 / 共80页
点击查看更多>>
资源描述

1、1,数 据 结 构,清华大学出版社,李春葆主编,主讲 王照华,2,参考书、辅导书及考核方式,参考书: 1 数据结构(C语言版)严蔚敏主编 清华大学出版社 2 数据结构(用面向对象方法与C+描述) 殷人昆主编.清华大学出版社 3 数据结构与算法分析-C语言描述(原书第2版).(美)Mark Allen Weiss 译:冯舜玺.机械工业出版社原书名:Data Structures and Algorithm Analysis in C:Second Edition 4 数据结构与算法分析-Java语言描述(作者译者出版社同上) 辅导书: 1 数据结构教程(第3版)学习指导(与教材配套) 2 数据结

2、构算法实现及解析(第二版)-配合严蔚敏、吴伟民编著的数据结构(C语言版).高一凡.西安电子科技大学出版社 考核方式: 平时成绩占总成绩的30%,期末卷面成绩占总成绩的70% 其中平时成绩主要由出勤、作业、上机实验、测验组成。,数据结构教学博客 http:/ 绪论,1.2 算法及其描述,1.1 什么是数据结构,1.3 算法分析,本章小结,1.4 数据结构算法程序,4,1.1.1 数据结构的定义,1.1.2 逻辑结构类型,1.1.3 存储结构类型,1.1.4 数据结构和数据类型,1.1 什么是数据结构,5,数据:是所有能被输入到计算机中,且能被计算机处理的符号的集合。它是计算机操作的对象的总称,也

3、是计算机处理的信息的某种特定的符号表示形式。,数据元素:是数据(集合)中的一个“个体”,是数据的基本单位。,1.1.1 数据结构的定义,数据对象:是具有相同性质的若干个数据元素的集合。,6,例如,200402班为一个学生数据对象,而其中的“张三”是一个数据元素)。,数据结构:是指数据以及数据元素相互之间的联系。可以看作是相互之间存在着某种特定关系的数据元素的集合。因此,可以把数据结构看成是带结构的数据元素的集合。,7,数据结构包括如下几个方面:(1) 数据元素之间的逻辑关系,即数据的逻辑结构。(2) 数据元素及其关系在计算机存储器中的存储方式,即数据的存储结构,也称为数据的物理结构。(3) 施

4、加在该数据上的操作,即数据的运算。,8,例1.1 有一个学生表如表1.1所示。这个表中的数据元素是学生记录,每个数据元素由四个数据项(即学号、姓别、性别和班号)组成。,9,表1.1 学生表,10,该表中的记录顺序反映了数据元素之间的逻辑关系, 用学号标识每个学生记录,这种逻辑关系可以表示为:,其中尖括号“”表示元素ai和ai+1之间是相邻的,即ai在ai+1之前,ai+1在ai之后。,11,数据在计算机存储器中的存储方式就是存储结构。C/C+语言中,通常采用结构体数组和链表两种方式实现其存储结构。,12,存放学生表的结构体数组Stud定义为:struct int no; /*存储学号*/cha

5、r name8; /*存储姓名*/char sex2; /*存储性别*/char class4; /*存储班号*/ Stud7=1,“张斌”,“男”,“9901”,5,“王萍“,“女“,“9901“;,13,结构体数组Stud各元素在内存中顺序存放,即第i(1i6)个学生对应的元素Studi存放在第i+1个学生对应的元素Studi+1之前,Studi+1正好在Studi之后。,14,存放学生表的链表的结点类型StudType定义为:typedef struct studnode int no; /*存储学号*/char name8; /*存储姓名*/char sex2; /*存储性别*/cha

6、r class4; /*存储班号*/struct studnode *next; /*存储指向下一个学生的指针*/ StudType;,15,链表首结点地址head,1,张斌,男,9901,8,刘丽,女,9902,34,李英,女,9901,20,陈华,男,9902,12,王奇,男,9901,26,董强,男,9902,5,王萍,女,9901,学生表构成的链表如右图所示。其中的head为第一个数据元素的指针。,学生表构成的链表,16,对于“学生表”这种数据结构,可以进行一系列的运算,例如,增加一个学生记录、删除一个学生记录、查找性别为“女”的学生记录、查找班号为“9902”的学生记录等等。从前面介

7、绍的两种存储结构看到,同样的运算在不同的存储结构中,其实现过程是不同的。,17,例如,查找学号为20的学生的姓名:对于Stud数组,可以从Stud0开始比较,Stud0.no不等于20,再与Stud1.no比较,直到Stud3.no等于20,返回Stud3.name。对于head为首结点指针的链表,从head所指结点开始比较,head-no不等于20,从它的next得到下一个结点的地址,再与下一个结点的no域比较,直到某结点的no域等于20,返回其name域。,18,为了更确切地描述一种数据结构,通常采用二元组表示:B=(K,R)其中,B是一种数据结构,它由数据元素的集合K和K上二元关系的集合

8、R所组成。其中:K=ki| 1in,n0R=rj| 1jm,m0,逻辑结构的描述或表示:,19,其中:ki表示集合K中的第i个结点或数据元素。n为K中结点的个数,特别地,若n=0,则K是一个空集,因而B也就无结构可言,有时也可以认为它具有任一结构。rj表示集合R中的第j个二元关系(后面均简称关系)。m为R中关系的个数,特别地,若m=0,则R是一个空集,表明集合K中的元结点间不存在任何关系,彼此是独立的。,20,序偶(x,yK) x为第一结点,y为第二结点。x为y的直接前驱结点(通常简称前驱结点)y为x的直接后继结点(通常简称后继结点)。若某个结点没有前驱结点,则称该结点为开始结点;若某个结点没

9、有后继结点,则称该结点为终端结点。,21,例如,采用二元组表示例1.1的学生表。学生表中共有7个结点,依次用k1k7表示,则对应的二元组表示为B=(K,R),其中:K=k1,k2,k3,k4,k5,k6,k7R=r /只有一种关系r=,22,又例如,有如下数据即一个矩阵:,对应的二元组表示为B=(K,R),其中:K=2,6,3,1,8,12,7,4,5,10,9,11R=r1,r2 其中,r1表示行关系,r2表示列关系r1=,r2=, ,一个二维数组,23,可以利用图形形象地表示逻辑结构。例如,上述“学生表”数据结构用下图的图形表示。,学生表数据结构图示,24,(1) 线性结构结点之间关系:一

10、对一。特点:开始结点和终端结点都是惟一的,除了开始结点和终端结点以外,其余结点都有且仅有一个前驱结点,有且仅有一个后继结点。顺序表就是典型的线性结构。,1.1.2 逻辑结构类型,25,(2) 树形结构结点之间关系:一对多。特点:开始结点惟一,终端结点不惟一。除终端结点以外,每个结点有一个或多个后续结点;除开始结点外,每个结点有且仅有一个前驱结点。,26,(3) 图形结构结点之间关系:多对多。特点:没有开始结点和终端结点,所有结点都可能有多个前驱结点和多个后继结点。,27,(2) 链式存储方法 优点:便于修改。缺点:存储空间浪费;不能随机存取,(3) 索引存储方法 优点:随机存取;提高查找速度。

11、缺点:增加索引表,降低存储空间利用率。,(4) 哈希存储方法通过哈希函数直接计算出一个值,这个值就是该结点的存储地址。,1.1.3 存储结构类型,(1) 顺序存储方法 优点:节省存储空间。缺点:不便于修改,28,(1) 数据类型高级程序语言中,一般须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型。不同类型的变量,其所能取的值的范围不同,所能进行的操作不同。数据类型是一个值的集合和定义在此集合上的一组操作的总称。,1.1.4 数据结构和数据类型,29,如C/C+中的int就是整型数据类型。它是所有整数的集合(在16位计算机中为3276832767的全体整数)和相关的整数运算(如

12、、等)。,30,(2) 抽象数据类型抽象数据类型(Abstract Data Type简写为ADT)指的是用户进行软件系统设计时从问题的数学模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算,而不考虑计算机的具体存储结构和运算的具体实现算法。 抽象数据类型=数据元素集合抽象运算,31,例如,抽象数据类型复数的定义: ADT Complex 数据对象:D=e1,e2|e1,e2均为实数 数据关系:R1=| e1是复数的实数部分,e2 是复数的虚数部分 ,e1e2i,32,基本操作:AssignComplex(&Z,v1,v2):构造复数Z。DestroyComplex(&Z):复数Z被销毁。 G

13、etReal(Z,&real):返回复数Z的实部值。GetImag(Z,&Imag):返回复数Z的虚部值。Add(z1,z2,&sum):返回两个复数z1,z2的和。 ADT Complex,33,1.2 算法及其描述,1.2.1 什么是算法,1.2.2 算法描述,34,1.2.1 什么是算法数据元素之间的关系有逻辑关系和物理关系,对应的操作有逻辑结构上的操作功能和具体存储结构上的操作实现。算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示计算机的一个或多个操作。,35,算法的五个重要的特性,(1) 有穷性:在有穷步之后结束。,(2) 确定性:无二义性。,(3) 可行性

14、:可通过基本运算有限次执行来实现。,(4) 有输入,(5) 有输出,36,例1.2 考虑下列两段描述: (1) 描述一void exam1() n2;while (n%20) nn+2; printf(“%dn“,n);,华中科大考研题,37,(2) 描述二void exam2()y=0;x=5/y;printf(“%d,%dn”,x,y);这两段描述均不能满足算法的特征,试问它们违反了哪些特征?,38,解:(1)算法是一个死循环,违反了算法的有穷性特征。(2)算法包含除零错误,违反了算法的可行性特征。,39,1.2.2 算法描述,本书中采用C/C+语言描述算法。说明:C+语言中提供了一种引用

15、运算符“&”,引用是个别名,当建立引用时,程序用另一个已定义的变量或对象(目标)的名字初始化它,从那时起,引用作为目标的别名而使用,对引用的改动实际就是对目标的改动。注意:Turbo C不支持引用类型。,40,编写一个函数swap1(x,y),当执行语句swap1(a,b)时,交换a和b的值。void swap1(int x,int y)int tmp;tmp=x;x=y;y=tmp;注意:a和b的值不会发生了交换。,41,为此,采用指针的方式来回传形参的值,需将上述函数改为:void swap2(int *x,int *y)int tmp;tmp=*x; /*将x的值放在tmp中*/*x=*

16、y; /*将x所指的值改为*y*/*y=tmp; /*将y所指的值改为tmp*/上述函数的调用改为swap2(&a,&b),显然远不如采用引用方式简洁。所以本书后面很多算法都采用引用形参。,42,引入“引用”的概念 例如:int a=4; /*a为普通的整型变量*/int /*b是a的引用变量*/这里说明b变量是变量a的引用,b也等于4,之后这两个变量同步改变。当a改变时b也同步改变,同样,当b改变时a也同步改变。,难点,43,main() int a=2;int /*输出:a=4,b=4*/ ,44,引用常用于函数形参中,采用引用型形参时,在函数调用时将形参的改变回传给实参,例如,有如下函数

17、(其中的形参均为引用型形参):void swap(int y=tmp当用执行语句swap(a,b)时,a和b的值发生了交换。,45,例1.3 编写一个算法, 读入三个整数x,y和z的值,要求从大到小输出这三个数。解:依次输入x,y和z这三个整数,通过比较交换后,使得xyz,然后输出x,y,z。在算法中应考虑对这三个元素作尽可能少的比较和移动,如下述算法在最坏的情况下只需进行3次比较和7次移动。,46,void Descending() printf(“输入x,y,z“);scanf(“%d,%d,%d“, ,47,用于描述算法的C/C+ 语言中基本语句:输入语句、输出语句、赋值语句、条件语句、

18、循环语句、返回语句、定义函数语句、函数调用语句等,48,1.3 算法分析,1.3.1 算法时间复杂度分析,1.3.2 算法空间复杂度分析,49,一个算法是由控制结构(顺序、分支和循环三种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。,1.3.1 算法时间复杂度分析,控制语句1 原操作,控制语句n 原操作,一个算法,50,同一问题可以采用多种算法实现。如何比较算法执行效率? 算法描述的语言不同 算法执行的环境不同 其他因素所以不能用绝对执行时间进行比较,51,为了便于比较同一问题的不同算法,通常从算法中选取一种对于所研究的问题来说是基本运算的原操作(以下将基本运算的原

19、操作简称为基本运算)。算法执行时间大致为基本运算所需的时间与其运算次数(也称为频度)的乘积。被视为算法基本运算的一般是最深层循环内的语句。,52,在一个算法中,进行基本运算的次数越少,其运行时间也就相对地越少;基本运算次数越多,其运行时间也就相对地越多。所以,通常把算法中包含基本运算次数的多少称为算法的时间复杂度,也就是说,一个算法的时间复杂度是指该算法的基本运算次数。算法中基本运算次数T(n)是问题规模n的某个函数f(n),记作:T(n)=O(f(n),53,记号“O”读作“大O”,它表示随问题规模n的增大算法执行时间的增长率和f(n)的增长率相同。“O”的形式定义为:若f(n)是正整数n的

20、一个函数,则T(n)=O(f(n)表示存在一个正的常数M,使得当nn0时都满足:|T(n)|M|f(n)|,54,也就是只求出T(n)的最高阶,忽略其低阶项和常系数,这样既可简化T(n)的计算,又能比较客观地反映出当n很大时,算法的时间性能。例如,T(n)=3n2-5n+10000=O(n2),本质上讲,是一种最高数量级的比较,55,一个没有循环的算法的基本运算次数与问题规模n无关,记作O(1),也称作常数阶。一个只有一重循环的算法的基本运算次数与问题规模n的增长呈线性增大关系,记作O(n),也称线性阶。其余常用的还有平方阶O(n2)、立方阶O(n3)、对数阶O(log2n)、指数阶O(2n)

21、等。,56,各种不同数量级对应的值存在着如下关系:O(1)O(log2n)O(n)O(n*log2n)O(n2) O(n3)O(2n)O(n!),57,例1.4 求两个n阶方阵的相加C=A+B的算法如下,分析其时间复杂度。#define MAX 20 /*定义最大的方阶*/void matrixadd(int n,int AMAXMAX,int BMAXMAX,int CMAXMAX) int i,j;for (i=0;in;i+)for (j=0;jn;j+) Cij=Aij+Bij; ,58,该算法中的基本运算是两重循环中最深层的语句Cij=Aij+Bij,分析它的频度,即:T(n)=O(

22、n2),59,例1.5 分析以下算法的时间复杂度。int fun(int n)int i,j,k,s; s=0;for (i=0;i=n;i+) for (j=0;j=i;j+) for (k=0;k=j;k+) s+; return(s);,基本语句或基本操作,60,解:该算法的基本操作是语句s+,其频度:T(n)= =O(n3) 则该算法的时间复杂度为O(n3)。,61,例1.6 分析以下算法的时间复杂度。 int i=1; /1while (in) i=i*2; /2 ,解: 语句1的频度是1, 设语句2的频度是f(n), 则:2f(n)=n, 所以f(n)=log2n 取最大值f(n)

23、= log2n,T(n)=O(log2n ),62,例1.7 有如下算法:void fun(int a,int n,int k) /*数组a共有n个元素*/int i;if (k=n-1)for (i=0;in;i+)printf(“%dn“,ai);else for (i=k;in;i+)ai=ai+i*i;fun(a,n,k+1); 调用上述算法的语句为fun(a,n,0),求其时间复杂度。,63,解:设fun(a,n,0)的时间复杂度为T(n),则fun(a,n,k)的执行时间为T1(n,k),由fun()算法可知:T1(n,k)=n 当k=n-1时T1(n,k)= (n-k)+T1(n

24、,k+1) 其他情况则T(n)=T1(n,0)=n+T1(n,1)=n+(n-1)+T1(n,2)=n+(n-1)+2+T1(n,n-1)=n+(n-1)+ +2+n=O(n2)所以调用fun(a,n,0)的时间复杂度为O(n2)。,64,空间复杂度是对一个算法在运行过程中临时占用的存储空间大小的量度,一般也作为问题规模n的函数,以数量级形式给出,记作:S(n) = O(g(n)若所需额外空间相对于输入数据量来说是常数,则称此算法为原地工作。若所需存储量依赖于特定的输入,则通常按最坏情况考虑。,1.3.2 算法空间复杂度分析,返回,65,例1.8 分析例1.4和例1.5的空间复杂度。解:由于这

25、两个算法中临时变量的个数与问题规模n无关,所以空间复杂度均为O(1)。,66,1.4 数据结构算法程序,数据结构对算法的影响主要在两方面 (1)数据结构的存储能力数据结构存储能力强、存储信息多算法将会较好设计(时间少),存储空间大。时间和空间的平衡(时空折中) (2)定义在数据结构上的操作在数据结构上定义基本操作算法调用这些基本操作。,67,基本操作越完整,算法设计就越容易,算法,基本操作,基本算法,应用程序,应用程序是通过调用基本算法实现的,68,选择数据结构需要考虑的几个方面: (1)数据结构要适应问题的状态描述 (2)数据结构应与所选择的算法相适应 (3)数据结构的选择同时要兼顾程序设计

26、的方便 (4)灵活应用已有知识,69,例如,有若干学生数据(学生数小于50),每个学生数据包含学号(每个学生学号是惟一的,但学生记录不一定按学号顺序存放)、姓名、班号和若干门课程成绩(每个学生所选课程数目可能不等,但最多不超过6门)。要求设计一个程序输出每个学生的学号、姓名和平均分以及每门课程(课程编号从16)的平均分。,70,设计方案1:将学生的全部数据项放在一个表中,一个学生的全部数据对应一条记录。由于课程最多可选6门,对应的成绩项也应有6个。对应的数据结构如下:struct stud int no; /*学号*/char name10; /*姓名*/int bno; /*班号*/int

27、deg1; /*课程1分数*/int deg2; /*课程2分数*/int deg3; /*课程3分数*/int deg4; /*课程4分数*/int deg5; /*课程5分数*/int deg6; /*课程6分数*/;,71,特点: 存储空间:中(若学生没有选该课程,对应空间仍存在) 算法时间:少 算法简洁性差:算法完全依赖数据结构,72,设计方案2:将学生的全部数据项放在一个表中,但一个学生的一门课程成绩对应一条记录。这样成绩项只需要一个,为了区分不同课程成绩,需增加一个课程编号项。对应的数据结构如下:struct stud int no; /*学号*/char name10; /*姓名

28、*/int bno; /*班号*/int cno; /*课程编号*/int deg; /*课程分数*/;,73,74,特点: 存储空间:大 算法时间:多 算法简洁性:好,75,设计方案3:将学生的学号、姓名和班号放在一个表中,将成绩数据放在另一个表中,两者通过学号关联。前者一个学生对应一个记录,后者一门课程成绩对应一条记录。对应的数据结构如下:struct stud1 int no; /*学号*/char name10; /*姓名*/int bno; /*班号*/;struct stud2 int no; /*学号*/int cno; /*课程编号*/int deg; /*分数*/;,76,77,特点: 存储空间:少 算法时间:中 算法简洁性:好,78,数据结构,算法,数据类型,i,j,k,求解问题编写程序的代码:ijk种,优 选,最佳程序设计方案,本课程的目标,79,本章小结本章介绍了数据结构的基本概念,主要学习要点如下:(1) 数据结构的定义,数据结构包含的逻辑结构、存储结构和运算三方面的相互关系。(2) 各种逻辑结构即线性结构、树形结构和图形结构之间的差别。,80,(3) 数据结构和数据类型的差别和联系。(4) 算法的定义及其特性。(5) 算法的时间复杂度和空间复杂度分析。,练习题1:习题3、习题5。 课外上机复习:熟悉VC+6.0环境,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报