数据结构实用教程讲课教案.pdf
《数据结构实用教程讲课教案.pdf》由会员分享,可在线阅读,更多相关《数据结构实用教程讲课教案.pdf(84页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、这次由本人主讲的数据结构(本科)IP课程共分为10讲,每讲大致为50分钟。第一讲数据结构概述第二讲集合与线性表第三讲栈和队列第四讲二叉树第五讲二叉搜索树和堆第六讲平衡二叉树第七讲图的概念和存储结构第八讲二分查找和散列查找第九讲选择排序第十讲 快速排序和归并排序第一讲数据结构概述一、数据结构的分类二、数据结构的定义三、数据结构的图形表示四、数据结构的二元组表示五、数据结构的应用实例六、算法的时间复杂度一、数据结构的分类数据结构又分为数据的逻辑结构和数据的存储结构这两个方面,我们时常把数据的逻辑结构简称为数据结构,而在讨论数据的存储结构时则必须指明是数据的存储结构。数据结构的分类:这里是指数据的逻
2、辑结构的分类。总体来说数据的逻辑结构被分为集合结构、线性结构、树结构和图结构等四种基本类型。对于一些复杂的数据结构可以由这四种基本的数据结构,根据实际需要进行组合或嵌套所构成。数据的存储结构分类:被分为顺序、链接、索引和散列四种,由它们的组合和嵌套可以构成更复杂的存储结构。广义的数据结构的概念还包含对数据进行的各种运算,通常有插入、删除、查找、更新、排序、遍历等运算.二、数据结构的定义1、集合结构集合结构是指数据中各元素之间没有任何次序。如一个容器中的所有乒乓球,一个俱乐部里的所有成员,可以认为它们之间没有任何次序,它们均为集合结构。2、线性结构线性结构是指数据中各元素之间具有1对 1 的先后
3、次序关系。如在一个列车时刻表中,各车次记录之间是按照发车时间的先后次序排列的;在一个人事职工表中,各职工记录之间是按照职工编号的先后次序排列的。所以,它们的表结构都是线性结构。3、树结构树结构是指数据中各元素之间具有1对多的先后次序关系,并且只有一个元素称为树根结点,其余均为树枝结点和树叶结点。如在一个企业的组织机构中,总经理只有一个,相当于是树根;它下属多个部门,每个部门又各有一个部门经理,相当于是树枝;每个部门又有多名员工,属于部门经理领导,相当于是树叶。所以,企业的组织结构是一个树结构。4、图结构图结构是指数据中各元素之间具有多对多的关系。这是数据结构中最复杂的结构。如在一个城市交通图中
4、,所有道路连接成一个复杂的图结构,交叉路口就是图中的顶点,每条道路就是图中的边,从一个交叉路口可以到达与其连接的其他交叉路口。三、数据结构的图形表示各种数据结构类型的图形表示如下:(b)线性结构(d)图结构从图形表示中可以清醒地看出:集合结构中的元素是各自独立的,元素之间没有联系.线性结构中的元素是一个接一个串联起来的,它有一个头元素A和一个尾元素G,其余为中间元素;每个中间元素既有前驱元素,又有后继元素,如B的前驱元素为A,后继元素为C;C的前驱元素为B,后继元素为D,,头元素A没有前驱元素,只有后继元素B;尾元素G只有前驱元素F,没有后继元素。树结构的图形表示象倒着画的一棵树,树中有一个树
5、根元素A,它 有3个后继元素,又称为A的孩子结点B、C和D,C结点有两个孩子E和F,D结点有一个孩子G,由于B、E、F、G没有孩子,所以称它们为叶子结点,而A、C、D被称为树枝结点或分支结点,同时A又是唯一的一个树根结点。在树结构中,树根结点只有后继结点,而没有前驱结点;如A为树根结点,它没有前驱结点,或者说其前驱结点为空,它有后继结点为B、C和D;除树根结点外,每个结点都有唯一一个前驱结点,又称为是父结点或双亲结点;如C的前驱结点为A,G的前驱结点为D,每个结点的前驱结点即双亲结点,从图形中都能够很容易得到。在图结构中,每个结点或称顶点都可以有任意多个前驱结点和任意多个后继结点.如(d)图所
6、示的图中,顶 点A没有前驱结点,或者说它有0个前驱结点,A有3个后继结点B、C和G;G有2个前驱结点A和D,有一个后继结点F;E有一个前驱结点C和0个后继结点,或者说,E没有后继,对于图形中的其他结点都能够很容易得到其前驱和后继结点。从数据结构的图形表示中还可以清楚地看出:树结构是图结构的特例,若在图结构中,每个结点的前驱不能有任意多个,而只能有一个,并且只能有一个结点没有前驱,则就成为了树结构;线性结构是树结构的特例,若在树结构中,每个结点不能有任意多个后继,而只能有一个后继,则就成为了线性结构。为了区别于线性结构,时常把树结构和图结构称为非线性结构。四、数据结构的二元组表示数据结构的二元组
7、表示采用B=(K,R)的形式,其中第一元K给出数据结构中所有元素的集合,第二元R给出数据结构中所有元素具有的二元关系的集合,通常对每个二元关系分别进行讨论,所以直接用R表示这一种二元关系,该二元关系是有序对的集合,又称是序偶的集合,每个有序对(即序偶)是用一对尖括号括起来的、具有前驱和后继关系的两个元素.对于前面图形中给出的四种数据结构,下面分别讨论它们的二元组表示。集合结构中的元素集合K和二元关系R分别为:K=A,B,C,D,E,F,G)R=)因为集合中的元素为孤立顶点,它们之间没有前驱和后继的关系,所以对应的二元关系为空。线性结构中的元素集合K和二元关系R分别为:K=A,B,C,D,E,F
8、,G R=,因为A和B构成一对前驱和后继关系,对应图形中的一条有向边,它的起点为A,终点为B,它就构成了 R中的一个有序对,同理,B和C、C和D等都是R中的有序对。由于该线性结构包含有7个元素,所以二元关系R中共含有6个有序对。树结构中的元素集合K和二元关系R分别为:K=A,B,C,D,E,F,G R=,因为A和B构成一对前驱和后继关系,所以它是R中的一个有序对,同理,A和C、A和D等都是R中的有序对。由于该树结构包含有7个元素,所以二元关系R中共含有6个有序对,即每个元素对应唯一一个有序对,并且是有序对中的后继元素,而树根结点没有对应的、作为后继元素的有序对。所以当一棵树具有n个结点时,它必
9、然具有n-1个有序对,对应图形中为n-1条有向边。图结构中的元素集合K和二元关系R分别为:K=A,B,C,D,E,F,G R=,)在线性结构和树结构中,若元素个数为n,则有序对个数必然为n-1;而在图结构中不存在这种对应的关系,也就是说,其有序对的个数又称有向边数可能大于、等于或小于n-1。在这个图结构的例子中,元素个数为7个,边数为8个。五、数据结构应用实例下面为某个公司的职工简表职工号姓名性别出生日期职务部门01万明华男1962-03-20经理02赵 宁男1968-06-14主管销售部03张 利女1964-12-07主管财务部04赵书芳女1972-08-05主任办公室05刘永年男1959-
10、08-15科员销售部06王明理女1975-04-01科员销售部07王 敏女1972-06-28科员财务部0 8张 才男1 9 6 7-0 3-1 7科员财务部0 9马立仁男1 9 7 5-1 0-1 2科员财务部1 0邢怀常男1 9 7 6-0 7-0 5科员办公室该表中包含有10条职工记录,每条记录都由六个数据项所组成,由于每条记录的职工号各不相同,所以可把每条记录的职工号作为该记录的关键字,并在下面的讨论中,用记录的关键字来代表整个记录。对于上面所述的一张表,假定不考虑该表中记录之间的任何次序,则该表中的数据就是一个集合结构,对应的记录集合以及二元关系为:K=01,02,03,04,05,
11、06,07,08,09,10R=)若考虑到该表中的职工记录是按照职工号从小到大有序排列的这个特点,则这个职工表又是一个线性结构,其中表头元素为01号职工,接着为02号职工,依次类推,表尾元素为10号职工。该线性结构包含的记录集合和二元关系为:K=01,02,03,04,05,06,07,08,09,10R=,有时需要按职工的出生日期进行数据结构的定义和处理,则可以把表中的所有职工看作是按照出生日期,从小到大有序的,由此对应的数据结构也是一种线性结构,其 中05号职工的出生日期最早,即年龄最大,为表头元素,01号职工年龄次之,为这种线性结构中的第二个元素,依次类推,10号职工的出生日期最晚,为表
12、尾元素。该线性结构包含的记录集合和二元关系为:K=01,02,03,04,05,06,07,08,09,10R=,)对应的图形表示为::碱 一 1 03 08 1同 从图形表示中能够清楚地看出每个职工出生日期的先后排列次序。在上面职工表中,还存在职工人员之间领导与被领导的关系,其 中01号职工为经理,直接领导0 2、0 3和0 4号职工,他们分别是相应部门的主管,0 2号职工直接领导0 5和0 6号职工,0 3号职工直接领导07、0 8和0 9号职工,0 4号职工直接领导1 0号职工。由此可知,该职工表是一种树结构,包含的职工集合和二元关系分别为:K=0 1,0 2,0 3,0 4,0 5,0
13、 6,0 7,0 8,0 9,1 0)R=,对应的图形表示为:若要反映职工之间的好友关系,假 定0 1和0 2号职工是好友,0 1和0 4号是好友,0 2和0 3、0 2和0 6、0 2和0 7、0 3和0 7、0 4和0 6、0 5和0 7之间是好友,则反映这种好友关系的数据结构是图结构,二元组中的元素集合和有序对集合分别为:K=0 1,0 2,0 3,0 4,0 5,0 6,0 7,0 8,0 9,1 0 R=,对应的图形表示如下面左图所示,其 中0 8、0 9和1 0号职工无好友,在图形中为孤立顶点,省略未画;图形中每对顶点之间的两条相反的有向边,表示这两个顶点职工是一对好朋友,为了简化
14、起见,两条相反的有向边可以用一条无向边来代替,隐含着该无向边是双向的,即连接的两个顶点互为前驱和后继,则对应的无向图表示如下面右图所示。从上面左图可以看出,R是K上的对称关系,即若存在这个序偶,则必然存在这个序偶与之对应。为了简化起见,我们在二元组表示中把和这两个对称序偶用一个无序对(x,y)或(y,x)来代替,这样R关系可改写为:R=(0 1,0 2),(0 1,0 4),(0 2,0 3),(0 2,0 6),(0 2,0 7),(0 3,0 7),(0 4,0 6),(0 5,0 7)可见R成为了一个无序对的集合,其中的每个元素为用圆括号括起来的一个无序对,对应图形中的一条无向边,由无向
15、边构成的图形称为无向图,反之为有向图。六、算法的时间复杂度算法的时间复杂度是一个算法运行时间的相对量度。一个算法的运行时间是指在计算机上从开始到结束运行所花费的时间长短,它大致等于计算机执行一种简单操作(如赋值、比较、计算、转向、返回、输入、输出等)所需的时间与算法中进行简单操作次数的乘积.因为执行一种简单操作所需的时间随机器而异,它是由机器本身硬软件环境决定的,与算法无关,所以我们只讨论影响运行时间的另一个因素一一算法中进行简单操作次数的多少。不管一个算法是简单还是复杂,最终都是被编译后分解成简单操作再通过C P U 来具体执行的。因此,每个算法都对应着一定的简单操作的次数。显然,在一个算法
16、中,进行简单操作的次数越少,其运行时间也就相对地越短;次数越多,其运行时间也就相对地越长。所以,通常把算法中包含简单操作次数的多少叫做该算法的时间复杂度,或者叫做时间复杂性,用它来衡量一个算法的运行时间性能或称计算性能。若解决一个问题的规模为n,即表示待处理的数据中包含有n 个元素,则算法的时间复杂度通常是n 的一个函数,假定记为f(n)。算法的时间复杂度通常采用数量级的形式表示,所以求一个算法的时间复杂度只要分析清楚算法中主要的循环体内简单操作的执行次数,或递归函数的调用次数即可。例如,对于一个含有n 土 C次循环的算法,其 中 n 表示待处理问题的规模,C是一个常量,n C,则该算法的时间
17、复杂度为0(n);对于一个含有双重循环的算法,循环次数的主体呈现在/数量级上,所以则该算法的时间复杂度为0(/)。算法的时间复杂度通常具有 0(1)、0(V n)、0(n).0(l o g2n),0(n*l o g2n),0(/)、0 35、0(2 )和 0(n!)等形式。其 中 0(1)表示算法的时间复杂度为常量,它不随数据量n 的改变而改变,如访问一个数据表中第一个元素时,无论该表的大小如何,其时间复杂度均为0(1)。0 (新)表示算法的时间复杂度与数据量大小n 的平方根成正比,如计算满足不等式 k nk=l中的最大i 值时,其算法的时间复杂度就是0 ()。具有0(n)数量级的算法被称为具
18、有线性数量级的算法,其运行时间与n 成正比,如对一个表进行顺序查找时,其时间复杂度就是0(n)。有一些算法的时间复杂度为0(l o g m),即与n 的对数成正比,如在有序表上进行二分查找的算法就是如此。对数组进行简单插入或选择排序的算法的时间复杂度为0(/),当 n加倍时,其运行时间将增长4 倍。一个算法的时间复杂度还可以具体分为最好、最差和平均三种情况来讨论。下面结合从一维数组a n 中顺序查找其值等于给定值i t e m 的元素的算法进行说明。i nt Se qu e nc e Se a rc h (i nt a ,i nt n,i nt i t e m)若查找成功则返回元素的下标,否则
19、返回-1。(f o r(i nt i=0;i n;i+)i f (a i =i t e m)re t u rn i;re t u rn-1;)此算法的时间复杂度主要取决于f o r循环体被反复执行的次数。最好情况是第一个元素a 0 的值就等于i t e m,此时只需要进行元素的一次比较就查找成功,相应的时间复杂度为0(1);最差情况是最后一个元素a nT 的值等于i t e m,此时需要进行同全部n 个元素的比较才能查找成功,相应的时间复杂度为0(n);平均情况是:每一个元素都有相同的概率(即均 为,)等 于 给 定 值 i t e m,则 查 找 成 功 需 要 同 元 素 进 行 比 较
20、的 平 均 次 数 为nn:Z i =;5 +D,相应的时间复杂度为0(n),它同最坏情况具有相同的数量级,因为它z =l们之间的比较次数只在n 的系数项和常数项上有差别,而在n 的指数上没有差别。当在数组a 上顺序比较所有n 个元素后仍找不到等于给定值item 的元素,则表明查找失败,这种情况所对应的时间复杂度也为0(n)o对于许多算法来说,平均和最差这两种情况下的时间复杂度的数量级形式往往是相同的,它们主要是差别在最高次赛的系数上。另外有一些算法,其最好、最差和平均情况下的时间复杂度或相应的数量级都是相同的,如求出n 个元素平均值的算法就是如此,其时间复杂度的最好、最差和平均情况均为0(n
21、).上面从数据结构的分类、数据结构的定义、数据结构的二元组表示、数据结构的图形表示、数据结构的应用举例等多个方面,对数据结构的含义进行了详细地阐述,以便使同学们能够更好地利用数据结构组织数据和处理问题。这一讲也同时简要地介绍了算法的时间复杂度,与时间复杂度相类似的还有算法的空间复杂度,它是算法在运行过程中临时占用内存空间大小的相对量度,它也有常量级0(1)、平方根级0(五)、线性级0(n)、平方级0(/)、对数级O(logji)等不同级别。例如,对于下面的算法:int f(int n)if(n 0。当n=0 时则为空集。若集合为空,则表示为 ,若非空则表示为:(3 1,a.2,a i,Hi+i
22、,a j其中每个元素的下标为对该元素的编号,它是为了区别而任意标注的,不代表任何次序。因为集合中的元素可以按任何次序排列,假定就按元素前后位置编号的次序排列,那 么 a 1就是集合中的第一个元素,a?就是集合中的第二个元素,a i 就是第i 个元素,a。就是第口个(即最后一个)元素。集合中不含有任何关系,或者说含有的关系为空。集合中的元素类型可以为任何一种类型,假定用标识符E l e m T y p e 表示。若实际的元素类型为某一具体类型,如 整 型 i n t,则可以通过如下语句把E l e m T y p e 类型等价定义为i n t类型。T y p e d e f i n t E l
23、e m T y p e;二、集合的抽象数据类型集合的抽象数据类型包括数据和操作两个部分.数据部分为一个集合,假定用标识符S表示。操作部分包含对集合进行的各种常用运算,如初始化一个集合,向集合中插入一个元素,从集合中删除一个元素,从集合中查找一个元素等。集合结构的抽象数据类型可定义如下:ADT SET i s /其中SET表示集合的抽象数据类型名Dat a:表明为数据部分一个集合SO p e r at i o n:/表明为操作部分v o i d I n i t Se t (&S)/初始化集合为空bo o l I n s e r t Se t (&S,i t e m);/向集合中插入一个元素bo
24、o l De l e t e Se t (&S,i t e m);/从集合中删除一个元素bo o l Fi n d Se t (&S,&i t e m);从集合中查找一个元素.还有其他对集合的运算e n d SET初始化集合、向集合中插入元素和从集合中删除元素等,都需要改变集合的状态,所以函数中的集合参数S 必须定义为引用参数,这样才能够把运算后的结果反映到实参变量上,当从集合中查找元素时,它不会改变集合的状态,所以其集合参数可以使用引用参数,也可以使用值参数,若使用值参数,将会花费时间用来实现实参向值参变量的内容复制上,所以对集合的查找也最好采用引用参数为宜。另外,为了保护引用参数的值在查找
25、过程中不被改变,可以使用常量引用,即在引用参数前加上const保留字。三、集合的顺序存储结构和操作实现集合的顺序存储结构就是把集合中的所有元素,按照一定的次序顺序存储到内存中一块连续的存储空间中。我们知道,一个数组空间是内存的一块连续的存储空间,该空间中的存储位置是按照数组下标的次序顺序排列的,所以只要按照集合元素的编号次序把每个元素存储到数组中相应下标的存储位置,就实现了集合的顺序存储结构。假定用标识符set指向动态分配的数组空间,用标识符len表示集合当前长度的变量,用标识符MaxSize表示数组空间的大小,即数组中下标位置的个数,则集合的顺序存储结构类型,定义如下:struct SetS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实用教程 讲课 教案
限制150内