数据结构要点概括

本篇基于《数据结构-C语言版》

第一章 绪论 

比较重要的概念有时间复杂度和空间复杂度,时间复杂度利用基本操作的重复次数,忽略常系数后的函数来衡量;空间复杂度为输入数据+额外空间的大小。

第二章 线性表

线性表是十分基础的结构,定义为每个元素只有一个前驱和后继,只有唯一一个第一个元素和最后一个元素。

合并有序数列的算法:设置两个指针,不断比较两个数列的元素,更新指针;可运用于多项式加法乘法。

存储结构:顺序存储和链表存储;另一种存储结构,利用数组实现链表:静态链表,每个数组元素比正常数组多了一个游标来指示下一个元素位置;实现这个数组需要重写malloc和free函数,链表头结点指向下一个可用结点,释放某个结点后这个结点便成为头结点的下一个结点。

顺序存储在插入删除元素时需要移动改动元素之后全部元素,链式存储的优点在于插入、删除方便。

第三章:栈和队列

栈和队列应用非常广泛,均为操作受限的线性表,栈是后进先出,仅在尾端(栈顶)进行存取删除操作,栈可用于数制转换,括号匹配,行编辑程序,迷宫求解,表达式求值,递归的实现(Hanoi塔)。

队列是先进先出,只有队头可以进行删除操作,队尾进行写入操作进,在实现方式的空间利用有效程度上 ,循环链表好于链表好于顺序存储。

银行顾客事件的模拟:柜台利用队列实现,事件时间表利用有序的线性表实现。

第四章 串

串就像是字符组成的线性表,但一般作为整体对象操作,存储结构可以为定长顺序存储,堆空间分配的动态长度存储,和块链存储。

模式匹配算法:逐个比较;改进算法是KMP算法,其复杂度为O(m+n),理解关键是假如匹配到模式的第j个不匹配,若有‘p1p2…p(k-1)’ = ‘p(j-k+1)…p(j-1)’,则向右滑动k个单位继续比较。

重要内容有模式匹配算法。

第五章 数组和广义表

多维数组可以分为列序为主和行序为主,C语言采用行序为主,对于特殊矩阵可以采用压缩存储,对称矩阵,三角矩阵,对角矩阵,可以转换为一维数组,对于稀疏矩阵,采用三元组线性表存储。

稀疏矩阵的快速转置:转置前求得每一列非零元个数,进而得到第一个非零元在转置矩阵T对应的顺序表中的位置。

矩阵乘法:将记录了每一行第一个非零元位置的数组固定进数据结构得到行逻辑连接的顺序表,实现乘法的关键是寻找有意义的乘积项,复杂度为O(m×p),mp是乘积矩阵的维度。

十字链表存储结构的优点是处理位置变化大的非零元,适用于矩阵加法。 

广义表广泛运用于人工智能领域的LISP语言,可以看作线性表的推广,第一个元素时表头,其余是表尾。存储结构有头尾链表和扩展线性链表,分为表结点和原子结点,头尾链表的原子结点只有tag和data,扩展线性链表的原子结点还有尾域。

广义表的运用:m元的多项式表示。

递归算法在广义表中的运用:求广义表深度,复制广义表,建立广义表。

重要内容有矩阵转置,乘法,加法,广义表的建立。

前五章基础都是线性表,逻辑比较简单,比较符合传统数学概念。

第六章 树和二叉树(重要)

树的定义:嵌套定义,只有一个根结点,其子树又是一棵树。重要概念有双亲,孩子,堂兄弟,祖先,子孙,深度,度(结点子树数目)。

常用性质:分支数为B,终端节点数为n0,度为1、2的节点数为n1,n2,n0=n2+1,B=n1+2n2,深度为k的树至多有2的k次方-1个节点,完全二叉树(编号与满二叉相同):k=[log2为底数n]+1,结点i的左孩子是2i,右孩子是2i+1。

二叉树存储结构:顺序存储,链表:二叉(不含双亲)/三叉(包含双亲地址)链表。

二叉树的遍历:先/中/后序遍历,仅仅是访问结点数据顺序不同,路径均是根结点-左子树-根结点-右子树-根结点。

线索二叉树:n个节点的二叉树有n+1个空链域,可以用来存储地址信息,也就是线索,空左子树存前驱,右子树存后继。建立算法,遍历过程中修改空指针。线索二叉树遍历的时间复杂度常数因子小,且不需要设栈。

树和森林:树的存储结构有双亲法(线性表,类似静态链表),孩子法(线性表+多重链表),双亲孩子法(前两者结合)。森林可以转换成二叉树:根的第一个子树是左孩子,子树的兄弟看作他的右孩子。森林的先序遍历和中序遍历=其二叉树的遍历。

赫夫曼树(最优二叉树,带权路径和最小):建立算法是不断选取权值最小的两个树合并。可应用于前缀编码。

回溯法:可以转换成先序遍历过程中建立二叉树,并且舍去一些结点。

树的计数:n个结点的二叉树的计数,数目为1/(n+1)C(n 2n)棵;n个结点的树的计数=n-1个结点二叉树的计数。

等价问题:

重点是二叉树遍历,有递归法,用栈法,线索二叉树法。

第七章 图(重要)

比较重要的概念有:权,入度,出度,连通分量(无向图),强连通分量(有向图),生成树,生成森林。

常用的存储结构有:邻接矩阵,邻接表(进一步分为头结点和弧结点,弧结点用一个结点表示),十字链表(有向图,进一步分为顶点结点和弧结点,弧结点存有具有相同弧首和弧尾的下一条弧地址,等效于邻接表+逆邻接表),邻接多重表)(无向图,类似十字链表,弧用两个结点表示)。

图的遍历:深度优先(借助递归不断深入)和广度优先(接住栈,先访问完路径长度短的结点)。

图的连通问题:无向图的连通问题和求最小生成树,类似遍历;对于求有向图的强连通分量,需要先深度优先搜索遍历构造一个有向图G,并按完成搜索的顺序生成顶点数组,再构造一个反向有向图Gr,从顶点数组尾端出发反向遍历,得到的深度优先生成森立中的每棵树都是强连通分量的顶点集。

最小生成树问题:普里姆算法和克鲁斯卡尔算法,都利用了MST性质,假设U是顶点集V的一个非空子集,若(u,v)是一条最小权值的边,u∈U,v∈V-U,则必定存在一棵包含(u,v)的最小生成树。普利姆算法,O(n2),不断把顶点加入U并更新U,V-U之间的权值;克鲁斯卡尔算法,O(eloge),适用于边稀疏的网络,不断选取连通不同连通分量且权值最小的边加入连通分量。

关节点是删除后可以分割图的点,无关节点的图为重连通图,删除k个顶点才能破坏破坏图连通性,则图的连通度为k,求关节点的算法类似深度优先搜索,但是要比较顶点搜索次序的大小(关节点满足low[w]>wisited[v],w是v的子孙)。

有向无环图的运用:拓扑排序,有偏序和全序的概念(所有节点都有偏序关系),AOV(顶点是活动,边是优先关系)网不应该存在环,方法是不断删除无前驱点及以其为尾的弧;关键路径,即路径长度最长的路径,AOE网(顶点是事件,弧是活动),前提是拓扑有序,计算最早开始时间从前往后,计算最晚开水时间从后往前,关键节点是两个时间相等的点;

重要运用:最短路径,O(n2),迪杰斯特拉Dijkstra算法,适合求单源点到其余各个点最短路径,利用的关键性质是,S为已知最短路径集合,则下一条最短路径要么是(v,x),要么是(v,S中的点,x);弗洛伊德算法,适合求所有点之间的最短距离,利用了三个嵌套循环,基本思想是,已经中间顶点序号不大于k-1的最短路径,遍历所有顶点,得到的小于k-1情形下的最小v(i,k)+v(k,j)为中间顶点序号小于k的最短路径。

重点是两种遍历,难点是和树结合的问题,如求最小生成树,连通问题,求关节点,求最短路径。

第八章 动态存储管理

暂时用不上,略过。

第九章 查找

静态查找表:只查找。

1)顺序表:在ST[0]加入待查找元素当监视哨。

2)有序表(顺序存储):折半查找,平均查找长度为log2为底数(n+1)-1。

3)静态查找树:生成静态最优查找树很重要。

4)索引表:相当于分块有序。

动态查找表:可以加入删除条目。

1)二叉排序树:既有折半查找特性,又有链表的存储结构,平均查找长度2(1+1/n)Inn,平衡二叉树,左右子树深度相差不超过1,利用递归旋转来调整。

2)B-和B+树:B-树,每个节点最多m棵子树 ,最少[m/2]棵,根节点至少2棵,非终端节点结构(n,A0,K0,A1,K1……Kn,An),A为指针,K为键,插入和删除操作可能会出现分裂和合并操作;B+树,B-树变型,应文件系统所需,有n棵子树的节点含有n个关键词,每次查找要走到底,非终端节点可以看成索引,仅包含其子树的最大(小)关键词,删除插入类似B-树。

3)键树:每个节点含有组成KEY的一部分,节点的度和关键字得的“基”有关(如字母的基是27),深度h取决于关键字位数,存储结构有双连树,多重链表(Trie树)。

哈希表:主要内容有构造方法,处理冲突方法。主要概念是哈希造表或者散列,即根据哈希函数和处理冲突方法把一组关键字映像到一个有限的连续的地址集的过程。

第十章 内部排序

终于写到这了,这章是印象派中的印象派,以后读书还是分几篇总结吧。

不需要访问外存的排序就是内部排序,按原则可以分为交换、选择、归并、基数排序,按工作量可以分为简单O(n2)、先进O(nlogn)、基数O(d*n)排序。方法还有稳定和不稳定之分。

1)插入排序:可以利用折半查找减少比较次数,利用2-路插入排序进一步减少移动次数。希尔排序(缩小增量排序)是一种快速的插入排序,按照增量产生子序列进行插入排序,不断缩小增量也即增加子序列的长度。

2)快速(交换)排序:基础是气泡排序,可以利用快速排序改进,递归把序列枢纽pivotkey比较分成两段(从两端同时进行),进一步优化可以在比较需要移动时进行起泡。

3)选择排序:简单选择排序,不断选择最小的;树形选择排序,有胜者树和败者树,选出极值后都只需修改对应极值所在路径节点,但是败者树只需重新和路径上父节点比较,重构更加简单,O(nlogn);堆排序,(堆的含义表明,对应完全二叉树的所有非终端节点均不大于其左右孩子节点),堆的调整,用最后一个节点代替根节点,然后依次往下置换调整,如果要建立堆,先建立大顶堆(最大值在最后),然后从后往前依次对前n-1个进行调整成新的大顶堆,如此反复。

4)归并排序:将两个或两个以上有序表合并成一个新的。

5)基数排序:是一种多关键字排序思想(类比扑克牌排序)对单逻辑关键字排序的方法。多关键字排序有最高位优先和最低位优先两种,分配的复杂度O(n),收集O(r*d),总的O(d*(n+r*d)),r是度取决于基,d是排序次数,利用链式基数排序可以节省空间。

各种排序方法比较:稳定的只有基数排序和简单排序,排序算法理论下界是O(nlogn)。

第十一章 外部排序

这张讲了磁带(顺序式)和磁盘(随机读取)的存储原理,外部排序方法:读入内存——对子序列排序——归并段(也叫顺串),耗时大头是对外村的读取时间。

多路平衡归并法:利用败者树可以归并时间变为[log2为底数m](n-1)tmg。

置换-选择排序:可以减小初始归并段个数。

最佳归并树:优化各段长度不等对平衡归并的不良影响。

猜你喜欢

转载自blog.csdn.net/github_38635146/article/details/80236032
今日推荐