408-数据结构
文章平均质量分 60
考研408之数据结构
主要参考:王道
猫毛已经快要掉光的小猫
这个作者很懒,什么都没留下…
展开
-
408-数据结构-零散知识点汇总
408数据结构考研,所有杂碎知识点汇总原创 2022-10-12 19:54:12 · 667 阅读 · 0 评论 -
408-数据结构-归并排序&外部排序&外部排序优化
归并排序算法思想:将需要排序序列分为多个小块,两个两个小块进行归并操作,也就是完成两个小块归并成一个大的有序块。直到完成整个序列的归并操作。归并操作:需要开辟一个辅助空间,两个指针指向两个小块,两个指针指向的数据进行比较,将小的或者大的放入辅助空间,循环直到其中一个小块没有数据。最后将另外一个块中的数据添加到辅助空间最后即可。一般归并排序采取二路归并排序,也就是两个两个小块进行合并,也可以是多路归并,也就是n个小块进行合并。正经排序算法:将序列分割为单独块,两个两个进行内部排序也就是完成一次归并操原创 2022-08-01 16:38:57 · 660 阅读 · 0 评论 -
408-数据结构-排序-简单选择&堆排序
简单选择排序算法思想:每一次找到序列中最大值的位置,然后将其与最后一个交换,长度为n的序列完成n-1趟就能够实现从小到大排序。空间复杂度:O(1)时间复杂度:稳定O(n2)稳定性:不稳定可以用于链表void selectSort(int a[], int length){ for (int i = length -1 ; i >= 0 ; i--){ int maxPos = 0; for (int j = 1 ; j <= i ; j ++) if (a[j] &g原创 2022-07-30 20:56:35 · 146 阅读 · 0 评论 -
408-数据结构-排序-插入排序&希尔排序&冒泡排序&快速排序
排序算法主要评判优劣程度角度:时间空间复杂度比较次数,交换次数是否稳定:值相同能否在排序前后仍然保持相对位置排序还可以分为内部排序与外部排序。数据正常存储在外存上,如果数据量太大,只能一部分掉入内存先排序。内部排序主要针对数据全部在内存上,主要关注点使得时间空间复杂度最小就行。外部排序还需要额外考虑外存数据换入换出的时间开销。插入排序算法思想:在已经有序的序列中,插入一个新的值。对于一个未被排序的序列,选定一个点,认为前面已经有序,这个点为需要插入的新的点。序列从前往后按照这种思想遍历一原创 2022-07-29 19:14:02 · 245 阅读 · 0 评论 -
408-数据结构-哈希表
哈希表是数据结构,特点是关键字与存储地址存在某种映射关系,通常关系由哈希函数表示addr = f(key)。哈希表存在数据多于存储地址的情况。所以哈希函数在地址视角下是一对多的关系。也就是多个关键字可能对应着同一个存储地址。那么可能会产生冲突,也就是映射点已经存放了数据。构造哈希表需要构造哈希函数,如果哈希函素构造好,可能会使得每一个数据都在哈希表中直接占据映射位置,也就是呈现出通过哈希函数的到地址直接就是数据。那么这样可以使得查找在O(1)复杂度下。如果产生冲突,就需要构建一定机制存放冲突数据,那么查原创 2022-07-28 21:44:39 · 392 阅读 · 0 评论 -
408-数据结构-B树&B+树
B树B树,多路平衡查找树。也就是二叉排序树升级为m叉树。一个结点组成为m个子树与m-1个关键字,关键字左右两边带两个子树,关键字大于相邻左子树,小于相邻右子树。如果树中一个结点最多含有m个子树称为m阶B树。正常B树需要满足条件:一个结点最多含有m个子树,m-1个关键字如果根结点不是终端结点,那么至少有两颗子树一个结点至少包含m/2向上取整个子树(除了根结点),至少包含m/2向上取整-1个关键字。根结点最小子树个树可以是2.满足排序条件每一个结点平衡因子必须为0,也就是每一个结点的任何子树原创 2022-07-28 20:41:43 · 821 阅读 · 0 评论 -
408-数据结构-红黑树
408红黑树定义重点,插入了解。删除考的概率几乎为0,因为太难了。红黑树与二叉排序树类似,都需要满足左子树<根结点<右子树。他们俩的查找添加与删除都在O(logn)数量级。但是区别在于,二叉排序树在进行插入与删除操作时候,及其有可能导致平衡条件被破坏,此时就需要进行平衡二叉树,因为平衡条件算较为苛刻的条件。在大量的插入删除操作用平衡二叉树就显得比较吃力。红黑树在进行插入以及删除时候破坏“平衡”可能性较低,就不需要进行“平衡”。因为红黑树条件较没有那么苛刻。红黑树的逻辑结构:说白了就是树原创 2022-07-27 17:27:22 · 1742 阅读 · 0 评论 -
408-数据结构-二叉排序树
二叉排序树(BST):任何结点满足左子树<根结点<右子树。中序遍历可以获得递增序列。查找操作:比结点小,往左子树走,等于说明找到了,就是这个结点,比结点大往右子树走。如果不含有左子树或右子树,说明查找失败。添加操作:先完成查操作,一般来说二叉排序树每一个结点索引值不相同,相同报错,所以查找返回为空的时候,为NULL指针,同时该指针的位置即为需要插入的点。删除操作:删除操作比较麻烦需要分情况讨论如果是叶子结点,直接删除如果含有单个的左子树,或者右子树,将子树提上来即可如果含有两个子原创 2022-07-27 17:07:35 · 163 阅读 · 0 评论 -
408-数据结构-查找-顺序二分索引
查找:从数据集合寻找满足某种条件的数据元素的过程查找表:查找对象静态查找表:查找表只需要进行查找操作,不需要动态修改数据。需要动态增加删除数据称为动态查找表关键字:数据集合唯一标识一条数据的数据项算法评价指标:平均查找长度ASL.通常从查找成功的ASL与查找失败的ASL两方面考虑(需要会计算)ASL = 累加:出现概率*判定次数顺序查找按排列顺序一个一个查找,通常用于顺序表适用于顺序表,线性表,有序无序都可以。有序可以进行优化,比如按照递增排序,查找到一个点,如果大于查找目标值,那么后续原创 2022-07-24 19:54:10 · 152 阅读 · 0 评论 -
408-数据结构-图的最短路径
主要三种算法:BFS,解决不带权图的最短路径,不能解决带权图dijkstra算法,解决单源点最短路径Floyd算法,解决多源点最短路径2,3都能解决带权图,但只能解决非负值带权图,有负数会有问题dijkstra算法主要与prim算法类似,着眼于结点。算法过程:开辟两个数组,一个表示已经寻找到最短路径,一个表示源点到结点的当前路径权重将源点加入寻找数组,更新权重数组选择权重数组未被选取且最小的结点,表示已经找到最短路径,并且根据这个结点更新权重数组,因为其他结点可能通过这个结点使得路原创 2022-07-22 19:54:59 · 179 阅读 · 0 评论 -
408-数据结构-图遍历&最小生成树prim&Kruskal
图的操作最重要的两个:FirstNeighbor(G,x):获取到该结点第一个领接点。NextNeighbor(G,x, y):返回领接点的下一个。广度优先遍历类似树的广度优先一层一层,图的广度优先,第一个走一步到达地方,走两步到达地方。算法思想就是在上一步到达的点,再走一步走向领接点遍历。依旧使用队列实现图选定一个结点能够生成广度优先生成树或者森林。与树遍历不同点:树往下走一定是没有访问过的结点,图不一定,需要设定记录数组,记录访问过的点。图有可能是非连通图,所以需要在原有代码基础原创 2022-07-22 19:30:53 · 300 阅读 · 0 评论 -
408-数据结构-图特点以及存储结构
连通图:任意两点都连通。强连通图:任何一对顶点可以互通。图背下来考点:对于无向图:如果是连通图,至少有n-1条边,如果边数超过n-1必有回路,如果是非连通图最多有C(n-1,2)条边所有点度数之和为2E完全图有C(n,2)边有向图:对于有向图,如果是强连通,至少需要n条边,构成回路所有顶点入度之和=所有顶点出度之和=边数完全图有2C(n,2)边存储结构邻接矩阵m(i)(j) = 1表示点i与点j存在一条边,无向图即存在一条边,有向图存在i到j的边。0就不存在。求入度,遍历原创 2022-07-19 21:01:40 · 406 阅读 · 0 评论 -
408-数据结构-树的应用-哈夫曼树&并查集
哈夫曼树哈夫曼实际上用于编码,使得编码长度达到最小,因为每一个字符在出现的概率上会有差异,针对出现概率大的用短的编码,出现概率小的用长编码,可以使得编码长度达到最小。编码过程使用二叉树实现。带权路径总和最小即为哈夫曼树。带权路径:每一个叶子结点有一个权值,以叶子结点到根结点需要走过的路经长度✖️权值。如果权重值为字符出现的概率值,那么带权路径总和即为平均编码长度。算法过程:以每一个字符出现的概率作为权重值,产生叶子结点。从小到大排序,取前两个分别为左子树和右子树形成新结点,他们两个权重相加为原创 2022-07-19 20:04:48 · 623 阅读 · 0 评论 -
408-数据结构-树的存储结构
树的存储结构与二叉树不同,二叉树确定子代有,012个,树不确定,所以需要新的存储结构双亲表示法子代结点个数不确定,但是父结点确定只有一个。双亲表示法通常使用顺序存储实现。可以理解为一个特殊结构体数组,结构体含有两块内容,第一块用于存储数据,第二块用于父结点在顺序存储中的下标。typedef Struct { ElemType data; int parentIndex;}parentTree;添加结点:寻找到一个没有存放的,例如parent Index设置为-1的结点进行添加。删除结点:原创 2022-07-17 11:02:34 · 74 阅读 · 0 评论 -
408-数据结构-线索化二叉树
二叉树通过前中后序遍历会产生不同的序列。如果在树中寻找序列中的前驱于后继会显得非常的麻烦。此时可以利用二叉树的链式存储结构,在二叉树链式存储结构中,树的叶子结点的左右结点都会指向NULL,为了不浪费这部分空间,可以将这些指向null的指针指向该结点在序列中的前驱与后继。这样需要在结点中添加一个变量,用来表示当前指针保存的树中的孩子结点,还是序列中的前驱与后继。这样的二叉树就叫做线索二叉树构造线索二叉树代码:typedef Strcut Node{ ElemType data; Node * l原创 2022-07-16 16:45:32 · 211 阅读 · 1 评论 -
408-二叉树-先序中序后序层次遍历
存储结构可以顺序也可以链式,基本都用链式。顺序存储主要使用i结点左孩子为2i,右孩子为2i+1.有就存没有就置空。对于存完全二叉树或者满二叉树还可以,存普通树空间利用率太低。链式存储typedef struct Node{ ElemType data; Node * left; //左孩子 Node * right; //右孩子}BTNode, *BTree;先序中序后序层次遍历先序:根左右中序:左根右后序:右根左层次:一层一层遍历先序中序后序递归代码void preOr原创 2022-07-16 15:48:46 · 166 阅读 · 0 评论 -
408-数据结构-树&二叉树概念与性质
概念祖先:当前结点到根结点路径上的结点都是当前结点的祖先。后代:当前结点分支出来的都是后代有序树与无序树:树中结点的子代结点从左到右有顺序要求就是有序树。结点度:该结点有多少个分支结点度就是多少。树的度:取结点度的最大值即为该树的度。树可以规定每一个结点具有m个最大分支结点数,称为m叉树。最重点掌握二叉树。森林:多个树组成。其余概念:什么兄弟,表兄弟,深度层次翻书看。树性质辨别m叉树与度为m的树:m叉树只规定了每一个结点最多有m个子结点,可以小也可以等,而度为m的树说明必有一个结点有m个原创 2022-07-14 21:22:38 · 263 阅读 · 0 评论 -
408-数据结构-串匹配KMP算法
KMP算法说明以及优化原创 2022-07-13 17:16:33 · 769 阅读 · 0 评论 -
408-数据结构-串概念-朴素模式匹配
串概念408对串概念不做要求,只需要掌握匹配算法。这部分了解即可。基本概念串(string):由零个或者多个字符组成的有限序列。子串:串中任意个连续的字符组成的子序列字符在串中的位置:字符在串中的序号子串在串中的位置:子串的第一个字符在串中的第一个位置所有位置都是从1开始与位序这个概念相同串实际上与线性表非常相像,不同点:线性表的内容为元素,只要结构相同可以是任何东西,但串只能是字符线性表针对的增删改查的操作都是针对元素,而串这类操作大多数情况下都是针对子串串的结构串符合线性表原创 2022-07-12 17:07:30 · 614 阅读 · 0 评论 -
408-数据结构-数组-矩阵存储以及压缩存储
数组就是每一个元素存储在内存上且按照顺序连续存放。多维数组可以按照不同的优先级进行存放。以二维数组为例,可以按行优先进行存放,也可以按照列优先进行存放。行优先,即先让一行连续存放,存放完一行,再存放下一行。列优先同样道理。无论是多少维数组都可以写成:始址+偏移量的形式。所以无论多少维逻辑上都可以看为一维数组。矩阵存储矩阵可以很自然使用二维数组进行存储。矩阵压缩存储由于矩阵中可能有许多元素为0元素或者相同元素,如果重复存储浪费空间,可进行优化。对称矩阵每一个元素符合aij=ajia_原创 2022-07-11 18:45:43 · 663 阅读 · 0 评论 -
408-数据结构-栈应用-括号匹配&表达式求值
括号匹配代码中的括号通常符合一下特性:括号成对存在左右括号通常类型匹配,大括号匹配大括号如果存在括号序列(((()))())。从左向右,后进入的左括号先被匹配,体现了LIFO原则,所以可以使用栈来实现。算法过程:访问括号序列,如果访问到左括号,只需要进行压入栈中即可。而如果碰到右括号则需要进行判断:查看当前栈是否为空,如果为空,说明没有左括号与这个括号匹配,匹配失败,否则继续。弹出栈顶,如果类型符合,则匹配成功,查看下一个括号。如果类型不符合说明序列有误,匹配失败重复访问,直到访原创 2022-07-11 16:01:30 · 460 阅读 · 2 评论 -
408-数据结构-队列
队列与栈类似,也是一种操作受限的线性表。只支持FIFO先进先出。一般具有的操作:初始化入队出队判空判满析构队列在处理队头队尾指针时候也有两种处理方式,将使得代码以及判空判满操作有区别队尾指针指向将要插入位置的前一个队尾指针指向将要插入位置队列的问题相较于栈多一点。由于队列是一种先进先出的结构,如果在内存空间中不断进行入队出队将会使得内存空间地址不断增长。考虑解决办法:循环队列,将队头队尾指针通过模运算映射到开辟的地址空间范围内。以队尾指针指向将要插入位置为例子,在原创 2022-07-10 16:46:57 · 258 阅读 · 0 评论 -
408数据结构-基本概念-时间复杂度-空间复杂度
基本概念数据元素:数据的基本单位,通常作为整体进行考虑,一个数据元素可以由若干数据项组成。数据结构三要素:逻辑结构物理结构数据的运算时间复杂度算法语句执行的频度通常与问题规模存在函数关系,时间复杂度对语句执行的频度最高数量级进行考虑。主要的考虑步骤:找到最深循环分析执行次数与问题规模n的大小关系 x = f(n)x的数量级o(x)即为时间复杂度比较常用的工具:常对幂指阶O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3原创 2022-07-09 16:12:05 · 358 阅读 · 0 评论 -
408-数据结构-栈
栈是一种特殊操作的线性表。因为他满足线性表的三个特征,元素类型相同,个数有限,有顺序。栈特殊操作为LIFO,后进先出。线性表分为两类,第一类为顺序表,第二类为链表。那么栈也可以由此分为两类,称为顺序栈与链栈。由于栈限制了操作,所以操作不想普通线性表如此复杂,一般只包含这几种:初始化 InitStack入栈 push出栈 pop判空 isEmpty获得栈顶getTop析构 destroy获得栈顶getTop与pop的区别在于,getTop不会将栈顶弹出,只会返回值,pop也会返原创 2022-07-10 15:47:57 · 127 阅读 · 0 评论 -
408-数据结构-单链表
通过链式存储方式的线性表,每一个结点包含了数据元素以及指向后继结点的指针算法中考虑方面:如何判断是否为空如何判断表头还是表尾表头、表中、表尾的插入与删除单链表主要有两种(都必须掌握):带头结点,在链头之前加入一个空结点,好处是在链头这个位置不需要进行特殊判断不带头结点带头节点带头结点所有相关操作//声明节点结构体typedef struct LNode{ ElemType data; LNode *next;}LNode, *LinkList;//typedef说明跳转原创 2022-07-09 21:03:40 · 119 阅读 · 0 评论 -
408-数据结构-顺序表
顺序表:由顺序存储的方式实现线性表。说白了就是就是物理空间也是相邻的。通常使用数组实现。可以分为:静态分配,使用大小固定动态分配,在存满时候,使用malloc进行重新分配,用free进行回收在讨论数据结构时候,通常通过三个方面进行讨论:逻辑结构,物理结构,基本操作。一般基本操作包含:初始化插入删除查找,查找又可以分为按值与按位销毁静态分配#define MaxSize 10typedef struct{ ElemType data[MaxSize]; //数据数组 i原创 2022-07-09 19:15:10 · 119 阅读 · 0 评论 -
408-数据结构-线性表与c基本函数说明
线性表定义:具有相同数据类型的n(n>=0)个数据元素的有限序列定义内重点:数据类型相同有限个有顺序n可以为0如果用数学符号描述L=(a1,a2,....,ai,ai+1,....,an)L=(a_{1},a_{2},....,a_{i},a_{i+1},....,a_{n})L=(a1,a2,....,ai,ai+1,....,an)概念:其中下标表示线性表中的第i个,也就是位序。位序从1开始,而计算机存储从0开始除了第一个元素,每一个元素都具有一个直接前原创 2022-07-09 16:59:14 · 237 阅读 · 0 评论