《数据结构与算法第1章.ppt》由会员分享,可在线阅读,更多相关《数据结构与算法第1章.ppt(84页珍藏版)》请在三一办公上搜索。
1、教材和参考书,教材:数据结构(C语言版)严蔚敏,吴伟民参考书:数据结构与算法教程 李春葆,C语言 数据结构 软件工程,掌握基本编程方法,掌握数据组织和数据处理的方法,掌握大型软件开发方法,学习识字,学习写作文,学习写小说,基本要求,课程关系,与语文学习过程类比,前期课程,数据结构,计算机基础C语言离散数学,后期课程,操作系统编译原理数据库原理软件工程,承上启下,作业及考核,作业:时间:周五数量:每次交一半,单双号考核:笔试:70-80%作业:20-30%,课件,帐号:courseware_ds密码:123456,联系方式,盛立杰电话邮件,第1章 绪论,1.1 什么是数据结构(定义)1.2 数据
2、结构的内容1.3 算法1.4 算法描述的工具1.5 对算法作性能评价1.6 关于学习数据结构,第一章 绪论,计算机的应用:,科学计算;,控制、管理及数据处理等非数值计算的处理工作;,计算机加工的对象:,纯粹的数值;,文本、表格和图像数据;,如何表示、处理这些新的、具有一定结构的数据?,数据结构是一门什么课程,数据结构是一门研究非数值计算的程序设计问题时处理的操作对象以及它们之间的关系和操作等等的学科。,解决数值计算问题的中心:建立适当的数学模型。,解决非数值计算问题的中心:寻找适当的数据结构。,数值问题:,非数值问题:,数据结构:线性表。,例2,计算机和人对奕问题。,计算机可以根据当前棋盘格局
3、,来预测棋局发展的趋势,甚至最后结局。,数据结构:对弈树。,派生格局,例3,地图的着色问题。,对地图上的每个区域染一种颜色,并且要求相邻的两个区域不能具有相同颜色。,数据结构:图。,红,绿,绿,蓝,红,黑,绿,用最少的颜色染色,数学,计算机硬件,计算机软件,数据结构,1.数据(Data),对客观事物的符号描述,能输入到计算机中并被计算机程序处理的符号的总称;能被计算机识别、存储和加工处理的信息的载体。,例,数字:自然数、整数字母:a z,单词图像:视频、音频信号等表格:,2.数据元素(Data Element)数据元素是组成数据的基本单位,是数据集合的个体,在计算机中通常作为一个整体进行考虑和
4、处理。,例,“对弈树”中的一个格局书目信息中的一条书目,数据项:一个数据元素可由若干个数据项组成。,例,一条书目信息是由书名、作者名、分类等多个数据项组成的,数据项是数据的不可分割的最小单位。,例如 有一个学生表如下所示。这个表中的数据元素是学生记录,每个数据元素由四个数据项(即学号、姓别、性别和班号)组成。,3.数据结构(Data Structure)数据结构是指相互之间存在一种或多种特定关系的数据元素集合,,结构(Structure)数据元素相互之间的关系。,在形式上可用二元组表示:Data_Structure=(D,S)D:数据元素的有限集 S:D上关系的有限集,D=ki|1in,n0k
5、i表示集合D中的第i个结点或数据元素n为D中结点的个数若n=0,则D是一个空集,表示D无结构可言,有时也可以认为它具有任意的结构,S=rj|1jm,m0rj 表示集合S中的第j个二元关系(简称关系)m为S中关系的个数若m=0,则S是一个空集,表明集合D中的元结点间不存在任何关系,彼此是独立的,例如,用二元组表示学生表,学生表中共有7个结点,依次用k1k7表示,则对应的二元组表示为Data_Structure=(D,S)其中:D=k1,k2,k3,k4,k5,k6,k7 S=,逻辑结构图:可以将数据结构用图形形象地表示出来,图形中的每个结点对应着一个数据元素,两结点之间的连线对应着关系中的一个序
6、偶。上述“学生表”数据结构用下图的图形表示。,例1,内部关系,复数Complex=(C,R),其中:C是含两个实数的集合c1,c2;R=P,而P是定义在集合C上的一种关系,其中有序偶表示c1是复数的实部,c2是复数的虚部。,其中:C是数据记录的集合ai;R=P,而P是定义在集合C上的一种关系,其中有序偶表示ai-1是ai的直接前驱元素,ai是ai-1的直接后继元素。,例3、设数据的结构描述如下:Tree=(D,R)D=1,2,3,4,5,6R=,画出其逻辑结构图?,1.2 数据结构的内容,逻辑结构 数据元素之间的关系。,逻辑结构可看作是从具体问题抽象出来的数学模型。,按照逻辑关系的不同特性分类
7、:集合:(同属于一个集合)线性结构:(一对一)非线性结构:树型结构:(一对多)图形结构:(多对多),逻辑结构类型的分类,(1)线性结构 所谓线性结构,该结构中的结点之间存在一对一的关系。其特点是:开始结点和终端结点都是惟一的,除了开始结点和终端结点以外,其余结点都有且仅有一个前驱结点,有且仅有一个后继结点。顺序表就是典型的线性结构。,逻辑结构类型,(2)非线性结构 所谓非线性结构,该结构中的结点之间存在一对多或多对多的关系。它又可以细分为树形结构和图形结构两类。,所谓树形结构,该结构中的结点之间存在一对多的关系。其特点是每个结点最多只有一个前驱,但可以有多个后继,可以有多个终端结点。非线性结构
8、树形结构简称为树。,UNIX文件系统的系统结构图,所谓图形结构,该结构中的结点之间存在多对多的关系。其特点是每个结点的前驱和后继的个数都可以是任意的。因此,可能没有开始结点和终端结点,也可能有多个开始结点、多个终端结点。图形结构简称为图。,2.存储结构(物理结构)逻辑结构在计算机中的存储映象,是逻 辑结构在计算机中的实现,它包括数据元素的表示和关系的表示。,顺序存储结构非顺序存储结构(链式存储结构)索引存储结构散列存储结构,例如 用顺序存储法和链式存储法表示下面的学生表。,用顺序存储法存放学生表的结构体定义为:struct Stud int no;/*学号*/char name8;/*姓名*/
9、char sex2;/*性别*/char class4;/*班号*/Studs7=1,“张斌”,“男”,“9901”,5,王萍,女,9901;,结构体数组Studs各元素在内存中按顺序存放,即第i(1i6)个学生对应的元素Studsi存放在第i+1个学生对应的元素Studsi+1之前,Studsi+1正好在Studsi之后。,用链式存储法存放学生表的结构体定义为:typedef struct node int no;/*学号*/char name8;/*姓名*/char sex2;/*性别*/char class4;/*班号*/struct node*next;/*指向下个学生的指针*/Stu
10、dType;,学生表构成的链表如右图所示。其中的head为第一个数据元素的指针。,学生表构成的链表,链式存储法的缺点:存储空间占用大无法随机访问链式存储法的优点:便于修改(插入、删除、移动),逻辑结构与存储结构的关系存储结构是逻辑结构用计算机语言的实现;如何用计算机语言表示数据元素之间的各种关系。存储结构是逻辑关系的映象与元素本身的映象。逻辑结构是数据结构的抽象,存储结构是数据结构的实现,两者综合起来建立了数据元素之间的结构关系。,3.数据的运算就是施加于数据的操作,如查找、添加、修改、删除等。在数据结构中运算不仅仅实加减乘除这些算术运算,它的范围更为广泛,常常涉及算法问题。举例:线性表的初始
11、化、查找、插入、删除操作等算法的设计取决于选定的数据(逻辑)结构,而算法的实现依赖于采用的存储结构。抽象运算定义在逻辑结构上,而实现在存储结构上。,数据结构的内容可归纳为三个部分:逻辑结构、存储结构和运算集合。按某种逻辑关系组织起来的一批数据,按一定的映象方式把它存放在计算机的存储器中,并在这些数据上定义了一个运算的集合,就叫做数据结构。,数据类型 在用高级程序语言编写的程序中,必须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型。不同类型的变量,其所能取的值的范围不同,所能进行的操作不同。数据类型是一个值的集合和定义在此集合上的一组操作的总称。,如C/C+中的int就是整型数
12、据类型。它是所有整数的集合(在16位计算机中为32768到32767的全体整数)和相关的整数运算(如、等)。,(2)抽象数据类型 抽象数据类型(Abstract Data Type简写为ADT)指的是用户进行软件系统设计时从问题的数学模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算,而不考虑计算机的具体存储结构和运算的具体实现算法。,一个抽象数据类型的模块通常应包含定义、表示和实现三部分。,数据对象的定义,数据关系的定义,基本操作的定义,其中,数据对象、数据关系用伪码描述;基本操作定义格式为基本操作名(参数表)初始条件:初始条件描述操作结果:操作结果描述基本操作有两种参数:赋值参数只为操作提
13、供输入值;引用参数以&打头,除可提供输入值外,还将返回操作结果。“初始条件”描述了操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。“操作结果”说明了操作正常完成之后,数据结构的变化状况和应返回的结果。若初始条件为空,则省略之。,例如,定义抽象数据类型“复数”,数据对象:De1,e2e1,e2RealSet 数据关系:R1|e1是复数的实数部分,|e2 是复数的虚数部分,ADT Complex,基本操作:,AssignComplex(&Z,v1,v2)操作结果:构造复数 Z,其实部和虚部 分别被赋以参数 v1 和 v2 的值。,DestroyComplex(&Z
14、)操作结果:复数Z被销毁。,GetReal(Z,&realPart)初始条件:复数已存在。操作结果:用realPart返回复数Z的实部值。,GetImag(Z,&ImagPart)初始条件:复数已存在。操作结果:用ImagPart返回复数Z的虚部值。,Add(z1,z2,&sum)初始条件:z1,z2是复数。操作结果:用sum返回两个复数z1,z2 的 和值。,ADT Complex,#include#include complex.h void main(),complex z1,z2,z3,z4,z;float RealPart,ImagPart;InitComplex(z1,8.0,6.
15、0);InitComplex(z2,4.0,3.0);Add(z1,z2,z3);Multiply(z1,z2,z4);if(Division(z4,z3,z)GetReal(z,RealPart);GetImag(z,ImagPart);/if,ADT 有两个重要特征:,数据抽象,用ADT描述程序处理的实体时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法),数据封装,将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节,抽象数据类型的表示和实现,抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现。,例如,对以上定义的
16、复数,typedef struct float realpart;float imagpart;complex;,/-存储结构的定义,/-基本操作的函数原型说明,void Assign(complex&Z,float realval,float imagval);/构造复数 Z,其实部和虚部分别被赋以参数/realval 和 imagval 的值,float GetReal(cpmplex Z);/返回复数 Z 的实部值,float Getimag(cpmplex Z);/返回复数 Z 的虚部值,void add(complex z1,complex z2,complex&sum);/以 su
17、m 返回两个复数 z1,z2 的和,/-基本操作的实现,void add(complex z1,complex z2,complex,其它省略,1.3 算 法,1.算法(Algorithm)的定义 Algorithm is a finite set of rules which gives a sequence of operation for solving a specific type of problem.(算法是规则的有限集合,是为解决特定问题而规定的一系列操作。),2.算法的特性(1)有穷性:有限步骤之内正常结束,不能形成无穷循环。(2)确定性:算法中的每一个步骤必须有确定含义,无
18、二义性。(3)可行性:原则上能精确进行,操作可通过已实现的基本运算执行有限次而完成。(4)输入:有多个或0个输入。(5)输出:至少有一个或多个输出。在算法的五大特性中,最基本的是有限性、确定性和可行性。,void exam1()n=2;while(n%2=0)n=n+2;printf(“%dn”,n);,void exam2()y=0;x=3/y;printf(“%d,%dn”,x,y);,违反了有穷性。,违反了可行性。,算法和数据结构是两个不可分割的统一体,程序=数据结构+算法,数据结构通过算法实现操作,算法根据数据结构设计程序,算法设计的要求:,正确性 正确反映需求(通过测试),可读性 有
19、助于理解、调试和维护,健壮性 完备的异常和出错处理,高效率与低存储的需求 时间、空间的要求,描述算法的方法自然语言:优点简单。缺点有歧异,表达复杂思想不明晰,不能和实现方式很好结合高级程序设计语言,如Pascal,C/C+,Java等。优点克服了自然语言的缺点,可直接执行。缺点对部分问题的描述比较烦杂,啰嗦*类语言。和高级程序设计语言类似,但是对其中一些比较烦杂的部分进行和简化(原因:算法主要目的是为了清晰的表述思想)*举例:两个数据a,b交换空间自然语言:交换a,b的存储空间;高级语言:x=a;a=b;b=x;类语言:ab;/交换空间,1.4 算法描述的工具,衡量算法效率的方法主要有两大类:
20、事后统计:利用计算机的时钟;事前分析估算:用高级语言编写的程序运行的时间主要取决于如下因素:算法;问题规模;使用语言:级别越高,效率越低;编译程序;机器;,1.5 对算法作性能评价,通常,从算法中选取一种对于研究的问题来说是基本操作的原操作,以该基本操作重复执行的次数作为算法执行的时间度量。,基本操作重复执行的次数分别为 1,n,n2,频度:语句重复执行的次数称为该语句的频度,记f(n)。,设算法的问题规模为n;,时间复杂度:算法执行时间度量,记T(n)=O(maxlevel(f(n)。,对算法各基本操作的频度求和,便可得算法的时间复杂度。,但实际中我们所关心的主要是一个算法所花时间的数量级,
21、即取算法各基本操作的最大频度数量级。,f(n)=1+n+n2+n3,T(n)=O(n3),O的数学定义:,若T(n)和f(n)是定义在正整数集合上的两个函数,则如果存在正常数C和n0,使得当nn0时,总满足0T(n)Cf(n),则记做T(n)=O(f(n)也就是只求出T(n)的最高阶(数量级),忽略其低阶项和常系数,这样既可简化T(n)的计算,又能比较客观地反映出当n很大时,算法的时间性能。,2个N*N矩阵相乘,for(i=1;i=n;+i)for(j=1;j=n;+j)cij=0;for(k=1;k=n;+k)cij+=aik*bkj;,n+1n(n+1)n2n2(n+1)n3,T(n)=O
22、(n3),(1)x=x+1;其时间复杂度为O(1),我们称之为常量阶;(2)for(i=1;i=n;i+)x=x+1;其时间复杂度为O(n),我们称之为线性阶;(3)for(i=1;i=n;i+)for(j=1;j=n;j+)x=x+1;其时间复杂度为O(n2),我们称之为平方阶。此外算法还能呈现的时间复杂度有对数阶O(log2n),指数阶O(2n)等。,常数阶对数阶线性阶线性对数阶平方阶立方阶K次方阶指数阶,常见的时间复杂度,按数量级递增排序:,例如:下列程序段:for(i=1;i=n;i+)for(j=i;j=n;j+)x+;语句x+的执行频度为 n+(n-1)+(n-2)+3+2+1=n
23、(n+1)/2而该语句执行次数关于n的增长率为n2,即时间复杂度为O(n2)。,5)最坏时间复杂度有时,算法中基本操作重复执行的次数随问题的输入不同而不同,通常分析最坏情况下的时间复杂度。,例,顺序查找算法,最好 1 次比较,最坏 n 次比较,平均(n+1)/2 次比较。,return FALSE;,6)算法的空间复杂度 关于算法的存储空间需求,类似于算法的时间复杂度,我们采用空间复杂度作为算法所需存储空间的量度,记作:S(n)=O(f(n),课程的基本结构分为四个部分:第一部分:数据结构的基本概念(第1章)。第二部分:基本的数据结构,包括:线性结构线性表、栈和队列、串、数组(第25章);非线
24、性结构树、图(第6、7章)。第三部分:基本技术,包括:查找技术与排序技术(第9、10章)。第四部分:算法设计技术。,数据结构,逻辑结构,存储结构,数据运算(算法),线性结构(线性表、栈和队列、串),非线性结构(广义表、树、图、文件),链式存储结构,顺序存储结构,索引存储结构,散列存储结构,作业数据结构题集 P7:(3、8、9、17),练习例1:设逻辑结构图如下,试给出其数据结构表示。,数据结构定义为:Data_Structure=(D,S)其中 D=a,b,c,d,e,f S=RR=(a,b),(a,c),(c,d),(c,e),(c,f),(d,f),例2:设n为正整数,利用大“O”记号,将
25、下列程序段的执行时间表示为n的函数,写出其时间复杂度。x=0;for(i=1;in;i+)for(j=1;j=n-i;j+)x+;,例3:计算机执行下面的语句时,语句S的执行次数为多少?for(i=1;i=i;j-)S;,例4:试说明下列计算过程是否是一个算法?(1)开始;(2)n=0;(3)n+;(4)重复(3);(5)结束;不具备算法的有穷性,不是一个算法。,C+语言中提供了一种引用运算符“&”,引用是个别名,当建立引用时,程序用另一个已定义的变量或对象(目标)的名字初始化它,从那时起,引用作为目标的别名而使用,对引用的改动实际就是对目标的改动。,例如:int a=4;/*a为普通的整型变
26、量*/int/*b是a的引用变量*/这里说明b变量是变量a的引用,b也等于4,之后这两个变量同步改变。当a改变时b也同步改变,同样,当b改变时a也同步改变。,引用常用于函数形参中,采用引用型形参时,在函数调用时将形参的改变回传给实参,例如,有如下函数(其中的形参均为引用型形参):void swap(int 当用执行语句swap(a,b)时,a和b的值发生了交换。,反之,有以下函数swap1(),当用执行语句swap1(a,b)时,a和b的值不会发生了交换。void swap1(int x,int y)int tmp=x;x=y;y=tmp;,在C语言中,由于不支持引用类型,所以采用指针的方式来回传形参的值,需将上述函数改为:int swap2(int*x,int*y)int temp;temp=*x;/*将x的值放在temp中*/*x=*y;/*将x所指的值改为*y*/*y=temp;/*将y所指的值改为temp*/上述函数的调用改为swap2(&a,&b),显然远不如采用引用方式简洁。所以后面很多算法都采用引用形式的形参。,