按照大纲的知识点整理数据结构.docx
- 文档编号:6005049
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:24
- 大小:2.40MB
按照大纲的知识点整理数据结构.docx
《按照大纲的知识点整理数据结构.docx》由会员分享,可在线阅读,更多相关《按照大纲的知识点整理数据结构.docx(24页珍藏版)》请在冰豆网上搜索。
按照大纲的知识点整理数据结构
一、线性表
(一)线性表的定义和基本操作
(二)线性表的实现
1.顺序存储结构
2.链式存储结构
3.线性表的应用
二、栈、队列和数组
(一)栈和队列的基本概念
循环队列:
为了克服假溢出时移动元素的缺点.
循环队列的入队操作:
先输入,后加尾指针.
循环队列的出队操作:
先取数据,后加头指针.
判断队列的空与满:
因此循环队列中少用一个位置.实际大小为maxsize-1(线性存储的情况)
(二)栈和队列的顺序存储结构
(三)栈和队列的链式存储结构
(四)栈和队列的应用
(五)特殊矩阵的压缩存储
如果是上三角矩阵,则
的位置k=i*(i+1)/2+j
如果是下三角矩阵,则
的位置k=j*(j+1)/2+j,下三角与上三角互相对称的原理.
行优先存储:
将数组元素按行向量排列
开始地址为:
loc(0,0,…,0)
列优先存储:
三、树与二叉树
/*树有且只有一个根结点,二叉树有0个或1个根结点
(一)树的概念
(二)二叉树
1.二叉树的定义及其主要特征
2.二叉树的顺序存储结构和链式存储结构
3.二叉树的遍历
(1)二叉树的递归遍历
A.前序
B.中序
C.后续
(2)二叉树的非递归遍历
A.前序
B.中序
C.后序
i.双栈
ii.栈中存标志位的方法
iii.除了栈只用一个指针变量的方法
(3)二叉树的层次遍历
4.线索二叉树的基本概念和构造
5.二叉排序树
6.平衡二叉树
(三)树、森林
1.树的存储结构
(1)双亲表示法
以一组连续空间存储树的结构,同时在每个结点中附设一个指示器指示其双亲结点在链表中位置。
(2)孩子表示法
顺序与链式相结合的方式
(3)孩子兄弟表示法(也即,二叉链表表示法)
2.森林与二叉树的转换
3.树和森林的遍历
(四)树的应用
1.等价类问题2.哈夫曼(Huffman)树和哈夫曼编码
(1)每次合并权值最小的和次小的.
(2)排列时权值左小右大
四、图
(一)图的概念
图中的数据元素为顶点(Vertex),V是顶点的有穷非空集合;VR是两个顶点之间的关系的集合.若<ʋ,w>属于VR,则<ʋ,w>表示从ʋ到w的一条弧(Arc),且称ʋ为弧尾或初始点,w为弧头或终端点,此时的图称为有向图.
无向图:
以(ʋ,w)表示ʋ,w之间的一条边.
用G=(V,{E})表示图.
用n表示图中顶点数目,用e表示边或弧的数目.
对于无向图,叫边.对有向图,叫弧.
对于无向图:
.
无向完全图:
有
条边
对于有向图
.
有向完全图:
有
边的有向图.
稀疏图:
有很少条边或弧的图.反之称为稠密图.
边上的权:
表示从一个顶点到另一个顶点的距离或耗费.
网:
带权的图
如果两个顶点之间直接有边相连则这两个顶点互为临接点.
度:
和顶点相关联的顶点的数目.
入度:
以某顶点为头的弧的数目称为该顶点的入度.
出度:
以某顶点为尾的弧的数目称为该顶点的出度.
度=入度+出度
路径:
从某顶点到另一个顶点的顶点序列.
路径的长度:
路径上边或弧的数目.
回路或环:
第一个顶点和最后一个顶点相同的路径.
简单路径:
序列中顶点不重复出现
在无向图中:
如果从顶点v到顶点w之间有路径,称v和w是连通的.
如果图中任意两点都是连通(即任意两点之间都有路径相通)的,则称G是连通图.
连通分量:
无向图中的极大连通子图
极大连通子图:
在原来图的基础上(即包括原来图的所有顶点和边(弧))拥有最多的边数和最多的顶点数的图.
一个连通图的生成树是一个极小连通子图.
它含有图中全部顶点,但只有足以构成一颗树的n-1条边.如果在一个生成树上添加一条边必定构成一个环.
非连通图:
有n个顶点和小于n-1条边
有n个顶点和大于n-1条边的图肯定有环.
但是有n-1条边的图不一定是生成树.
在有向图中:
如果对任意两个顶点之间都存在一条有向路径,则称G是强连通图.
极大连通子图称为强连通分量.
如果一个有向图恰有一个顶点的入度为0,其余定点的入度均为1,则是一颗有向树.
一个有向图的生成森林由若干颗有向树组成.含有全部顶点,但只有足以构成若干颗不相交的有向树的弧.
(二)图的存储及基本操作1.邻接矩阵法2.邻接表法
对图中每个顶点建立一个单链表,第i个单链表中的节点表示依附于顶点v的边(对有向图是以定点v为尾的弧).每个节点由三个域构成.
Adjvex与顶点v邻接的点在图中的位置
Nextarc下一条边或弧的节点
Info权值等
每个链表上附设一个表头结点.
Data
Firstarc指向链域
这些表头节点通常以顺序结构的形式存储.
为了便于确定有向图中定点的入度.建立有向图的逆链接表.
在建立邻接表或逆邻接表时,若输入的定点信息即为顶点的编号,则建立临界表的时间复杂度为O(n+e),否则需要通过查找才能得到顶点在图中的位置,则时间复杂度为O(n*e).
优点:
找任意顶点第一个邻接点和下一个邻接点容易
缺点:
判定两个顶点是否有边或狐不比邻接矩阵方便
(三)图的遍历为了避免同一顶点被访问多次,设一个辅助数组visited[0..n-1],初始值为0.
以下两种搜索对无向图和有向图都适合.
1.深度优先搜索
类似于树的先根遍历
算法描述:
初始状态是图中所有顶点都未被访问
从图中某个顶点v出发,访问此定点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到;
如此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问到为止.
Booleanvisited[Max];
Status(*VisitFunc)(intv);
voidDFSTraverse(GraphG,Status(*Visit)(intv)){
VisitFunc=Visit;
for(v=o;v for(v=o;v if(! visited[v])DFS(G,v); } voidDFS(GraphG,intv){ visited[v]=TRUE; VisitFunc(v);//访问第v个顶点 for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))//其中FirstAdjVex函数作用是获得第v个节点的第一个边 if(! visited[w])DFS(G,w); } Status(*VisitFunc)(intv);//函数变量 是一个静态分配的指针VisitFunc,指向一个函数,该函数带一个int型的参数。 VisitFunc=Visit;//使用全局变量VisitFunc,使DFS不必设函数指针参数。 使之前定义的函数指针指向Visit函数,VisitFunc是全局变量,故在深度优先搜索DFS中不必再定义函数指针参数,直接调用VisitFunc函数即可,也就是Visit函数。 当用二维数组表示临界矩阵作图的存储结构时,查找每个顶点的邻接点所需时间为 .其中n为图中顶点数. 而当以邻接表作图的存储结构时,找邻接点所需时间为O(e).其中e为无向图中边的数或有向图中弧的数.因此,当以邻接表作存储结构时,深度优先搜索遍历图的时间复杂度为O(n+e). 2.广度优先搜索类此于树的按层次遍历的过程. 算法描述: 从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问他们的邻接点,并使”先被访问的顶点的邻接点”先于”后被访问的顶点的邻接点”被访问,直至图中所有以被访问的顶点的邻接点都被访问到.若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止.为了顺次访问路径长度为2、3、…的顶点,需附设队列以存储以被访问的路径长度为1、2、..的顶点. (四)图的基本应用及其复杂度分析1.最小(代价)生成树(极小连通子图) 最小生成树MST性质: 假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集.若(u,v)是一条具有最小权值(代价)的边,其中u属于U,v属于V-U,则必存在一颗包含边(u,v)的最小生成树. Prim算法和Kruskal算法是两个利用MST性质构造最小生成树的算法. Prim算法: 假设N=(V,{E})是连通网,TE是N上最小生成树中边的集合. 算法从U={u0}(u0属于V),TE={}开始, y重复执行下述操作: 在所有u属于U,v属于V-U的边(u,v)属于E中找一代价最小的边(u0,v0)并入集合TE,同时u0并入U,直至U=V为止.此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树. 需附设一个辅助函数closedge,以记录从U到V-U具有最小代价的边.对每个顶点 2.最短路径 1)从某个源点到其余各顶点的最短路径 2)每一对顶点之间的最短路径 3.拓扑排序顶点表示活动AOV网. 4.关键路径 边表示活动网—AOE网(ActivityOnEdge)的概念: AOE网是一个带权的有向无环图. 定点表示事件,弧表示活动,权表示活动持续的时间. AOE网用来估算工程的完成时间. AOE网(边表示活动网): 最早开始时间e(ai)=+选大者 最迟开始时间l(ai)=-选小者 /*最迟开始时间: 不推迟整个工程完成的前提下,活动ai最迟必需开始进行的时间*/ /*关键活动不是顶点: 答题时应注意*/ /*关键路径为最早开始时间=最迟开始时间的顶点之间的活动构成*/ /*关键路径是通过事件求活动.*/ /*关键路径有多个: 如: a1a2a3a4a5 a1a2a6a7a5 其中a1a2a5的工期减少会使整个工程缩短工期*/ /*完成工程的最短时间是从开始点到完成点的最长路径长度*/ /*开始点为V1从Vi的最长路径为Vi最早发生时间*/ 五、查找 (一)查找的基本概念 (二)顺序查找法 无序表和有序表的顺序查找 (1)无序表 查找失败时和给定值进行比较的关键字个数为n+1个 如果查找成功与不成功的可能性相同,则/*乘 的原理*/ (2)有序表 查找成功时 查找不成功时 (三)折半查找法折半查找性能分析 (1) (2)平均查找长度为ASLBS=log2(n+1)-1 折半查找只适用于有序表且限于顺序存储结构 有序表上折半查找时判定树的高度为 (因这跟完全二叉树深度一样. ) (四)B-树: 平衡的多路查找树 B+树. 与B树的差异: (1)有n棵子树的结点有n个关键字 (2)所有的叶子节点中包含了全部关键字信息.及指向这些关键字记录的指针. 并且,叶子结点本身依关键字的大小自小而大顺序链接. (3)所有非终端结点可看成索引部分,节点中仅含其子树中的最大关键字. (五)散列(Hash)表及其查找 哈西函数标准: 映像到地址集合中任何一个地址的概率是相等的. /*聚集: 冲突发生以后相同位置的记录聚集到一块*//*二次聚集: 由非同义词冲突产生*/ /*发生聚集原因: 哈西函数选择不当*/ /*在哈西法能有效避免冲突*/ (六)查找算法的分析及应用 六、内部排序 (一)排序的基本概念 (二)插入排序1.直接插入排序2.折半插入排序(三)气泡排序(bubblesort) 如果一趟排序中未发生交换,则表明已结束 (四)简单选择排序(五)希尔排序(shellsort)(六)快速排序 (七)堆排序 若在输出堆顶的最小值之后,使得剩余n-1个元素的序列又重建成一个堆,则得到n个元素中的次小值.如此反复执行,便能得到一个有序序列. 把待排序列假设成完全二叉树 (1)建堆 从无序序列建堆的过程为反复筛选的过程. 从最后一个非终端节点即└n/2┘开始”筛选”. (2)输出堆顶元素后调整堆 1)输出堆顶元素后,以堆中最后一个元素替代. 2)自上至下进行调整.此过程称为”筛选”. (八)二路归并排序(mergesort)(九)基数排序(十)各种内部排序算法的比较(十一)内部排序算法的应用 基本概念和术语 数据: 是对客观事物的符号表示,在计算机科学中表示所有能输入到计算机中并被计算机程序处理的符号总称. 数据元素: 是数据的基本单位,在计算机程序中作为一个整体考虑. 数据元素由若干数据项组成.数据项是数据的基本单位. 数据对象: 是性质相同的数据元素的集合.是数据的一个子集. 数据结构: 相互之间存在一种或多种特定关系的数据元素的集合. 结构包括: 集合、线性结构、树形结构、图状结构. 数据结构描述元素间逻辑关系. 在计算机中bit是信息的最小单位. 位串表示数据元素.(8位二进制表示一个字节) 抽象计算机 数据结构存储结构 数据元素结点 数据项数据域 数据机构算法设计存储结构算法实现 数据类型: 是一个值的集合和定义在这个值集上的一组操作的总称. 数据类型: 原子类型、结构类型. 抽象数据类型: 原子类型、固定聚合类型、可变聚合类型(值的成分数目不确定) 抽象数据类型表示与实现 类c语言 (1)预定义 #definetrue1 (2)数据结构的表示(typedef) (3)基本操作的算法 函数类型函数名(函数参数表){ //算法说明 语句序列 }//函数名 算法(控制结构+原操作) 定义: (algorithm)是对特定问题求解步骤地一种描述。 它是指令的有限序列。 特点: (1)有穷性 (2)确定性(3)可行性(4)输入(5)输出 基本要求: (1)正确性 (2)可读性 (3)健壮性 (4)较高效率与低存储需求 算法效率度量 (1)事后统计的方法 (2)事前分析估算 算法时间复杂度的表示: f(n): n为问题规模n的某个函数 T(n)=O(f(n))//算法执行时间T(n)的增长率和f(n)增长率相同 渐进时间复杂度——时间复杂度 频度: 语句重复执行的次数 O (1),O(n),O( ),O( ),O( ) 的曲线 算法原地工作: 算法所需的辅助空间不依赖问题的规模n。 算法执行效率: 时间复杂度: 空间复杂度: , 相当于 排序 排序算法与待排序列初始状态 1.排序趟数与数列原始状态有关的算法: 交换排序(起泡、快速) 起泡排序结束的条件为在一趟排序中没有进行过交换记录的操作. 2.二路归并排序和简单选择排序的比较次数与序列初态无关 一、插入排序: 待排记录分两组,一组有序,一组无序,每次从无序组中取出一个记录插入到有序组,使有序组依然有序. 直接插入排序 算法思想: (利用了监视哨技巧) (1)将待排记录分为r[1,i-1],r[i,n].前一子区间已排好序,后一区间为初始未排序状态. (2)依次将后一子区间的第一个元素插入到前一子区间,每次插入完毕后i+1直到i>n (3)分类过程从i=2开始,初始r[1]只有一个元素,可认为是有序的. (4)第i趟直接插入排序操作为: 自i-1起往前搜索,(可同时后移记录),当r[k-1]>r[i]>r[k]时停止 (5)可设置监视哨(避免每次验是否出界) voidInsertSort(Sqlist&L){ for(inti=2;i L.list[0]=L.list[i]; L.list[i]=L.list[i-1]; for(intj=i-1;LT(L.list[0],L.list[j])! =0;j--)//LT(a,b)当a L.list[j+1]=L.list[j]; L.list[j+1]=L.list[0]; } }//endInsertSort 希尔排序(缩小增量排序) 算法思想: 先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序,待整个序列基本有序时在对全体序列进行一次直接插入排序.(这样在最后一趟排序时只需作记录的少量比较和移动即可完成排序). 算法实现: //shellinsert voidShellInsert(Sqlist&L,intdk){ //前后记录位置的增量为dk,而不是1 //r[0]只是暂存单元,不是哨兵。 当j<=0时插入位置已经找到 for(inti=dk+1;i if(LT(L.list[i],L.list[i-dk])){ L.list[0]=L.list[i]; //组内的直接插入排序 for(intj=i-dk;j>0&<(L.list[0],L.list[j]);j-=dk) L.list[j+dk]=L.list[j]; L.list[j+dk]=L.list[0]; } }//endShellInsert voidShellSort(Sqlist&L,intdlta[],intt){ for(intk=0;k ShellInsert(L,dlta[k]); }//endShellSort 其中C语言知识for(i=0;i<10;i++)中最后一个语句i++每次在循环中的语句结束后执行. 特点: 子序列的构成不是简单的”逐段分割”,而是相隔某个增量的记录组成一个序列,并在子序列内进行直接插入排序. 时间复杂度 (平均和最坏)空间复杂度 稳定性: 不稳定 增量: 应使增量序列中的值没有除一致外的公因子,并且最后一个增量值必须1. 分成了很多子序列,但不能试图并行处理这些子列,因只适合串行.每一个字序列的元素或许是别的子序列的元素. 二、选择排序 每一趟在n-i+1个记录中选取关键字最小的记录作为有序序列中第i个记录 简单选择排序 一趟简单选择排序的操作: 通过n-i次关键字间比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换。 //SelectSort voidSelectSort(Sqlist&L){ for(inti=1;i j=SelectMinKey(L,i); if(i! =j)L.list[i]与L.list[j]交换 } }//endSelectSort 时间复杂度 (最坏好)空间复杂性 记录移动次数较少0<=x<=3(n-1). 特点: 无论记录初始排列如何,所需关键字间比较次数都相同。 加: 堆排序: 定义: n个元素序列 或 基本思想: 1、如何在输出堆顶元素之后,调整剩余元素成为一个新堆 (1)假设输出堆顶元素之后,以堆中最后一个元素替代之。 (2)自上之下调整,根与其左右孩子大者(小者,由小到大排列时)进行交换 (3)在被破坏“堆”中进行与 (2)相同的调整,直到叶子节点 2、如何从无序序列建成一个堆 个元素开始“筛选”。 时间复杂度最坏O(nlogn)(最好,坏,平均)空间复杂度O (1) 适应性: 对n较大的文件有效,时间主要耗费在建初始堆和调整建新堆时进行的反复“筛选”上。 比较次数之多为4n,其中n为堆中所含元素。 稳定性: 不稳定 特点: 每个待排记录尽占一个存储空间 选择排序移动次数为O(n) 大(小)顶堆中关键字最小(大)的在叶子节点上,故必须在 大的位置上。 三、归并排序: 四、交换排序: 五、 各种排序法适用性 基数排序: 适用于n值很大而关键字较小的序列 直接插入排序若待排记录序列为按关键字基本有序时时间复杂度可提高至O(n); 堆排序属于选择排序,故每次从待排序列中迭出最大或最小的元素. 如果想得到最大k个或最小k个元素,则用之.而对记录数小的序列不适用. 快速排序在关键字基本有序时最不利于发挥长处.(课p276) 移动次数与比较次数 .而比较次数最多 简单选择排序无论初始排列如何,比较次数均n(n-1)/2,即O( ). 交换: 堆排序时间复杂度O( ),比较次数不超过 直接插入排序的比较和移动次数均为 折半插入排序比直接插入排序,关键字间比较次数减少了. 因每趟进行n个比较,一共 趟. 两个各有n个数据的有序表归并成一个有序表最少比较次数为n次 直接插入排序中被排序列初始基本有序时可减少比较和移动次数. 排序算法 平均时间复杂度 空间复杂度 稳定性 移动次数 比较次数 选择排序 最少,基本上O(n) 归并排序 好,坏,平均 O(n) 稳定 归并的趟数 (树的深度) 各种排序算法稳定性分析: 稳定的有: 1.直接插入.因每次从未排队列中按顺序选取插入,故值相同,元素前后顺序不变. 2.起泡排序: 因每次选取未排部分的最大(最小)元素,且这是按顺序取得 3.折半插入 4.归并排序 5.基数排序 各种算法的时间复杂性: O( ): 直接插入排序、起泡、折半插入、直接选择. : 希尔、快速排序、堆排序、归并.(注意: 其中堆排序中删除一个元素时间复杂度为 也即一次调整堆的时间) O(d(n+r)): 基数排序 其中,直接插入最好情况O(n),起泡排序最好O(n) 快速排序最坏情况O( ). 各种算法空间复杂性: O (1): 插入排序均是,选择排序 O(n)归并排序 O(n+r): 基数 O( )快速排序,需要一个栈的存储空间,最坏情况下O(n),此时,枢轴位置偏向一侧,如,想避免最坏情况则必须先对长度短的子序列进行排序. 查找 哈希表(从关键字找到存储位置) 哈希函数的构造方法: 1.直接定址法H(key)=key或H(key)=a·key+b 2.数字分析法取关键字的若干数位组成哈希地址。 (尽量避免冲突) 3.平方取中法关键字进行平方运算后取中间几位为哈希地址。 4.折叠法将关键字分割成位数不同的几部分(最后一部分位数可以不同) 然后取这几部分叠加和(舍去进位) 5.除留余数法H(key)=keyMODP,P<=mp为小
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 按照 大纲 知识点 整理 数据结构
![提示](https://static.bdocx.com/images/bang_tan.gif)