
数据结构与算法
ARTELE
爱好计算机
展开
-
数据结构---中缀转后缀计算表达式计算结果(支持括号)
0.简介有了上一篇的基础,我直接在上面修改支持括号,主要就是将括号里面的式子单独拿出来,在递归计算结果。1.实现#include<iostream>#include<string>#include<vector>#include<unordered_map>#include<stack>#include<functional>using namespace std;unordered_map<strin原创 2020-11-17 21:34:39 · 349 阅读 · 2 评论 -
数据结构---中缀转后缀计算表达式计算结果
0.简介在计算基本是加减乘除表达式的时候,比较好的方法就是把中缀式转换到后缀式来计算,正好最近用上类似的知识了,就复习一下。1.中缀转换后缀并计算结果实现是说话,这类知识点书上,网上到处都有,我就不写了,直接贴代码了。#include<vector>#include<unordered_map>#include<stack>#include<functional>using namespace std;int main(){原创 2020-11-17 21:28:41 · 435 阅读 · 2 评论 -
数据结构---KMP算法(2)
0.简介KMP中有个next数组,我们从这里逐渐引出KMP算法原理。1.最长公共前后缀我们先看最长公共前后缀问题,给定一个字符串s,s为abcdabcd,问这个字符串的最长公共前后最是什么,我们能一眼就看出是abcd,因为abcd.....,和.....abcd,这样一来,就找到了。现在好好理解一下这个找最长公共前后缀问题。首先,这是一个动态规划问题。假如当前字符串长度为n,那么当长度为n的时候,最长公共前后缀m是什么,取决于长度是n-1时候最长公共前后缀k是多少和第n个字符是否与第k+1个原创 2020-07-02 21:07:35 · 470 阅读 · 0 评论 -
数据结构---KMP算法(1)
0.简介KMP算法,在方法上是一个比较难理解的,以前我只是记住了算法的具体步骤,不理解其中原理,久而久之就忘记了算法具体怎么做了,最后只留下了KMP这三个字母。学习算法的目的可以有好多种,可以应付应用,可以应付考试,还可以学习细想,形成思维方式。本篇只介绍思想,不做实现。1.字符串匹配假设A为主串,B为匹配串,普通的匹配方法就是在A中去找B,并且一旦有一个字符不匹配,B就向后移动一次。匹配那么,可不可以一次就将B串移动到一个更好的位置上呢,当然是可以的。新方案我们假定图中字符原创 2020-06-11 23:07:11 · 290 阅读 · 0 评论 -
数据结构---B树
0.简介B树对我来说,是一个比较陌生的数据结构,正是因为陌生,越是陌生就越抵触,索性来研究一下,其中能学到的不仅仅是B树,还会有别是收获。1.磁盘说到B树,基本所有资料都会介绍说其与磁盘上的读写和查找数据有关,所以B树有了这么个独特的限制,如果说平衡二叉树是抽象层面的思想,B树已经混入一些实际应用的限制了,这个限制主要在于B树的结点数据结构。磁盘和内存区别很大,但是本质差不多,都是存数据,由于磁盘读写都很慢,所以磁盘每次读取的单元块就比较大,这样减少连续数据反复读写磁盘,早期的读写单位是512字原创 2020-06-08 18:25:27 · 217 阅读 · 0 评论 -
数据结构---二叉树(2)---平衡二叉树(5 删除)
0.简介删除平衡二叉树的结点也需要仔细的研究一下。还有代码上对上一篇打了些补丁1.删除删除结点后的结构一般有两种,一类是删除后不平衡了,一类是删除后仍然平衡。这两类别目前对我们来说,没有什么区别,因为前面已经研究过结点平衡调整的方法,所以可以直接在这里使用,那么需要研究的就是如何删除结点。我们先从链表的角度来看,链表删除比较容易,改变指向下一个结点的指针就好,一般来说,改变一个就可以。链表删除二叉树来说,删除就麻烦了一些,要有两个指针需要变化,链表只需要考虑下一个元素怎么连接上就好原创 2020-06-07 21:39:54 · 456 阅读 · 0 评论 -
数据结构---二叉树(2)---平衡二叉树(4 插入)
0.简介前面主要的二叉树理论部分介绍,这里开始实践。1.插入输入一个元素,树在插入的过程中就会调整。#include<iostream>#include <algorithm>using namespace std;struct TreeNode{ TreeNode(){} TreeNode(int n,int h):num(n),height(h) {} int num = 0; int height = 0; TreeNode* left =原创 2020-05-23 21:15:31 · 232 阅读 · 0 评论 -
数据结构---二叉树(2)---平衡二叉树(3)
0.简介前面分析了平衡二叉树是怎么调整平衡的,这里就来解决另一个问题,平衡二叉树理论为什么能成立?难道就不会有怎么调都不会平衡的情况吗?一起探究一下吧。1.平衡二叉树我在很早的时候就注意到了一个问题。二叉树变形上图中是一颗不平衡的二叉树向平衡调整的一部分过程,这个过程中我发现,子树a,b,c,d的左右关系始终都是不变的,就是从左到右来看始终都是a,b,c,d这个顺序,并且圆圈里的BCA这三个节点的顺序也始终都是不变的,那变化的是什么呢?从图中我们只能观察到,变化的是树的形状。因为平原创 2020-05-22 16:37:30 · 1013 阅读 · 0 评论 -
数据结构---二叉树(2)---平衡二叉树(2)
0.简介上一篇说到了平衡二叉树不平衡的一种情况,这次我们来看另一种情况。1.平衡二叉树不平衡的情况根据上一篇的介绍,对于这种情况,我们先考虑将A节点降低来配合C节点的深度。调整树上图中,我将C又收回去了,因为这里的调整和C没什么关系,我们发现,调整好后,树仍然是不平衡的!虽然将A中的子树与原来B中的子树(阴影部分)达到了平衡,但是却升高了B的另一个子树,导致再次不平衡,看来用上一篇的方法对付这种情况不好用了。调整树我们看新的这条调整路线,将A节点拿下来后,并没有直接将C原创 2020-05-21 21:44:44 · 332 阅读 · 0 评论 -
数据结构---二叉树(2)---平衡二叉树(1)
0.简介本次我来简单做一个平衡二叉树的推导,意在了解平衡二叉树的旋转方法是怎么来的,还有就是我记不住LL,RR这都是啥意思,所以决定找个好理解的方法,应该说是我能理解的方法。1.平衡二叉树平衡二叉树有个规则,首先是有序,然后就是一个节点的左右子树的高度差不能超过1。也就是差是2以及以上就是不平衡了,因为平衡二叉树是时刻都在调整平衡,所以差顶多就是2了。来看一下不平衡的情况是什么。下面采用手绘图来表达。不平衡情况上图中我们不难看出,这种情况是不平衡情况,相对的还可以是右子树深左子树浅原创 2020-05-21 02:28:48 · 462 阅读 · 0 评论 -
数据结构---二叉树(1)
0.简介本篇博客是为面平衡二叉树,B树,红黑树铺垫,所以这里就简单实现创建一个树。1.创建树代码中有详细注释,就不再写多余的句子了。这个树的创建是根据左小右大的顺序建成。#include<iostream>#include <algorithm>using namespace std;struct TreeNode{ int num = 0; int height = 0; TreeNode* left = nullptr; TreeNode*原创 2020-05-21 00:26:53 · 296 阅读 · 0 评论 -
数据结构与算法笔记---栈---最小栈[1]
0.简介本文章将介绍最小栈原理和实现。1.最小栈栈本身有push,pop操作,现在需要添加一个min操作,min操作就是求得栈中最小元素,要求时间复杂度是O(1)。2.分析其实求栈中最小值本身不是难题,这里难点在于时间复杂度是O(1),当找min值的时候,要求立刻就找到,这个就要追寻栈的一些本质算法。从数括号深度来看吧。说有这么一段代码。int fun(){//作用...原创 2020-05-04 23:13:47 · 265 阅读 · 0 评论