版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构 讲授:朱全民定义数据(data) 是对客观事物的符号的表示。例如数值、图像、声音都属于数据的范畴。数据元素(data element) 是数据的基本单位 数据对象(data object)是性质相同的数据元素的集合,是数据的一个子集。 数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合。 数据结构的内涵1. “操作”的对象:数据。2. 数据与数据间的关系。3. 针对数据的基本操作。 据此,数据结构可以形式定义为:数据结构是一个二元组 Data_Structure = (D, S)存储结构逻辑结构:数据元素之间是逻辑关系。 物理结构:数据结构在计算
2、机中的存储方式。顺序存储结构:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。逻辑上关联的数据元素,物理存储结构中相邻。 链式存储结构 :借助元素存储地址的指针(pointer)表示数据元素之间的逻辑关系 。逻辑上关联的数据元素,物理存储结构中不一定相邻。 几种常见的数据结构模型线性表线性表是一种简单的数据结构,一个具有n个元素的线性表a1,a2 , an,除了a1只有一个后继,an只有一个前趋,其它元素都有且只有一个前趋和后继,其中ai的前趋为ai-1 ,ai的后继为ai+1 Linear-list=(D,R) 其中: Dai| ai D , i1,2,n,n0 R=N,N= |
3、ai-1,aiD0,i1,2,n D为某个数据对象线性表的表示顺序存储结构 用数组类型: list: array 1.max of elemtp ;链式存储结构 用指针类型: point = p_list ; p_list = record elm : elemtp ; link : point ; end;操作顺序存储结构查找:可以实行折半查找,时间复杂度O(log2(n) 插入:需要做数据的移动。 删除:需要做数据的移动。链式存储结构 查找:只能顺序查找,时间复杂度O(n) 插入:不需要做数据的移动。 删除:不需要做数据的移动。举例约瑟夫问题M个人围成一圈,从第一个人开始报数,数到N的人出
4、圈;再由下一个人开始报数,数到N(N1)的人出圈;.。输出依次出圈的人的编号。M的值预先选定,N由键盘输入。分析:要解决这道问题,首先需要构造一个环表,构造环的方法很简单,只要存储每个人的下一个即可,当然,最后一个人的下一个就是第一个人,这样就构成了一个环,构造环以后,就可进行删除操作,直到环剩下一个人为止。快速排序快速排序是对冒泡排序的一种改进。他的基本思想是,通过一趟排序将待排的记录分割成独立的两个部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。堆栈堆栈是一种后进先出(LIFO)的线性表堆栈的顺序存储结构和链式存储结构顺序栈的
5、数据结构表示 const maxsize=栈的大小; type sqstktp=record elem: array1.stack_size of elemtp; top:0.maxsize;基本操作 1) 压栈(PUSH) 2) 弹栈(POP)栈的应用算术达式求值输入一个表达式,该表达式含有“+”、“-”、“*”、“/”、“(”、“)”和操作数,输入以结束。构造两个栈opnd和optr分别存放操作数和 操作符构造操作符的优先关系表以3*(5-2)+7为例,操作过程见图算法框架Function exp_reduced: oprandtype; inistack(optr);push(optr,
6、); inistack(opnd) read(w); while not (w=) and (gettop(optr)=) do If not w in op then push(opnd,w);read(w) else case predede(gettop(optr),w) of :theta:=pop(optr);b:=pop(opnd);a:=pop(opnd); push(opnd,operate(a,theta,b); endc return(gettop(opnd)endF队列队列是一种先进先出(FIFO)的线性表队列的顺序存储结构和链式存储结构队列必须构造成循环队列的形式,否则
7、会出现“假溢出” const maxsize=队列最大容量; m=maxsize-1; type cyclcquetp = record elem : array0.m of elemtp; rear, front : 0.m; end;基本操作 1) 插入(en_cycque) 2) 删除(dl_cycque)队列的应用计算广义表(见书P54)宽度优先搜索排队事件的模拟串串是由0个或多个字符组成的序列串的存储结构 静态存储结构 const maxlen=串被确认的最大长度 type strtp=record ch: array 1.maxsize of char; curlen:0.maxl
8、en end; 紧缩数组 ch:packed array 1.maxlen of char; 按字节存放 动态存储结构 const chunksize=chunk; chunk=record ch:array q.chunksize of char; next : pointer; end; 堆结构:每次从自由空间中动态分配一块内存给串,并建立空间的起始地址串的基本操作串的连接(concat)求子串(substr- Pascal中的copy函数)插入函数(insert)删除函数(delete)定位函数(index- Pascal中的pos函数)KMP算法KMP的基本原理假设主串为s1s2sn
9、,模式串为p1p2pm , 当模式串发生失配 (sipj)时,模式串”向右滑动”可行距离有多远? 假设此时应与模式中的第k (kj)个字符继续比较,则模式中的前k-1个字必须与主串的前k-1个字符相等,有 p1p2pk-1= s i-k+1si=k+2si-1 由已经得到的部分匹配结果可知 pj-k+1pj=k+2pj-1= s i-k+1si=k+2si-1所以有 p1p2pk-1= pj-k+1pj=k+2pj-1由上式可知,当主串第i个字符与模式串第j个字符不相等时候,仅需将模式串向右滑动到模式串中的第K个字符和主串中的第i个字符对齐,此时模式中的头K-1个字符的子串肯定与主串中第i个字
10、符之前的K-1个子串相等.怎样求KKMP示例求next函数next1=0,设nextj=k,表明, p1p2pk-1= pj-k+1pj=k+2pj-1(1) 若pk= pj ,则在模式串中有 p1p2pk= pj-k+1pj=k+2pj 显然 nextj+1=k+1(2) 若pk pj ,则杂模式串中有 p1p2pk pj-k+1pj=k+2pj 则可将求next函数的问题看成整个模式串既是主串又是模式串的问题,应将模式串滑动到nextk个字符和主串的第j个字符相比较.若nextk=k,且pj=pk,则说明在主串中第j+1个字符之前存在一个长度为k的最长子串,和模式串中从首字符起长度为k的子
11、串相等,即 p1p2pk pj-k+1pj=k+2pj也就是说nextj+1=k+1=nextk+1求NEXT算法Proc get_next(t:strtp) next为全程变量j:=1 ;k:=0;next1:=0;While j1时,其余结点可分为m(m0)个互不相交的有限集T1,T2,Tm,每个集合又是一棵树,称为子树.其他概念: 叶子,树的度,结点的度,双亲,孩子,兄弟,深度 有序树,无序树,二叉树,森林二叉树概念 二叉树是以结点为元素的有限集,它或者为空,或者满足以下条件: 1)有一个特定的结点,叫根 2)余下的结点分为两个互不相交的子集L和R,其中L叫左子树,R叫右子树几种特殊的二
12、叉树 空树,斜树,完全二叉树,满二叉树二叉树的性质在二叉树的第i层上最多有2i-1个结点深度为K的二叉树最多有2k-1个结点在二叉树中,叶子结点的总数总比为度数为2的结点多1有n个结点的完全二叉树的结点按层序编号,则对任意一结点i,有(1)如果i=1,则结点i是二查树的根,无双亲;如果i1,则双亲是i/2(2)如果2in,则结点i无左孩子,否则左孩子为2i(3)如果2i+1n,则结点i无右孩子,否则右孩子为2i+1二查树的基本操作存储结构 type bitree=node node=record data :datatype; lchild,rchild:bitree; end;遍历 先序遍历
13、 中序遍历 后序遍历常见的几种树结构最优二叉树(哈夫曼编码,P92) 树的代权路径长度之和最小的二叉树二叉排序树 它或者是一颗空树,或者是具有如下性质的二叉树:1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值2) 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值3)它左右子树分别为二叉排序树。平衡二叉树(AVL树)它或者是一棵空树,或者是具有如下性质的二叉树:它左右子树都是平衡排序树,且左右子树的深度之差超过1。二叉堆 n个元素的序列k1,k2,kn,当且仅当满足 ki=k2i 并且 ki =k2i 并且 ki = k2i+1 线段树 它或者是一颗空树,或者是具有如
14、下性质的二叉树:树中每个结点表示一个区间。树的存储结构双亲表示法 type tnode=record data:datatype; parent:integer; end;孩子兄弟表示法 type tlinktp=tnodetp; tnodetp=record data:elementtp; fch,nsib:tlinktp; 第一个孩子、下一个兄弟 end树、二叉树、森林用“孩子兄弟表示法”可以将任意一棵树转化为二叉树的形式 森林转化为二叉树 如果F=T1, T2, ,Tm是森林,则可按如下规则转化为一棵二叉树。 1)若F为空,即m=0,则B为空树 2)若F非空,即m0,则B的根root即为
15、森林中第一棵树的根root(T1),B的左子树为从T1中子树森林F1=T11, T12, ,T1i转换而成的二叉树;其右子树Rb 是从森林F=T2, ,Tm中转换出来的二叉树堆排序堆排序算法PROC shift (var r:listtype; k,m:integer); i:=k.j:=2*I; x:=rk.key;finish:=false t:=rk; while (j=m) and not finish do if (jrj+1.key) then j:=j+1; If x=rj.key then finish:=true Else ri:=rj; i:=j; j:=2*I ri:=t
16、endPPROC heapsort(var r:listtype);For i:=n/2 downto 1 shift(r,I,n);For i:=n downto 2 do r1与ri交换; shift(r,1,i-1) endP图图的定义G=(V,E)图的基本概念有向图、顶点、入度、出度、弧、环无向图、边、路径、顶点的度、邻接简单图、完全图平面图、二分图图的存储结构邻接矩阵 graph=Record vex:array1.vtxptr of vertex; arc:arrayvtxptr, vtxptr of vertex;邻接表 表节点 type arcptr=arcnode; arcn
17、ode=record adjvex:vtxptr; nextarc:arcptr; info: 和弧有关的其他信息 end; vex=Record vexdata: 和顶点有关的其他信息 firstarc:arcptr; end;Adjlist=array vtxptr of vexnode;图的遍历深度优先搜索(P103)广度有先搜索(P104)最小生成树PRIM算法示例 prim算法PROC prim(gn:adjmatrix;u0:vtxptr); for v:=1 to vtxnum do if vu0 then with closedgev do vex:=u0;lowcost:=g
18、nu0,v For i:=1 to vtxnum-1 do k:=minimun(closedge) 在V-U中找到最小代价边的顶点 write(closedgek.vex,k); closedgek.lowcost:=0; 顶点k并入U集 If gnk,vclosedgev.lowcost then closedgev.lowcost:=gnk,v; closedgev.vex:=k krusal算法示例图的连通性问题无向图的连通性 利用深度有先算法遍历图,看是否所有的结点都被遍历到。求有向图的强连同分量(1)从某个顶点出发沿以该定点为尾的弧进行深度有先搜索遍历,并按其所有邻接点的搜索都完成
19、的顺序将顶点排列起来。(2)从最后完成搜索的顶点出发,沿着一该定点位头的弧作逆向深度有先搜索遍历,若此次不能访问到有向图中所有的顶点,则从余下的顶点中最后完成的顶点出发,继续作逆向深度有先搜索遍历,以此类推,直至有向图中所有的顶点都访问为止。(3)每次调用dfs逆向深度有先遍历所访问的顶点集,就是一个强连通分量最短路经问题(Dijkstra算法)核心思想:按路径递增的次序产生最短路径的算法 1)找到图中最短的路径,设为(v,vj),将j设为已标号的点 2)找下一条次短的路径,假设终点为k,将k设为已标号的点,那么要么是(v,vk)要么是(v,vj,vk),若经过vj ,将j设为已检查的点,放入
20、集合. 3)以次短路径出发找第三短的路径,类似第二步的方法. 4)按上述方法一直到所有的顶点被检查过,则从v到其他顶点的最短路径求出.每一对顶点的最短路径(floyd算法)假设求从vi到vj的最短路径,如果vi到vj有弧,则它们的路径为costi,j,否则需要进行n次试探,首先考虑(vi v1 vj ),比较它与(vi vj )的大小,取较短者为中间节点序号不大于1的最短路径,ji假如 (vi,v2 )和 (v2 , vj )都是中间节点序号不大于1的最短路径,那么(vi,v2 , vj )可能是中间节点序号不大于2的最短路径.将它和中间节点序号不大于1的最短路相比较,从中选出中间节点的序号不大于2的最短路径之后,再增加一个顶点v3,继续进行试探.这样进行n次试探后,最后得到必然是vi到vj的最短路径.有向图的拓扑序列定义 若对有向图G的顶点,存在一个序列v1, vi,vj,vn, 只存在vi到vj的路径,而不存在vj到vi的路径,则称该图拓扑有序方法1)再有向图中选一个入度为0的顶点,输出2)删除该顶点和所有以它为尾的弧3)重复1,2直到找不到顶点为止4)如果输出顶点的个数少于图中顶点的个数,则该图不具有拓扑有序,否则拓扑序列就是输出的顶点顺序求有向图的关键路径算法思想:求
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 东财《应用心理学》单元作业二46
- 人工智能辅助设计在手钩纹样创新中的降本增效研究
- 2026农业产业化行业市场现状分析及投资建议规划研究报告
- 八年级上册英语第三单元知识点归纳
- 2026中国冶金矿产行业市场现状供需分析及投资评估规划分析研究报告
- 金融合规智能系统
- 2026中国智能家电产品供需现状与品牌战略细化研究报告
- 2026年仓储管理(危险品管理)试题及答案
- 情感化客户服务机器人
- 小学六年级综合实践活动《行走的密码-鞋》教学设计
- 公路工程施工安全技术与管理课件 第07讲 临时用电
- 配速员培训课件
- 蓄滞洪区运用监管实施规范
- 2025年黎明职业大学辅导员考试笔试题库附答案
- 医疗康复科操作礼仪要点
- 照顾孩子委托协议书
- 2025-2026学年统编版语文二年级上册第一单元早读课件
- 2025-2030中国石墨烯导热膜产业化进程与消费电子散热需求增长预测
- 挡墙重点难点施工方案
- 2025年贵州省初、中级专业技术资格考试(给排水)历年参考题库含答案详解(5卷)
- 2025年秋季小学六年级上册语文教学计划及教学进度表
评论
0/150
提交评论