算法与数据结构
Erick_Lv
菜鸡互啄
展开
-
线段树
#include <iostream>#include <cstring>using LL = long long;const int MAXN = 100000000;int arr[MAXN] = {0};int tree[MAXN] = {0};inline int LEFT(int n) { return 2 * n;}inline int RIGHT(int n) { return 2 * n + 1;}inline int M原创 2021-03-29 22:37:38 · 382 阅读 · 0 评论 -
二叉树中最大的二叉搜索子树
问题描述思路和代码暴力方法是每个节点为根节点,然后判断以该节点为根节点的树是否是二叉搜索树,然后求规模最大的,这种方式的时间复杂度是O(N2)O(N^2)O(N2),空间复杂度是O(h)O(h)O(h)。搜索二叉树左子树所有的数据都小于等于根节点,右子树所有的数据大于等于根节点;定义是递归的。如果左子树,有一个节点不满足,那么整个左子树都不是二叉搜索树,右子树同理。后序遍历的特征是,我们能...原创 2020-01-07 20:57:54 · 635 阅读 · 0 评论 -
二叉树最长路径
问题描述思路和代码参考https://blog.csdn.net/qq_35976351/article/details/103864846原创 2020-01-07 17:24:12 · 2780 阅读 · 2 评论 -
区间内累加和为规定值的最长子序列
问题描述给定一个未排序序列和一个值N,然后求解该序列中的一个连续子序列,使得这个子序列s的累加值等于N,而且s是所有子序列中最长的。要求时空复杂度都是O(N)O(N)O(N)思路和代码首先,需要解决的是未排序的情况,参考资料https://www.jianshu.com/p/028055303e3bhttps://blog.csdn.net/gkq_tt/article/detail...原创 2020-01-07 11:13:30 · 987 阅读 · 0 评论 -
打印二叉树的边界节点
问题描述从根节点起,逆时针输出二叉树所有的边界节点:根节点每层最左侧节点每层最右侧节点底层的所有叶子节点,比如14、15等。上述的结果是:1 2 4 7 11 13 14 15 16 12 10 6 3空间限制是O(h)O(h)O(h),时间限制是O(N)O(N)O(N),hhh是树的高度,NNN是节点的个数。思路和代码需要的节点分为三种:左边界:一层中最左侧的节点...原创 2020-01-06 20:31:18 · 768 阅读 · 2 评论 -
非递归遍历二叉树
后续遍历暂时没写,留作后期补充#include <iostream>#include <stack>struct Node { int val; struct Node *left{nullptr}, *right{nullptr}; Node (int n = 0): val(n), left(nullptr), right(nullptr...原创 2020-01-03 17:25:39 · 126 阅读 · 0 评论 -
链表根据主元切分成3段
把链表根据给定的主元重新排序,使得比主元小的在左侧,中间是主元,大的在右侧。思路,不创建新的节点,但是利用原来结构创建3个新的链表,之后拼接,代码如下:#include <iostream>#include <utility>#include <algorithm>template<typename T>struct Node { ...原创 2019-12-26 22:44:38 · 158 阅读 · 0 评论 -
单调栈和单调队列的应用即总结
单调栈单调栈的基础结构是“栈”,即元素是LIFO的,只能从栈顶控制数据出入;单调表示从栈的一端到另一端遍历,元素是单调递增或者单调递减的。比如单调递减栈,从栈底到栈顶的元素可以是:bottom 10 7 5 3 2 1 top单调队列参考文献https://endlesslethe.com/monotone-queue-and-stack-tutorial.htmlhttps://...原创 2019-12-25 20:19:38 · 470 阅读 · 0 评论 -
单调栈及其应用
单调栈应用参考资料https://blog.csdn.net/roufoo/article/details/78569554https://blog.csdn.net/yutianzuijin/article/details/52072427原创 2019-12-18 21:02:29 · 130 阅读 · 0 评论 -
单调队列及其应用
单调队列单调队列是一种广泛应用的数据结构,它能够动态地维护定长序列中的最值。可以这么理解,存在有一个队列,队列中的元素需要满足单调性,而且队尾元素和队首元素距离最大是k。以递减队列为例子,构造队列的方式如下:入队:待加入的元素值x,如果x小于队尾元素,直接入队;如果x大于等于队尾元素,则弹出队尾元素,直到队列是空或者队尾元素大于x,此时x加入队列出队:对于插入的元素,检查该元素和队首元素...原创 2019-12-05 17:50:28 · 886 阅读 · 0 评论 -
判断无序数组中是否存在两个数之和为m
题目描述给定一个长度是n整数的无序序列,然后给定一个整数m,判定是序列中是否有两个数的和是m。注意,数列是无序的,数据可能有重复的。解题思路需要利用哈希进行解题,这样保证复杂度是O(n)O(n)O(n)。 注意一个特别情况,加入数据序列是{1, 3, 5},数据是6,那么3的情况下会出问题。因此解决方案是:如果m是偶数,而且当前的数是m/2而且只出现了一次,那么肯定不是。AC代码#inc...原创 2019-04-23 18:03:56 · 958 阅读 · 0 评论 -
最长连续子序列
问题描述给定一个无序的子序列,判定这个子序列中最长的连续子序列的长度。子序列是这样定义的:比如给定{2, 3, 100, 5, 4},那么2, 3, 4, 5就算是一个连续的子序列。假设没有重复的数据。解题思路O(n)O(n)O(n)的复杂度,借助std::unordered_set实现,把所有的元素构造到一个Hash Set中,那么查找和删除的复杂度是O(1)O(1)O(1)。之后遍历搜寻...原创 2019-04-21 17:34:35 · 4596 阅读 · 0 评论 -
Kruskal算法
简介对最小生成树Kruskal算法的一个复习回顾,借助并查集实现代码示例#include <bits/stdc++.h>using namespace std;const int MAXN = 10000;int tag[MAXN];int par[MAXN];struct Arc { int u, v, w; Arc(): u (0), v (0)...原创 2019-03-15 21:12:02 · 403 阅读 · 0 评论 -
Dijkstra算法
算法简介算法用于求解源点到各个节点直接的最短路径。该算法的核心是使用路径松弛操作,借助一个三角不等式进行实现。假设当前的的源点是sss,目的节点是vvv,δ(s,v)\delta(s,v)δ(s,v)表示当前sss到vvv的最短距离,uuu表示vvv的任意一个节点,而且w(u,v)w(u,v)w(u,v)表示边的权重,那么恒有:δ(s,v)≤δ(s,u)+w(u,v)\delta(s,v)\...原创 2018-10-24 23:34:12 · 144 阅读 · 0 评论 -
关于数组表示的二叉结构中,下标乘除法对应关系的理解
在C/C++中,有很多时候,需要处理类似于二叉树的结构。二叉树节点都有左右两个孩子和父节点(假设它们都存在)。为了方便表示,我们一般采用链式结构存储。可是,如果是完全二叉树的结构,甚至于满二叉树的结构,同时对开辟和释放节点速度的要求也比较高的情况下,就需要使用数组进行表示了。数组存储最大的优势在于随机访问,那么父节点和孩子节点的对应法则是:left = 2 * parent;right = ...原创 2018-10-11 09:26:55 · 273 阅读 · 0 评论 -
Python实现A*算法解决N数码问题
Python实现了A*算法,解决N数码的问题原创 2018-09-19 09:07:59 · 14281 阅读 · 6 评论 -
Trie字典树
字典树Trie简介:字典树Trie又称前缀树、查找树,是哈希树的一个变种。存储字典、字符串快速检索、求最长公共前缀、快速统计和字符串快速排序等有较多的应用。可以减少无效字符的比较,相对于哈希来说,查找效率更高,更节约空间。基本性质:根结点没有字符,除了根结点外,每个结点只有一个字符从根结点到某一结点,路径上经过的字符连起来,为该结点对应的字符串每个结点的所有子结点包含原创 2018-02-03 17:04:27 · 221 阅读 · 0 评论 -
二分查找以及数组下标的移动规律
二分查找算法复杂度log2&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;#x2061;n&amp;amp;amp;amp;amp;amp;amp;amp;amp;quot; role=&amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;presentation&amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;&amp;amp原创 2018-01-29 10:59:26 · 390 阅读 · 0 评论 -
数据离散化处理
数据离散化处理如果我们只关心数据的相对位置,而不关心数据的具体数值,那么就要使用离散化处理来表示数据的位置。这种操作经常结合线段树等的数据结构,来压缩存储空间。直接看代码,很好理解。#include <bits/stdc++.h>using namespace std;const int MAXN = 10;const int INF = 1000000;int n...原创 2018-02-09 20:36:39 · 693 阅读 · 0 评论 -
n进制快速转化成10进制
n进制快速转换成10进制,不用中间值,直接快速循环累乘并添加最后一位即可。在这里,假设输入的k进制是以字符串形式的。同时,注意下快速映射Map数组的使用。#include using namespace std;using LL = long long;LL Map[130]; // 快速映射使用的,提供了一种解决问题的思路void init() { for(char原创 2018-01-29 14:38:43 · 2864 阅读 · 0 评论 -
线段树之逆序对问题
线段树处理逆序对问题逆序对问题可以由归并排序递归地处理,时间复杂度是O(nlog2n)O(nlog2n)O(n\log_{2}n)。但是在这里,使用线段树来加深理解。个人认为,线段树的方法和归并的方法根本区别在于,前者是一种在线算法,后者是一种离线算法(这只是个人的看法而已。。。)。在归并方法中,我们是在排序的过程中处理累计个数的,由于排序序列是已知的,我们是在已知序列的情况下进行统计,因此...原创 2018-02-10 21:21:30 · 2230 阅读 · 0 评论 -
线段树的初级操作
线段树的初级操作简介:问题背景:把问题建模成数轴上的问题或者数列的问题。一般是每次对数轴或者数列的一个区间进行相同的处理。线段树的结构:一棵平衡的二叉树。 举例说明: 区间:处理前闭后开的区间[a,b)[a,b)[a,b) 线段树结点T(a,b):维护原序列中[a,b)[a,b)[a,b)的信息 内部结点:对于结点T(a,b),有b−a>1b−a>...原创 2018-02-08 15:31:17 · 176 阅读 · 0 评论 -
B树的原理以及C++实现(附源码和文档)
B树的C++实现之前课程设计做的一个BTrees数据结构,在这里添加了算法说明的PDF文档以及配套的Latex文档,同时有源代码和详细的说明,算法思路全部来自于算法导论,,需要的同学直接拿走。。喜欢就star一下:) Github地址: https://github.com/StudentErick/BTree...原创 2018-03-19 19:35:22 · 1995 阅读 · 1 评论 -
Python3实现常用的数据结构
Python3实现常用的数据结构之前学习Python的时候当做练习的代码。实现了栈、队列、树、图等的常用数据结构,并给出了一些常用算法,比如BFS、DFS、最短路等。 Github链接:https://github.com/StudentErick/python_data_structure...原创 2018-03-21 22:43:45 · 741 阅读 · 0 评论 -
NFA转DFA程序设计
实验二:利用子集构造法实现NFA到DFA的转换【问题描述】利用子集构造法实现NFA到DFA的转换。NFA的确定化 【输入形式】NFA 参见样例。其中,第一列表示状态名,终状态用f表示;第二列和第三列分别表示输入字符a和b所到达的状态。【输出形式】DFA 参见样例。其中,第一列表示输入状态名;第二列表示重新命名的状态名,第三列和第四列分别表示输入字符a和b所到达的状...原创 2018-04-05 20:02:31 · 4926 阅读 · 1 评论 -
词法分析程序
#include <iostream>#include <fstream>#include <string>#include <map>#include <queue>#include <cctype>using namespace std;map<string,int>Dict;queue&am原创 2018-04-05 20:04:27 · 311 阅读 · 0 评论 -
语法分析
【问题描述】简单的语法分析程序设计【输入形式】随机输入赋值语句【输出形式】相应的四元式序列同时输出所输入的赋值语句与相应的四元式序列以作对照。【要求】采用递归下降分析程序完成(自上而下的分析)确定各个子程序的功能并画出流程图3.文法如下:编码、调试通过(C语言编写)设计3-5个赋值语句测试实例,检验程序能否输出正确的四元式;当输入错误的句子时,检验程序能够给出...原创 2018-04-05 20:06:18 · 1020 阅读 · 3 评论 -
银行家算法
#include &amp;lt;iostream&amp;gt;int maxn=100,maxm=100;int Available[maxm]; // m个系统资源,每个系统资源的个数int Max[maxn][maxm]; // n个进程中,每一个对资源m的最大需求个数int Allocation[maxn][maxm]; // 当前系统中每一类资源当前已经获得...原创 2018-06-25 20:50:15 · 278 阅读 · 0 评论 -
链表的归并排序
链表的归并排序类比于数组的归并排序,区别在于需要单独编写寻找中间结点的算法。给出实际代码:#include <iostream>using namespace std;// 结点的定义struct Node { int data; struct Node* link; Node (int d = 0, struct Node* p = nullp...原创 2018-07-26 13:08:30 · 316 阅读 · 0 评论 -
并查集
并查集用于判断元素间的从属关系,可以快速判断两个元素是否在同一个集合中。但是,缺陷在于一旦两个元素加入同一个集合中,就无法把这个集合拆分了。并查集两个典型的应用在于:Kruskal算法求最小生成树、求图的连通分量的个数。 并查集中,元素的值小于零表示该元素就是并查集的根,且负数表示元素的个数。如果是正数,那么这个值表示的在集合中它的父结点。为了避免出现集合退化的现象,一般在执行查找算法的时候就进原创 2018-01-30 22:50:29 · 251 阅读 · 0 评论