【数据结构学习记录11】——KMP算法,AC自动机青春版

@TOP一.前言上一节中,我们通过一种暴力的串搜索(匹配)方法,学名叫做BF算法。而这种方法的时间复杂度能够达到O(mn)的数量级,而有些程序员就不乐意了,于是乎有三个分别以KMP字母开头的大佬发明出了这种理论上在O(mn),实际上经常在O(m+n)的一种搜索算法,我们称为KMP算法。二.原理介绍1.前后缀我们要先懂得前后缀是啥玩意儿。假设我们有字符串Kanna那么它的前缀有:Kann、Kan、Ka、 K而它的后缀有:anna、nna、na、a很好理解对吧,就不多说了。不过一个字符串的本身是
分类: 其他 发布时间: 03-28 10:56 阅读次数: 0

【数据结构学习记录12】——多维数组的顺序实现

多维数组的顺序实现一.前言二.数组的结构再探1.降维2.下标计算3.名词解释三.实现原理1.数组的结构2.数组的初始化3.数组的取地址4.数组的取值与修改四.代码实现1.stdarg.h1.1 va_list1.2 va_start()1.3 va_arg()1.4 va_end()1.6 样例代码2.主代码一.前言对于数组,我们大家肯定不陌生。单维数组肯定很熟悉,那多维数组呢?实际上就是多个单维数组所构成的特殊的数组的数组。这一内容,在C++的文章里也提到过。那么,我们如何通过用线性结构来模拟一个多维
分类: 其他 发布时间: 03-28 10:56 阅读次数: 0

【数据结构学习记录13】——稀疏矩阵的表示与运算

稀疏矩阵的表示与运算一.介绍二.实现稀疏矩阵的原理1.稀疏矩阵的顺序存储2.稀疏矩阵的转置T3.求转置的方法4.快速求转置法5.稀疏矩阵加法(减法同理)6.稀疏矩阵的乘法三.稀疏矩阵的代码定义1.稀疏矩阵的元素2.稀疏矩阵的定义3.稀疏矩阵的快速转置4.稀疏矩阵的加减法5.稀疏矩阵的乘法四.代码实现一.介绍什么是稀疏矩阵,假设我们有一个矩阵(以下部分回去重新编辑)[000000025000]\begin{bmatrix} 0 & 0 &0 &0\\ 0 &am
分类: 其他 发布时间: 03-28 10:56 阅读次数: 0

【数据结构学习记录14】——树与二叉树

树与二叉树零.前言一.树1.定义2.性质3.表示方式4.基本术语二.二叉树1.小介绍2.性质3.二叉树的储存结构3.1 顺序储存3.2 二叉链表3.3 三叉链表4.二叉树的遍历4.1 定义4.2 先序遍历4.3 中序遍历4.4 后序遍历三.编程原理1.存储结构2.存储(先序遍历)3.遍历输出四.代码实现零.前言本来上一章应该还有稀疏矩阵的十字链表存储和广义表。但是广义表,更多的是偏向于题目,了解下概念,能计算就行了。广义表从某种程度来说,也算是一棵树。一.树1.定义树是一个n(>=0)个结
分类: 其他 发布时间: 03-28 10:56 阅读次数: 0

【数据结构学习记录15】——线索二叉树

线索二叉树一.概念二.实现三.代码实现一.概念什么是线索二叉树?在我们写二叉树的时候,我们在末端结点的左右儿子用了NULL来表示,以告知结束。如果我们将这个左右儿子指向的地址指向下一个该遍历的结点,那岂不是就能提高结点的利用率?一个结点,在它的之前遍历的那个结点,叫这个结点的前驱,同理,在它之后遍历的第一个结点,叫做后继 。我觉得这幅图画得很好:实质上来说,线索二叉树,能将一个二叉树变成一个双向链表。其中指向前驱和后记的指针,叫做线索, 加上线索的二叉树就叫线索二叉树二.实现为了实现我们的线索
分类: 其他 发布时间: 03-28 10:56 阅读次数: 0

【数据结构学习记录16】——树与森林

树与森林一.树的储存结构1.双亲表示法2.孩子表示法3.孩子兄弟表示法二.兄弟孩子森林的操作1.森林转换成二叉树2.二叉树转换成森林3.兄弟孩子森林的遍历a.先序遍历(其实是DFS哦)b.后序遍历4.说明一.树的储存结构在大量的应用中,人们用过多种形式的存储结构来表示树。现在会详细的讲述三种储存结构,并详细研究其中最优秀的一种储存结构。1.双亲表示法我们通过一个顺序表来存储这个树,表内的内容有:树本身的内容和它双亲的顺序表下标。它的根结点的双亲下标为-1即可。如果我们要求根结点,那么只需要重复取某
分类: 其他 发布时间: 03-28 10:56 阅读次数: 0

【数据结构学习记录17】——赫夫曼树与赫夫编码

哈夫曼树一.赫夫曼树1.概念2.实现二.赫夫曼编码1.背景2.原理一.赫夫曼树1.概念首先,我们得了解一下几个概念:路径:一个结点到另一个结点之间的路径。路径长度:路径上的分支数目叫路径长度。带权路径长度:所有叶子结点的带权路径长度之和。如下图,该树的路径长度是:1+2+3+3=9而带权路径则是:1*7+2*5+3+2+3*4=352.实现那么,我们如何构造一棵赫夫曼树呢?不难得出,肯定是权越大的结点,它的路径长度应该最短。按以下步骤:根据权值,将每个结点记作一棵树,记为F1 · ·
分类: 其他 发布时间: 03-28 10:56 阅读次数: 0

【数据结构学习记录18】——图的概念

图的概念零.前言一.术语1.描述2.完全图3.稀疏、稠密图4.子图5.邻接与度6.路径与回环7.连通图与连通分量8.生成树9.有向树和生成森林二.图的储存结构三.图的遍历零.前言在前面,学习了链表和树。在链表里,元素只有线性关系,每个元素一般只有一个前驱和后继。在树中,元素之间有明显的层次关系,并且每一层上的元素可能和下一层的多个元素有关,但是只能和上一层的某一个元素有关。而在图,我们结点间的关系是可以任意的,就好比一棵树,结点只有一个双亲,而图能拥有多个双亲。。。听起来怪怪的。。一.术语1.
分类: 其他 发布时间: 03-28 10:56 阅读次数: 0

【数据结构学习记录19】——图的储存结构

一.邻接矩阵邻接矩阵很简单,假设我们有n个变量,那么我们就创建一个n*n的矩阵G。假设弧是为<i,j>那么我们可以通过矩阵G[i][j]的值来判断这个弧是否存在。比如不存在的弧,我们规定为值为0,存在的弧则为1,若有权,则为它的权。例如下图所示的图,用邻接矩阵表示则为:∣0100101100000000∣\begin{vmatrix}0 & 1 &0 &0 \\1&0 &1 &1 \\0&0 &0 &0
分类: 其他 发布时间: 03-28 10:56 阅读次数: 0

【数据结构学习记录20】——图的两种遍历

一.两种遍历1.深度优先搜索(DFS)深度优先搜索,顾名思义,就是优先向更深的地方搜索。假设这是一棵树,那么深度优先搜索会优先向深度更高的结点搜索。因为深度优先搜索的概念,要到最深的结点后才返回,所以同层次的结点是先访问,后遍历,符合栈的结构模型,所以我们的深度优先搜索一般都是通过递归实现。对于这个像树的图来讲:假设我们的从1开始遍历,那么他会优先访问深度更高的顶点:最终,它的遍历顺序为:GraphG DFS:1 2 4 8 5 3 6 72.广度优先搜索(BFS)定义与DFS相似,广度
分类: 其他 发布时间: 03-28 10:56 阅读次数: 0

【数据结构学习记录21】——两种最小生成树的算法

两种最小生成树的算法一.前言二.普里姆算法1.原理2.流程三.克鲁斯卡尔算法1.原理2.流程3.并查集四.代码一.前言什么是最小生成树?假设我们有一个连通的网(弧或边带权的图),在这个网里,我们需要构建一个(强)连通分量,且该连通分量的权的和最小。举个例子,就像给你一个镇的地图,在已知的所有路上,新修一条造价最小的村村通。二.普里姆算法1.原理普里姆算法的思想就是,有顶点集U,和已确定的顶点集V。然后:从U里任意取一个顶点,然后加入到V中。从(U-V)的集合里取一个元素,找一条弧(边)从该元
分类: 其他 发布时间: 03-28 10:55 阅读次数: 0

【数据结构学习记录22】——有向无环图及其应用

有向无环图及其应用一.有向无环图的概念二.拓扑排序(AOV网)1.概念2.偏序与全序a).偏序b).全序c).偏序与全序的区别3.拓扑有序4.拓扑排序的过程三.关键路径(AOE网)1.概念2.实现a).最早发生时间Ve(j)b).最晚发生时间Vl(j)c).e(i)d).l(i)四.代码1.AOV2.AOE一.有向无环图的概念一个无环的有向图称作有向无环图。简称DAG图。DAG图是相较于有向树的更特殊的图。比如:检查一个图是否有环,可以通过遍历+标记的方式进行检查,若某个顶点的弧指向了另一个已经遍历过
分类: 其他 发布时间: 03-28 10:55 阅读次数: 0

【数据结构学习记录23】——最短路径

最短路径一.概述二.迪杰斯特拉(Dijkstra)算法三.一.概述最短路径是指:如果给定一个有向、无向网,找到一条路径,使得两个顶点间的权和最小。比如:这个图里,V0到V5的最短路径是60。(V0–V4–V3–V5)二.迪杰斯特拉(Dijkstra)算法这个算法和前面最小生成树的算法思想一模一样,代码甚至都基本相同,只是求的对象不同,还是以顶点出发,向周围拓展。只不过标记数组的叠加态为当前顶点到其他顶点的所有顶点的最短路径上权只和。代码这篇就不详写了。三....
分类: 其他 发布时间: 03-28 10:55 阅读次数: 0

【数据结构学习记录24】——查找

查找的概念零.前言一.查找的概述二.概念三.性能分析零.前言这一大章(查找系列)都只给出概念,并不以代码实现,更多的地方是数学分析。一.查找的概述查找表是由同一类类型的数据元素构成(或记录)构成的集合。现在查找一般会有四种操作查询某个特定的元素是否在查找表中。检索某个特定的元素的各种属性。在查找表中,插入一个数据元素。在查找表中,删掉某个数据元素。如果我们的查找表只有前两种操作,那么该类表叫静态查找表。如果在查找的过程中,出现了增删,那么这类表叫动态查找表。二.概念关键字(Ke
分类: 其他 发布时间: 03-28 10:55 阅读次数: 0

【数据结构学习记录25】——排序与插入排序

插入排序零.排序的基本概念1.定义2.稳定性3.内外部排序一.直接插入排序1.算法原理2.实现过程3.代码实现二.折半插入排序1.算法原理零.排序的基本概念1.定义假设含n个记录的序列:{R1,R2,R3,···,Rn}其相应的关键字序列为:{K1,K2,K3,···,Kn}。需确定1,2,3,···,n的一种排列p1,p2,p3,···,pn,使其相应的关键字满足如下的非递减(或非递增)关系Kp1 ≤ Kp2 ≤K p3 ≤ ··· ≤ Kpn即,使最上面的那个序列成为一个按关键字有序的序
分类: 其他 发布时间: 03-28 10:55 阅读次数: 0

【数据结构学习记录26】——冒泡与快速排序

冒泡与快速排序一.冒泡排序1.原理2.排序过程3.代码二.快速排序1.原理2.排序过程3.性能分析4.代码一.冒泡排序1.原理在快速排序之前,我们得了解一下拥有差不多思想的一个简单版的排序,冒泡排序(或起泡排序)。在冒泡排序中,我们的思路类似于吐泡泡一样或者扔石头一样:从后往前,把最小(最大)的值移动到最前面(或最后面) ,直到所有元素都被排序后,这个序列就变得有序。冒泡排序的时间复杂度为:O(n2)O(n^2)O(n2)2.排序过程3.代码这里举例一个把最大元素“沉”到最后的代码。v
分类: 其他 发布时间: 03-28 10:55 阅读次数: 0

【数据结构学习记录27】——选择排序和堆排序

选择排序和堆排序一.选择排序1.原理2.过程3.代码二.堆排序1.堆的概念2.堆与完全二叉树的关系3.堆排序的过程4.构造堆5.调整堆6.代码一.选择排序1.原理选择排序比较简单,就是每一次遍历后,将无序区的一个最大(最小)值与无序区的第一个值或最后一个值交换,这样,无序区渐渐的变为有序,最终完成排序。它的时间复杂度也是O(n2)O(n^2)O(n2)2.过程3.代码int selectsort(int arry[], int len){ int min, i, j, temp;
分类: 其他 发布时间: 03-28 10:55 阅读次数: 0

【数据结构学习记录28】——归并排序

一.原理我们常见的归并排序,又叫做2路归并排序,相当于是将两个顺序表或链表合在一起的操作。如果我们通过二分法来实现,将个长的顺序表一直二分法一直分到最小的子序列,然后从最小子序列逐步合并成大的表,那么最后这个大表就是有序的了。所以这是一个递归的过程,时间复杂度为nlog2nnlog_2nnlog2​n二.过程因为是个递归的过程,所以一起展示比较方便假设一个有序表的元素是0~n共n+1个元素,其中开始表示l,结束表示h,中间元素表示为m=(l+h)/2递归表达式可以写为:sort(l,h)={
分类: 其他 发布时间: 03-28 10:55 阅读次数: 0

【数据结构学习记录29】——基数排序

一.原理所谓的基数排序的基数,就是我们讲进制时候的那个基数。比如十进制的基数就是10,二进制的基数就是2。其中,从右向左开始第n位,实际上表示的是基数的n次方倍。比如1012表示1⋅20+0⋅21+1⋅221\cdot2^0+0\cdot2^1+1\cdot2^21⋅20+0⋅21+1⋅22那么,我们可以通过先比较某一位,进行排序,然后再比较另一位进行排序,直到排完所有的位数。比如我们以LSD低位优先法,从右往左一位一位的比较;或者MSD高位优先法,从左到右一位一位的比较,从左往右一位一位的比较。过程
分类: 其他 发布时间: 03-28 10:55 阅读次数: 0

【数据结构学习记录30】——各种内部排序的比较

一.性能分析二.应用应用的考虑因素:元素数目、元素大小、关键字结构及分布、稳定性、存储结构、辅助空间等若n较小时(n≤50),可采用直接插入排序或简单选择排序若n较大时,则采用快排、堆排或归并排序若n很大,记录关键字位数较少且可分解,采用基数排序当文件的n个关键字随机分布是,任何借助于“比较”的排序,至少需要O(nlogzn)的时间若初始基本有序,则采用直接插入或冒泡排序当记录元素比较大,应避免大量移动的排序算法,尽量采用链式存储三.结语现在大概考研部分的数据结构已经完成了,自己
分类: 其他 发布时间: 03-28 10:55 阅读次数: 0