数据结构
文章平均质量分 85
makerjack001
这个作者很懒,什么都没留下…
展开
-
关于KMP算法(多图详解)
KMP算法学习为什么用KMP算法暴利匹配算法KMP算法思路研究子串流程图为什么用KMP算法KMP是一种高效的模式匹配的一种算法模式匹配,说直白就是找寻子字符串在主字符串的位置(其实KMP这三个字没啥意义,这算法是3个人研究出来的,取3人名字首字母也就是KMP)暴利匹配算法与KMP相对立的一个算法就是暴力匹配算法,逐个字符一一对比形象地理解就是可以看到在这个简短的例子中,当主字符串(以下简称主串)对比到3时,与子字符串(简称子串)不同那么就要折返到开始位置的下一位如果主串再长点,对比的字符原创 2021-08-17 20:59:22 · 4410 阅读 · 4 评论 -
《数据结构》一些零碎知识点
基础相同的逻辑结构对饮的存储结构不一定相同比如线性结构可以用数组存储,也可以用链表存储知识点:逻辑结构描述数据元素之间的逻辑关系,分为以下几类:1、 集合:数据元素同属于一个集合,此外没有关联2、 线性结构:数据元素之间存在一一对应的关系3、 树结构:数据元素之间存在一对多的层次关系4、 图结构:数据元素之间存在多对多的层次关系存储结构又称物理结构,是数据在计算机中的表示,分为:1、 顺序存储结构用一组连续的存储单元依次存储数据,元素之间的逻辑关系由元素存储位置表示2、链接存储结原创 2020-12-02 22:07:44 · 235 阅读 · 0 评论 -
《数据结构》中一些常见考点
已知二叉树写遍历序列 或 已知两种遍历序列构造二叉树这考验我们对于二叉树的遍历方式的熟悉程度,之前我写过一篇非递归遍历的博客,但是为了讲解方便,这里还用递归的方式介绍吧对于任何一个二叉树,其都可以宏观上看成由三部分构成 根节点,左子树,右边子树输出也是由宏观到微观的次序来实现前序遍历根、左、右先输出A,然后输出“左”的部分,待“左”全部输出完毕,再输出“右”的部分具体“左”的部分又可以分为根、左、右先输出B,再进行“左”,最后“右”B的“左”为D,D可以看做是这样的结点先输出“根”D原创 2020-11-29 21:39:13 · 714 阅读 · 0 评论 -
矩阵的压缩存储
我的离散老师一直建议我们用矩阵来存储信息,尤其是两个事物的关系信息(比如两个元素相关联,比如图)但如果要存储的关系是双向的,也就是无向图,那么用矩阵就会造成部分浪费,比如从a到b有路径,那么只需要在数组[a][b]位置置1即可,[b][a]再置1就显得浪费了这种关系矩阵往往是对称矩阵所以需要压缩存储给相同元素只提供一个位置,以节约内存空间的占用问题进一步来说,就是把重复的部分都去除,只保留有用信息原始的存储结构应该是这样的现在应该是但是如果还是用二维数组作为存储结构,其开辟的空间还是客观原创 2020-11-24 20:18:40 · 411 阅读 · 0 评论 -
删数问题
最近要整算法了,就找个软柿子捏捏吧删数问题题目是这样的洛谷地址思路分析首先这个正整数是N,但括号一句不超过250位这明显是不能用传统的int 类型哪怕long long都不够存储了这里可以考虑用数组拆分存储这个N,以实现对数据的完全存储那么初始输入的应该是String类型的,这样数组可以直接用toCharArray()函数实现面对这么一个数字,这么去掉使得其剩余数字组成的最小呢?去掉当前高位最大数即可两个要求最大 和 高位先找出最大的数字,同等情况下去除高位的那个两个思路:队列降序原创 2020-11-23 02:50:51 · 328 阅读 · 0 评论 -
数据库的三大范式
为什么需要范式避免信息重复方便更新异常插入异常:无法正常显示信息删除异常:丢失有效的信息三大范式要举例的数据较多,我就用Excel演示了第一范式要求数据库中每一个字段都是不可再分的原子数据项重点是不可再分先看下下面这张表有没有什么不对的?根据不可再分的要求,学习状况这栏就不满足应该拆分为如下的字段这个表才满足第一范式的要求第二范式在满足第一范式的基础上,要确保数据库中每一列都和主键相关只存储一类数据比如下面的反例虽说的确可以考试与学号相关但考试成绩这一类是依赖于考试原创 2020-11-14 20:21:13 · 90 阅读 · 0 评论 -
链表的插入排序、交换排序、选择排序(多图详解)
能点进来这文章的肯定对链表有所认知,我就不科普了,这是我的链表类代码,用于接下来的介绍struct Node { int data; Node* next;};//创建结构体——结点class LinkList {private: Node* first;public: LinkList(); LinkList(int a[], int n); ~LinkList() {}; void insert(Node* a, Node* b);//把结点b插入结点a之后 void swa原创 2020-11-05 01:16:17 · 1253 阅读 · 0 评论 -
图的实现及其深度优先、广度优先遍历
图图的概念我就不赘述了传送门讲的比我清楚代码也很简单int visited[10] = { 0 };//这个是为了之后访问时候用的,存储访问信息容器class MGraph {private: int vertex[10]; int arc[10][10] = { 0 }; int vertexnum, arcnum;public: MGraph(int a[], int n, int e); ~MGraph() {}; void DFSTraverse(int v); void原创 2020-11-03 22:19:29 · 393 阅读 · 0 评论 -
二叉树的 前序、中序遍历(非递归)
二叉树的 前序、中序遍历(非递归)二叉树基本结构应该都知道,我就不赘述了,其遍历规则倒是经常出现的知识点,根据根节点的相对位置又分为前序遍历,中序遍历,后序遍历。要是使用递归的方法,直接控制输出的顺序即可以前序遍历为例void BiTree::PreOrder(BiNode *bt){ if(bt==nullptr){ return; } else{ cout<<bt->data<<endl; PreOrder(bt->lchild); PreOr原创 2020-10-28 20:56:34 · 193 阅读 · 0 评论 -
单个指针下循环链表的入队与出队
循环链表的入队出队题目是这样的: 设以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。编写相应的入队和出队程序。如果带头尾指针那就很简单了,不带头尾指针只能在函数中新建工作指针来操作。思考方向队列嘛,先进先出,用循环链表存储,再有个尾指针,逻辑结构就是这样的入队入队分三步:新结点指向头结点尾结点指向新节点尾指针指向新的尾结点出队先进先出嘛,头结点删了就行理论上直接尾结点指向第二个就完事了但这样只是找不到了原来的头结点,它依然是存在于内存中的,虽说眼不见为原创 2020-10-27 22:02:50 · 3763 阅读 · 3 评论 -
链表的就地逆置(多图详解)头插法和更改指向法
链表的就地逆置此处说的是单链表,双链表就没逆置这说法了,循环链表可以按照单链表的操作实现思考方向本来链表应该是这样的逻辑结构最终应该是这样的逻辑结构这样一个工作指针显然是不够的,改变方向后指向原来的通道就断了,毕竟单链表逻辑上是单向的在链表已有first指针的基础上,引入2个工作指针p、q 在确保first改变指向(指向p)的时候,q能保存剩余链表的指向(其实还需要一个保存first地址,但不是主要作用)由于结点1最终指向空,所以我就不拿他距离演示了,直接拿结点2演示,更有普遍性在操作原创 2020-10-26 20:11:37 · 6664 阅读 · 7 评论 -
AVLTree旋转的进一步思考
AVLTree旋转的进一步思考由头思路csdn第一天由头前天忽然想研究平衡二叉树代码了,看了半天,知乎上的一篇文章挺好的:链接: 传送门.可惜的是答主没写全,只有LL算法的代码,LR都是以引导的方式让我们去思考。因此我进一步想了一下RR和RL算法的代码实现。思路原文中这个我是很懵的,理论上结点1插入后就立刻不平衡了(我的想法是每次插入新结点就判断,如果不平衡就适应性调整)但想想,这应该是为了更有普适性吧,即便存在子节点,也能旋转以达到平衡的目的。 private Node<K, V&g原创 2020-10-23 23:42:26 · 141 阅读 · 0 评论