ImageVerifierCode 换一换
格式:DOC , 页数:15 ,大小:59.35KB ,
资源ID:11133220      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-11133220.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(自考02142《数据结构导论》串讲笔记.doc)为本站会员(精品资料)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

自考02142《数据结构导论》串讲笔记.doc

1、第一张 概论1.1 引言两项基本任务: 数据表示, 数据处理软件系统生存期:软件计划,需求分析,软件设计,软件编码,软件测试,软件维护由一种逻辑结构和一组基本运算构成的整体是实际问题的一种数学模型,这种数学模型的建立,选择和实现是数据结构的核心问题。机外表示- 逻辑结构 -存储结构处理要求- 基本运算和运算-算法1.2.1 数据,逻辑结构和运算数据:凡是能够被计算机存储,加工的对象通称为数据数据元素:是数据的基本单位,在程序中作为一个整体加以考虑和处理。又称元素、顶点、结点、记录。数据项:数据项组成数据元素,但通常不具有完整确定的实际意义,或不被当作一个整体对待。又称字段或域,是数据不可分割的

2、最小标示单位。1.2.2 数据的逻辑结构逻辑关系:是指数据元素之间的关联方式,又称“邻接关系”逻辑结构:数据元素之间逻辑关系的整体称为逻辑结构。即数据的组织形式。四种基本逻辑结构:1 集合:任何两个结点间没有逻辑关系,组织形式松散2 线性结构:结点按逻辑关系依次排列成一条“锁链 ”3 树形结构:具有分支,层次特性,形态像自然界中的树4. 图状结构:各个结点按逻辑关系互相缠绕,任何两个结点都可以邻接。注意点:1. 逻辑结构与数据元素本身的形式,内容无关。2. 逻辑结构与数据元素的相对位置无关3. 逻辑结构与所含结点个数无关。运算:运算是指在任何逻辑结构上施加的操作,即对逻辑结构的加工。加工型运算

3、:改变了原逻辑结构的“值” ,如结点个数,结点内容等。引用型运算:不改变原逻辑结构个数和值,只从中提取某些信息作为运算的结果。引用:查找,读取加工:插入,删除,更新同一逻辑结构 S 上的两个运算 A 和 B, A 的实现需要或可以利用 B,而 B 的实现不需要利用 A,则称 A 可以归约为 B。假如 X 是 S 上的一些运算的集合,Y 是 X 的一个子集,使得 X 中每一运算都可以规约为 Y 中的一个或多个运算,而 Y 中任何运算不可规约为别的运算,则称 Y 中运算(相对于 X)为基本运算。将逻辑结构 S 和在 S 上的基本运算集 X 的整体(S,X)称为一个数据结构。数据结构包括逻辑结构和处

4、理方式。1.3 存储实现和运算实现由于逻辑结构是设计人员根据解题需要选定的数据组织形式,因此存储实现建立的机内表示应遵循选定的逻辑结构。另一方面,由于逻辑结构不包括结点内容即数据元素本身的表示,因此存储实现的另一主要内容是建立数据元素的机内表示。按上述思路建立的数据的机内表示称为数据的存储结构。存储结构包括三部分:1. 存储结点,每个存储结点存放一个数据元素。2. 数据元素之间关联方式的表示,也就是逻辑结构的机内表示。3. 附加设施,如方便运算实现而设置的“哑结点”等。四种基本存储方式:1 顺序存储方式:每个存储结点只含一个数据元素。所有存储结点相继存放在一个连续的存储区里。用存储结点间的位置

5、关系表述数据元素之间的逻辑关系。2 链式存储方式:每个存储结点不仅含有一个数据元素,还包含一组指针。每个指针指向一个与本结点有逻辑关系的结点,即用附加的指针表示逻辑关系。3 索引存储方式:每个存储结点只含一个数据元素,所有存储结点连续存放。此外增设一个索引表,索引指示各存储结点的存储位置或位置区间端点。4 散列存储方式:每个结点含一个数据元素,各个结点均匀分布在存储区里,用散列函数指示各结点的存储位置或位置区间端点。1.3.2 运算实现运算只描述处理功能,不包括处理步骤和方法;运算实现的核心是处理步骤的规定,即算法设计。算法:算法规定了求解给定问题所需的所有处理步骤及其执行顺序,使得给定类型的

6、任何问题能在有限时间内被机械的求解。算法分类:1:运行终止的程序可执行部分:又称为程序2:伪语言算法:不可以直接在计算机上运行,但容易编写和阅读。3:非形式算法:用自然语言,同时可能还使用了程序设计语言或伪语言描述的算法。1.4 算法分析算法质量评价指标:1 正确性:能够正确实现处理要求2 易读性:易于阅读和理解,便于调试,修改和扩充3 健壮性:当环境发生变化,算法能够适当做出反应或处理,不会产生不需要的运行结果4 高效率:达到所需要的时空性能。如何确定一个算法的时空性能,称为算法分析一个算法的时空性能是指该算法的时间性能和空间性能,前者是算法包含的计算量,后者是算法需要的存储量。算法在给定输

7、入下的计算量:1 根据该问题的特点选择一种或几种操作作为“标准操作” 。2 确定每个算法在给定输入下共执行了多少次标准操作,并将此次数规定为该算法在给定输入下的计算量。若无特殊说明,将默认以赋值语句作为标准操作。最坏情况时间复杂性:算法在所有输入下的计算量的最大值作为算法的计算量平均时间复杂性:算法在所有输入下的计算量的加权平均值作为算法的计算量。算法的输入规模(问题规模)是指作为该算法输入的数据所含数据元素的数目,或与此数目有关的其他参数。常见时间复杂性量级:1 常数阶:O(1)即算法的时间复杂性与输入规模 N 无关或 N 恒为常数。2 对数阶:Olog 2 N 3 线性阶:O(N) 4 平

8、方阶:O(N 2)5 指数阶:O(2 N 次方)通常认为指数阶量级的算法实际是不可计算的,而量级低于平方阶的算法是高效率的第二章 线性表2.1 线性表的基本概念线性结构:线性结构是 N(N 大于等于 0)个结点的有穷序列。Ai 称为 Ai+1 的直接前驱,Ai+1 称为 Ai 的直接后继。为满足运算的封闭性,通常允许一种逻辑结构出现不含任何结点的情况。不含任何结点的线性结构记为()或线性结构的基本特征:若至少含有一个结点,则除起始节点没有直接前驱外,其他结点有且只有一个直接前驱,除终端结点没有直接后继外,其他结点有且只有一个直接后继。2.1.2 线性表线性表的逻辑结构是线性结构。所含结点个数称

9、为线性表的长度(表长) 。表长为 0 的是空表。线性表的基本运算:1 初始化 initiate(L): 加工型运算,其作用是建立一个空表 L。2 求表长 length(L):引用型运算,其结果是线性表 L 的长度。3 读表元 get(L,i):引用型运算。若 i 小于等于 length(L) ,其结果是 L 的第 i 个结点,否则为一特殊值。4 定位(按值查找)locate(L,X):引用型运算。若 L 中存在一个或多个值与 X 相等,结果为这些结点的序号最小值,否则,运算结果为 0。5 插入 insert (L,X,i):加工型运算。在 L 的第 i 个位置上增加一个值为 X 的新结点,参数

10、 i 的合法取值范围是 1-L+1。6 删除 delete(L,i):加工型运算。撤销 L 的第 i 个结点 Ai, i 的合法取值范围是 1-N。2.2 线性表的顺序实现2.2.1 顺序表顺序表是线性表的顺序存储结构,即按顺序存储方式构造的存储结构。顺序表基本思想:顺序表的一个存储结点存储线性表的一个结点的内容,即数据元素(不含其他信息) ,所有存储结点按相应数据元素间的逻辑关系决定的次序依次排列。顺序表的特点:逻辑结构中相邻的结点在存储结构中仍相邻。顺序表的类 C 语言描述:p17Const maxsize=顺序表的容量Typedef struct datatype date maxsiz

11、eInt last; sqlist;Sqlist L;L 表示线性表的长度,last-1 是终端结点在顺序表中的位置。常数 maxsize 为顺序表的容量。表长 L.last , 终端结点 L.dataL.last-12.2.2 基本运算在顺序表上的实现1 插入Void inset_sqlist (sqlist L,datatype x, int i) if (L.last = maxsize) error(表满 ); /*溢出*/If (iL.last+1) error (非法位置);For (j=L.last ; j=I; j-)L.dataj = L.data j-1; /*依次后移*/

12、L.datai-1 = x; /*置入*/L.last =L.last+1 /*修改表长*/2. 删除Void delete_sqlist ( sqlist L, int I ) /*删除顺序表 L 中第 i 个位置上的结点*/ If ( ( iL.last) error (非法位置);For ( j= i+1; j= L.last; j+)L.data j-2 = L.data j-1 ; /*依次前移,注意第一个 L.dataj-2存放 ai*/L.last=L.last-1 /*修改表长*/3 定位Int locate_sqlist (sqlist L , datatype X)/*在顺

13、序表中从前往后查找第一个值等于 X 的结点。若找到则回传该结点序号,否则回传 0*/I=1 ;While ( ( i next = NULL;return(t); 此算法说明的问题:1 语句 t = malloc(size); 有双重作用:1 由 malloc 自动生成一个类型为 node 的新结点。2 指针型变量 t得到一个值即指针,该指针指向上述新结点。2 要生成新结点必须通过调用 malloc 才能实现。3 语句 t - next=NULL 的作用是将头结点*t 的链域置为 NULL。4 为了建立一个空表,可定义一个 lklist 类型的变量 head,并通过调用 head =initi

14、ate_lklist( )使 head 成为指向一个空表的头指针。2 求表长Int length_lklist(lklist head) /*求表 head 的长度,P 是 pointer 类型的变量*/ p=head;J=0;While (p -next!=NULL) p=p-next;J+; Return (j ); 3 按序号查找Pointer find_lklist ( lklist head ,int I ) /*在单链表 head 中查找第 i 个结点。若找到则回传指向该结点的指针,否则回传 null*/ p= head; j=0;While ( p-next !=NULL) j+

15、; If (i=j) return (p);Else return(NULL); 4 定位Int locate_lklist ( lklist head, datatype x) p=head ; j= 0;While ( (p-next!=NULL) j+;If p-data =x return(j);Else return (0);5 删除Void delete_lklist ( lklist head, int i) p= find_lklist (head,i-1); /*调用按序号查找算法*/If (p!=NULL)p-next = q-next;free (q); else err

16、or(不存在第 i 个结点 ) free 是库函数,结果是释放 q 所指结点占用的内存空间,同时 q 的值变成无定义。6 插入Void insert_lklist( lklist head,datatyped x ,int i)P=find_lklist (head, i-1);If ( p=NULL)Error (不存在第 i 个位置)Else s= malloc (size); s-data= x;s-next=p-next;p-next =s; 2.5 其他链表循环链表尾结点的链域值不是 NULL,而是指向头结点的指针。优点是从任一结点出发都能通过后移操作而扫描整个循环链表。但为找到尾结

17、点,必须从头指针出发扫描表中所有结点。改进的方法是不设头指针而改设尾指针。这样,头结点和尾结点的位置为:rear-next-next 和 rear.双链表:在每个结点中增加一个指针域,所含指针指向前驱结点。双链表的摘除*P 的操作: p-prior-next=p-next;p-next-prior=p-prior;链入操作:P 后面链入*q: q-prior=p; q-next=p-next; p-next-prior=q; p-next =q;2.6 顺序实现与链接实现的比较空间性能的比较:存储结点中数据域占用的存储量与整个存储结点占用存储量之比称为存储密度。顺序表=1,链表top=0;Re

18、turn(1); 2. 进栈Int push(sqstackTp *sq, datatype x) if (s-top = sqstack_maxsize-1)error(“栈满”);return 0;Elsesq-top+;Sq-datasq-top=x;Return(1); 3 退栈Int pop(sqstackTp *sq,datatype *x)if (sq-top=0)error(“下溢”);return(0);Else *x=sq-datasq-top;Sq-top-;Return(1); 4 判栈空Int emptystack(stackTp *sq)if sq-top=0Ret

19、urn(1);Else return(0); 5 取栈顶元素Int gettop( sqstackTp *sq, datatype *x)if(sq-top=0) return(0);Else*x =sq-datasq-top;Return(1); 3.1.3 栈的链接实现链栈由栈顶指针 ls 唯一确定。栈中其他结点通过他们的 next 域链接起来。栈底结点的 next 域为NULL。因为链栈本身没有容量限制,所以不会出现栈满情况。3 1.5 栈的简单应用和递归栈与函数调用:函数调用时,先保存的位置后返回,后保存的位置先返回。所以每遇到一个函数调用便立刻将相应的返回位置进栈,调用结束时,栈顶元

20、素正好是此函数的返回位置。递归与栈:满足递归的条件:1 被定义项在定义中的应用具有更小的尺度。2 被定义项在最小尺度上的定义不是递归的。3.2 队列队列也可以看成一种受限的线性表,插入限定在表的某一端进行(队尾) ,删除限定在另一端进行(队头)队列又称先进先出线性表。队列的基本运算:1 队列初始化 initQueue(Q) 加工型运算,设置一个空队列 Q2 入队列 enQueue(Q,X)加工型运算,将 X 插入到队列 Q 的队尾。若原队列为空,则 X 为原队尾结点的后继,同时是新队列的队尾结点。3 出队 outQueue(Q,X)加工型运算,若队列 Q 不空,则将队头元素赋给 X,并删除队头

21、结点,其后继成为新的队头结点。4 判队列空 emptyQueue(Q) 引用型运算,若队列 Q 为空,则返回 1,否则为 05 读队头 gethead(Q,x)引用型运算,Q 不空时由参数 X 返回队头结点的值,否则给一特殊标志。队列的顺序实现:队列的顺序实现由一个一维数组及两个分别指示队头和队尾的变量组成,称为队头指针和队尾指针。约定队尾指针指示队尾元素在一维数组中的当前位置,队头指针指示队头元素在一维数组中的当前位置的前一个位置。如果按 sq.rear=sq.rear+1; sq.datasq.rear=x 和 sq.front=sq.front+1 分别进行入队和出队操作,则会造成“假溢

22、出。 ”循环队列的入队操作:sq.rear=(sq.rear+1)%maxsize; sq.datasq.rear=x出队操作:sq.front=(sq.front+1)%maxsize;判断循环队列队满的条件:(sq.rear+1)%maxsize)=sq.front队空的条件:sq.rear=sq.front3.3 数组二维数组可以看成是一个被推广的线性表,这种线性表的每一个数据元素本身也是一个线性表。数组只有两种基本运算:1 读:给定一组下标,读取相应的数据元素2 写:给定一组下标,修改相应的数据元素数组元素的存储位置是下标的线性函数,计算存储位置所需的时间取决于乘法的时间,因此,存取任

23、一元素的时间相等。通常将具有这一特点的存储结构成为随机存储结构。3.3.3 矩阵的压缩存储压缩存储的基本思想:值相同的多个元素只分配一个存储空间,零元素不分配空间。要压缩的矩阵分为两种1 特殊矩阵:对称矩阵,三角矩阵。值相同的元素或零元素的分布有一定规律叫特殊矩阵。对称矩阵通常存储下三角,n 阶方阵需要 n*(n+1)/2 个存储单元三角矩阵需要 n*(n+1)/2+1 个存储单元,最后一个单元存储相同的常数。2 稀疏矩阵:零元素远多于非零元素,且非零元素的分布没有规律。用三元组表存储稀疏矩阵,只存储非零元素。(I,j,aij)第四章 树4.1 树的基本概念树的定义:树是 n(n0)个结点的有

24、穷集合,满足:树是 n(n=0)个结点的有限集 T,满足:(1)有且仅有一个特定的称为根的结点;(2)其余的结点可分为 m(m=0)个互不相交的子集,T1,T2,T3Tm,其中每个子集 Ti 又是一棵树,并称其为子树。有关术语:树上任一结点所拥有的子树的数目称为该结点的度。度为 0 的结点称为叶子或终端结点。度大于 0 的结点称为非终端结点或分支点。一棵树中所有结点度的最大值称为该树的度。若结点 A 是 B 的直接前驱,则称 A 是 B 的双亲或父节点,称 B 为 A 的孩子或子节点。父节点相同的结点互称为兄弟。一棵树的任何结点(不包括根节点)称为根的子孙,根节点称为其他节点的祖先。结点的层数

25、(或深度)从根开始算,根的层数为 1,其他节点的层数为其双亲的层数加 1。树中结点层数的最大值称为该树的高度或深度。树的基本运算:1 求根 ROOT(T) 引用型运算,结果是树 T 的根结点。2 求双亲 PARENT (T,X) 引用型运算,结果是结点 X 在树 T 上的双亲,若 X 是树 T 的根或 X 不在 T 上,则结果为一特殊标志。3 求孩子 CHILD(T,X,I) 引用型运算,结果是树 T 上结点 X 的第 i 个孩子,若 X 不在 T 上或 X 没有第 i 个孩子,结果为一特殊标志。4 建树 CREATE (X,T1.,TK) ,K=1 ,加工型运算,建立一棵以 X 为根,以 T

26、1.TK 为第 1K 课子树的树。5 剪枝 DELETE(T,X,i)加工型运算,删除树 T 上结点 X 的第 i 棵子树,若 T 无第 i 棵子树,则操作为空。6 遍历 Traverse Tree(T):遍历树,即访问树中每个结点,且每个结点仅被访问一次。4.2 二叉树是 n(n=0)个结点的有限集合,它或为空(n=0),或是由一个根结点及最多有两棵互不相交的左、右子树组成,且每棵子树都是二叉树,或者同时满足下述两个条件:1 有且仅有一个称为根的结点。2 其余结点分为两个互不相交的集合 T1,T2,都是二叉树,并且 T1,T2 有顺序关系,T1 在 T2 之前,他们分别称为根的左子树和右子树

27、。二叉树的五种形态:空二叉树,只含根的二叉树, 只有非空左子树的二叉树,只有非空右子树的二叉树,同时有非空左右子树的二叉树。二叉树的基本运算:1 初始化 INITIATE(BT) 加工型运算,作用是设置一棵空二叉树2 求根 ROOT(BT)引用型运算,结果是二叉树 BT 的根节点,若 BT 为空二叉树,结果为一特殊标志。3 求双亲 PARENT(BT,X) 引用型运算,结果是结点 X 在二叉树 BT 上的双亲,若 X 是根或不在 BT 上,结果为一特殊标志4 求左孩子 LCHILD(BT,X)右孩子 RCHILD(BT,X)引用型运算,结果分别为结点 X 在 BT 上的左,右孩子。若X 为 B

28、T 的叶子或 X 不在 BT 上,结果为一特殊标志。5 建树 CREAT(X,LBT,RBT)加工型运算,建立一棵 X 为结点,LBT,RBT 为左右子树的二叉树。6 剪枝 DELETEFT(BT,X)和 DELETEHT(BT,X)加工型运算,删除 BT 结点 X 的左右子树,若无,运算为空。二叉树的性质:性质 1、二叉树第 i(i=1)层上至多有 2i-1 个结点。性质 2、深度为 K(k=1)的二叉树至多有 2k -1 个结点。性质 3、对任何二叉树,若 2 度结点数为 n2,则叶子数 n=n2+1深度为 K(K=1)且有 2k-1 结点的二叉树为满二叉树,在第 K 层删去最右边连续 J

29、 个结点,得到一棵深度为 K 的完全二叉树。完全二叉树的性质:|_x|表示不大于 X 的最大整数。性质 4、具有 N 个结点的完全二叉树的深度为|_ |+1log2性质 5、将一棵有 n 个结点的完全二叉树按层编号,则对任一编号为 i 的结点 X 有:若 i=1,则结点 X 是根,若 i1,则 X 的双亲 parent(X)的编号为|_i/2|若 2in,则结点 X 无左孩子(且无右孩子) ,否则,X 的左孩子 LCHILD(X)的编号为 2i.若 2i+1n,则结点 X 无右孩子,否则,X 的右孩子 RCHILD(X)的编号为 2i+14.3 二叉树的存储结构二叉树的链式存储结构:二叉链表在

30、做求双亲运算时效率不高,此时可采用三叉链表。具有 n 个结点的二叉树中,一共有 2n 个指针域,其中只有 n-1 个用来指向结点的左右孩子,其余的 n+1 个指针域为 NULL.P814.3.2 二叉树的顺序存储结构按层编号然后存储。对于非完全二叉树,可采用增加虚结点的方式转化成完全二叉树再进行存储。虚结点在数组中用特殊记号表示。但同时会浪费存储空间。4.4. 二叉树的遍历遍历一棵二叉树就是按某种次序系统地“访问”二叉树上所有结点,使每个节点恰好被访问一次。先根遍历:1 访问根结点 2 先根遍历左子树 3 先根遍历右子树中根遍历:1 中根遍历左子树 2 访问根结点 3 中根遍历右子树后根遍历:

31、1 后根遍历左子树 2 后根遍历右子树 3 访问根结点。4.6 树和林树的存储结构:P931 孩子链表示方法:头结点分为数据域和指针域,表结点分为孩子域和指针域可以在头结点中增加双亲域,称为带双亲的孩子链表示方法。2 孩子兄弟链表示法:存储结点均含三个域:数据域,孩子域(存放指向本结点第一个孩子的指针) ,兄弟域(存放指向本结点下一个兄弟的指针) 。3 双亲表示法:数据域,指针域(指示本结点的双亲所在的存储结点)将指针域定义为高级语言中的指针类型的链式存储结构成为“动态链表” ,相应的指针成为动态指针。将指针域定义为整形,子界型的链式存储结构成为静态链表,相应的指针称为静态指针。动态链表的结构

32、通过库函数 malloc(size)动态生成,无需事先规定表的容量。而静态链表容量须事先说明。4.6.2 树的遍历1 先根遍历:若树非空 1 访问根结点 2 依次先根遍历根的各个子树2 后根遍历: 1 依次后根遍历根的各个子树 2 访问根结点3 层次遍历: 2 访问根结点 2 从左到右,从上到下依次访问每层。二叉树与树,林的关系 P97将二叉树的二叉链表和数的孩子兄弟链表的左孩子指针,右孩子指针和孩子指针,兄弟指针对应起来。与树对应的二叉树的右子树一定为空。判定树和哈夫曼树用于描述分类过程的二叉树称为判定树。判定树的每个非终端结点包含一个条件,因而对应于一次比较火判断,每个终端结点包含一个种类

33、标记,对应于一种分类结果。哈夫曼树:给定一组值 p1pK,如何构造一棵有 k 个叶子且分别以这些值为权的判定树,使得其平均比较次数最小。满足上述条件的判定树称为哈夫曼树。的第五章 图图中的小圆圈称为顶点,连线称为边,连线附带的数值称为边的权。任何两点间相关联的无向图称为无向完全图,一个 N 个顶点的完全无向图的边数为 n(n-1)/2.任何两顶点间都有弧的有向图称为有向完全图。一个 N 个顶点的有向完全图弧数位 n(n-1)每条边或弧都带权的图称为带权图或网。一个连通图的生成树,是含有该连通图的全部顶点的一个极小联通子图。若连通图的顶点个数位 N,则生成树的边数为 N-1,如果它的一个子图的边

34、数大于 N-1,则其中一定有环,如果小于,则一定不连通。5.2 图的存储结构 邻接矩阵对于无向图,顶点 VI 的度是矩阵中第 I 行(或列)的元素之和。对于有向图,行元素之和为出度,列元素之和为入度。邻接表为每个顶点建立一个单链表,单链表中每个结点称为表结点,包括两个域,邻接点域,用以存放与 VI 相邻接的顶点序号,链域,用以指向同 VI 邻接的下一个的顶点。另外,每个单链表设一个表头结点。每个表头结点有两个域,一个存放顶点 VI 的信息,另一个指向邻接表中的第一个结点。若一个无向图有 N 个顶点,E 条变,则它的邻接表需要 N 个头结点和 2E 个表结点,所以在边稀疏的情况下,用邻接表比邻接

35、矩阵更节省存储空间。对于无向图,第 I 个单链表中的结点个数即为 VI 的度。对于有向图,第 I 个单链表中的结点个数只是 VI 的出度,为求入度,必须遍历整个邻接表,所有单链表中,邻接点域的值为 I 的结点个数即为入度。有时为了方便 的求入度,可以建立逆邻接表。5.3 图的遍历从图中某一顶点出发访遍图中其余顶点,每个顶点仅访问一次,叫做图的遍历。增设 visitedn数组。初值为 0,vi 被访问后,置为 1遍历方法:深度优先搜索和广度优先搜索。最小生成树问题拓扑排序第六章 查找表集合的特点:在集合这种逻辑结构中,任何结点间都不存在逻辑关系。用来标识数据元素的数据项称为关键字,简称键,该数据

36、项的值称为键值。静态查找表:以集合为逻辑结构,包括三种基本运算1 建表 CREATE(ST) 加工型运算,生成一个由用户给定的若干数据元素组成的静态查找表 ST.2 查找 SEARCH(ST,K)引用型运算,若 ST 中存在键值等于 K,结果为该键在 ST 中的位置,否则为一特殊标志3 读表元 GET(ST,pos)引用型运算,结果是 pos 位置上的数据元素。动态查找表:包括查找,读表元(同上)和以下三种基本运算。1 插入 INSERT(ST,K)加工型运算,若 ST 中不存在键值等于 K 的数据元素,则将一个键值等于 K 的数据元素插入到 ST 中。2 删除 DELETE(ST,K)加工型

37、运算,删除 ST 中键值等于 K 的数据元素。3 初始化 INITIATE(ST)加工型运算,设置一个空 的动态查找表。6 2 静态查找表的实现6.2.1 顺序表上的查找顺序查找法:从表的第 n 个位置开始,从后往前依次将各个位置上的数据元素的键值与给定值 K 比较。若相等,回送该位置作为结果。若不等,查找不成功。在第 0 个单元设置哨岗,所有当查找不成功时,查找了 n+1 次。平均查找长度 ASL=(N+1)/26.2.2 有序表的查找二分查找法当 N 较大时,ASL 约等于 -1log2(+1)6,2,3 索引顺序表上的查找索引顺序表由顺序表和索引表两部分组成。两个特点:1 顺序表中的数据

38、元素按块有序 2 索引表反映了这些快的有关特性(块内最大键值和块的起始位置)分块查找法平均查找长度高于顺序查找而低于二分查找。6,3 树表6.3.1 二叉排序树一棵二叉排序树或者是一棵空树,或者同时满足下列三个条件:1 若它的左子树不空,则左子树上所有结点的键值均小于它的根结点的键值。2 若它的右子树不空,则右子树上所有结点的键值均大于它的根结点的键值。3 它的左右子树也分别是二叉排序树。二叉排序树的中根遍历所得排序是从小到大。二叉排序树的插入,删除后仍要保持是一棵二叉排序树。删除时:设待删结点为 P,双亲结点为 F.设 P 是 F 的左孩子。1 P 为叶节点,直接置 F 的左指针域为空。2

39、P 只有一棵非空子树,直接以其根节点代替 P 的位置。3 P 有两颗非空子树,可用左子树根结点代替 P,然后将右子树变为新的根节点的右子树。6.3 2 平衡二叉排序树一棵平衡二叉排序树 AVL 树,或者是空树,或者是一棵任一结点的左子树与右子树的高度至多差 1 的二叉排序树。调整方法:P1406 4 散列表散列函数是一种将键值映射为散列表中的存储位置的函数。由散列函数决定的数据元素在散列表中的存储位置称为散列地址。散列的基本思想是通过散列函数决定的键值与散列地址间的对应关系实现存储组织和查找运算。散列函数的构造法:1 数字分析法(需要事先知道大概的键值) 2 除余法 3 平方取中法 4 基数转

40、换法 5 随机数法第八章 排序假定待排序的序列中存在多个记录具有相同的键值。若经过排序,这些记录的相对次序保持不变,称这种排序的方法是稳定的,否则是不稳定的。按照排序过程涉及的存储设备的不同,分为内部排序和外部排序。内部排序指排序过程中,数据全部存放在计算机内存中,并在内存中调整记录间的相对位置。外部排序指排序过程中,数据的主要部分存放在外存中,借助内存逐步调整记录间的相对位置。排序以键值比较和记录移动为标准操作。8.2 插入排序分为直接插入排序,折半插入排序,表插入排序和希尔排序。直接插入排序,方法是稳定的,时间复杂性为 O(N2),空间来看,只需要一个记录的辅助空间,故空间复杂度为 O(1) 。8.3 交换排序根据序列中两个记录键值的比较结果来兑换这两个记录在序列中的位置。特点是,将键值较大的记录向序列尾部移动,键值较小的记录向序列前部移动。8.3.1 冒泡排序至多需要进行 N-1 趟起泡。时间复杂性为 O(n 2) ,稳定的排序方法。

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


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

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

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