![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
不见月光见星光
这个作者很懒,什么都没留下…
展开
-
点分治算法
淀粉质(点分治) 淀粉质(点分治)一 定义二 前置芝士1. 求树的重心2. 求点到根的距离3. 求距离为k的点4. 求解从now为根的树三 模版淀粉质可真好吃一 定义 点分治是一种用于求在树上的距离为 kkk 的点对的算法,如果暴力进行求解的话,时间的复杂度有 n2n^2n2 ,很明显对于这种时间复杂度会直接挂。 我们可以知道在以rootrootroot 为根的时候,那么两点之间的距离只存在两种情况经过root点不经过root点 在经过 rootrootroot 的时候,我们可以枚举原创 2021-09-23 18:03:26 · 136 阅读 · 0 评论 -
树的重心算法
一 定义树的重心就是使得这个重心的最大子树最小。二 性质一棵树最少有一个重心,如果有两个重心,那么这两个重心之间是有一条边相连的在树上的所有点到重心的距离之和是最小的。若以重心为根,那么所有子树的大小都不超过这个树大小的12\frac{1}{2}21在一个树上增加一个点,重心的最多平移一条边的距离两棵树链接成一个新的树,那么这个新的树的重心是在这两个树的重心的连线上三 重心的求解在重心的求解中,我们可以通过遍历得到所有节点的最大子树,通过比较得到最小值。void DFS(int n原创 2021-09-23 09:23:57 · 376 阅读 · 0 评论 -
Floyd 判环算法
Floyd 判环算法一 算法内容 该算法的内容类似赛跑,两个人在操场上赛跑,跑的快的一定能够比跑得慢的多跑一圈,在链表的判环中,我们可以使用一个快指针和一个慢指针,慢指针每次走一步,快指针每次走两步,当快指针和慢指针相遇的时候,就说明这个慢指针已经走了一个环二 例题Calculator Conundrum#include<iostream>#define ll long longusing namespace std;int buf[20];int next(int n,int原创 2021-08-19 19:04:13 · 58 阅读 · 0 评论 -
字符串哈希
字符串哈希字符串哈希模版题一 思路我们将字符串转化为数字,然后将这个数字储存在数组中,然后在对着干数组进行去重的操作,得到我们的字符串的种类二 code#include<iostream>#include<string.h>#include<algorithm>#define ll long long#define N 1010#define base 111#define add 11ll mod = 12345224345454232;usi原创 2021-08-12 16:01:50 · 50 阅读 · 0 评论 -
迪科斯特拉算法及其优化
算法执行步骤详解step 1 初始时我们有两个集合A,B,集合A中是所有的点,B中最开始无点step 2 向B中加入起始点,A中删除该点,并更新该点可到范围内的点的起始距离step3 随后在B中加入A中的距离起始点最小的点,并从A中删除,然后对这个数能到达的数进行一次更新,重复上面的操作直到目标的点在我们的B中本质是一种BFSvoid dijstra(int start,int end){ q.push_back(start); for(int i = 1;i <=原创 2021-07-31 08:38:53 · 456 阅读 · 0 评论 -
离散化算法
一 手动离散1 思路 对我们的数组进行按照值的排序,此时我们的大小就可以转化为此时的顺序,而原来的下标被记录下来,我们载进行反转,得到的就是我们离散化之后的数组2 代码for ( i = 1 ; i <= n ; i ++)cin>>a[i].data,a[i].num=i; sort(a+1,a+1+n,cmp); for ( i = 1 ; i <= n; i ++ ) { if(a[i].data == a[i-1].data)a[i].now=a[i-原创 2021-07-26 15:34:38 · 255 阅读 · 0 评论 -
数据结构ST表
一 定义 ST表是一种数据结构,这个数据结构是基于一个二维数组f[i][j]f[i][j]f[i][j],在这个二维数组内f[i][j]f[i][j]f[i][j]表示的是f[i] f[i+2j−1]f[i]~f[i+2^j-1]f[i] f[i+2j−1]这个区间内的需要查询的值,ST表通常用于静态的查找,可以达到O(nlogn)O(nlogn)O(nlogn)建表的时间复杂度,O(1)O(1)O(1)查询的时间复杂度。二 ST表的原理f[i][j]=max(f[i]原创 2021-07-24 21:54:42 · 501 阅读 · 0 评论 -
树状数组详解
一 定义 树状数组是一种数据结构,支持区间内的查询,单点修改,区间修改等的一种数据结构,虽然支持的功能较线段树较少,但是它具有代码量少,逻辑清晰等优势二 原理 对于树状数组,首先我们有一个原数组a[30], 然后我们有一个BIT数组tree[30],对于每一个数字,我们都能得到它的二进制表达,基于这个二进制表示,每个数都负责了一个区间内的数,如tree[4]负责的是1 2 3 4 四个数的区间,tree[3] 负责的是 3 这个数。三 代码实现lowbit(x)返回的是x中最近的一个1lowbit原创 2021-07-24 16:54:16 · 98 阅读 · 1 评论 -
单调队列和单调栈
单调队列和单调栈一 单调队列1.定义单调队列是一种数据结构,用于存储的是在一个区间内的最大值,通常用于区间查询2 实现方式下面以存储最小值的单调队列为例,假设我们的区间范围是为n,那么在单调队列中,我们先不断的出队,去掉那些已经过时的元素,然后在让最新的元素从队尾进队,不断删除那些比它时间长并且比它还小的数3 Example假设现在用8个数要进入队列,求三个数长度的区间内的最小值进队单调队列操作333入队111干掉321 22入队51 2原创 2021-07-11 23:04:29 · 52 阅读 · 0 评论 -
差分算法基础
差分用途 差分主要用于区间的修改,可以实现在一个区间内的数字的增减,和线段树相比具有代码量少,速度快的优点。 - -|线段树也太难了吧实现原理 首先我们需要一个差分数组,在差分数组内保存的是这个数和前一个数的差值。所以只要修改一个数,那么他后面的数就会全部得到相同的修改。在这一性质下,如果我们要对区间[a,b][a, b][a,b]内的数全部加上ccc,那么只需将f[a]+b,f[b+1]−cf[a]+b, f[b+1]-cf[a]+b,f[b+1]−c.The Example样板题solut原创 2021-07-10 11:23:08 · 231 阅读 · 0 评论 -
线段树简介及实现
线段树一 线段树简介 线段树是一种数据结构,对于RMQ,RSQ问题可以达到O(log(n))的区间修改,同时还支持多种加乘的操作,是一种常见的数据结构二 线段树的数据结构 在这里我们可以设计一个结构体去存储一个节点的信息,有左边界,右边界,懒惰标记,区间内数之和等附加数据功能对于单点的数据,他的左边界等于右边界 懒惰标记是我们实现O(logn)区间修改的关键点。即如果我们要修改一个区间内的数,那么我们只要修改管理这个大区间的点即可,没有必要对它管理的分支进行进一步操作,等到下一步需要操作时在原创 2021-06-23 19:01:40 · 123 阅读 · 1 评论 -
基于二叉堆的Prim算法
基于二叉堆的Prim算法板子题一. Prim 算法简介 向一个空集合中加入一个点,然后加入这个集合内所有点的相邻边中的最短边的相邻点,重复直至每一个点都进入集合二. 二叉堆优化的意义1.先来谈谈二叉堆 二叉堆是一种数据结构,保证它的子节点的数值全部都小于他们的父节点,所以可以保证堆顶的元素的值是最小的,这个和我们的需求不谋而合2先来看看二叉堆部分的源码出门左转二叉堆// 这个是根据这一题设计的数据结构,emmm板子的话和这个有一点差别struct heap{ int num原创 2021-06-21 00:45:39 · 544 阅读 · 0 评论 -
数据结构二叉堆
二叉堆一 二叉堆的性质 在二叉堆中,二叉堆被分为大根堆和小根堆,大根堆满足手元素最大,小根堆满足首元素最小。在二叉堆中满足一个节点的左右子节点都小于或大于它本身。二 二叉堆的数组实现方式1. 储存方式 我们通常借助数组实现二叉堆的操作,类似于满二叉树,在数组中,第x个元素的左子树在2x个,它的右子树在第 2x-1个。2. 基础操作的实现初始化二叉堆void Init(){ for (int i = 1; i < N; i++) { elem[i] = in原创 2021-06-10 20:50:06 · 165 阅读 · 0 评论 -
链式栈的c语言实现
链式栈前言 链式栈与线性栈的区别一 优点 1.不用重新分配内存 2. 在进行push操作时更加方便二 缺点 1.占用的内存更大 2.在获取栈的长度之类的操作上较为繁琐一链式栈的实现准备工作#include <stdio.h>#include <stdlib.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define ELemTYpe int#define Status int#define原创 2021-04-15 08:35:54 · 163 阅读 · 0 评论 -
顺序栈的c语言实现
顺序栈[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bA9JWOE1-1618356697231)(https://i.loli.net/2021/04/14/MTcjXKipSFm3lQ5.jpg)]一 准备工作#include <stdio.h>#include <stdlib.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define SELemTYpe int#de原创 2021-04-14 07:32:45 · 107 阅读 · 0 评论 -
双向循环链表
双向循环链表 一 定义: 在双向循环链表中头节点的next指向第一个,头节点的prior指向最后一个,形成一个闭环typedef struct List{ ElemType data; struct List *next; struct List *prior;}Dulode,*DuLinkList; 二 初始化链表void InitList(DuLinkList &L){ L = (DuLinkList)malloc(sizeof(Dulode));原创 2021-04-10 11:57:50 · 120 阅读 · 0 评论 -
C语言数据结构(2)——单链表
#include <stdio.h>#include <stdlib.h>#define Status int#define ElemType int#define OK 1#define ERROR 0typedef struct LNode{ ElemType data; struct LNode *next;}LNode, *LinkList;Status GetElem_L(LinkList L,int i,ElemType &e)原创 2021-04-06 14:40:57 · 90 阅读 · 0 评论 -
静态链表与动态链表
一 静态链表 静态链表往往基于数组和结构体进行实现1 基于结构体实现struct node{ int left;//代表左边的编号 int right;//代表右边的编号 int id;};struct node Node[100];2 基于数组实现int node[100][3];node[i][1]表示右边的编号node[i][2]表示左边的编号node[i][0]表示存在状况1为存在0为不存在3 静态链表的基本操作在编号为n的点左边插入void原创 2021-04-02 21:13:34 · 763 阅读 · 0 评论 -
C语言数据结构(1)--线性表
线性表一 准备工作#include <stdio.h>#include <stdlib.h>#define LIST_INIT_SIZE 100 // list的初始大小#define LISTINCREMENT 10 //每次扩容增加的内存大小#define ElemType int #define Status int#define OK 1#define ERROR 0typedef struct{ ElemType * elem; // elem原创 2021-03-31 19:08:20 · 119 阅读 · 0 评论 -
STL数据类型(1)——vector
一 vector1 包含头文件#include <vector>2 定义vector对象直接定义 vector<int>a; vector<int>a(10);//定义a内有10个元素,但是值不确定 vector<int>a(19,1);//定义a里面有19个为1的元素借助数组定义int b[4]={1,2,3,4};vector<int>a(b,b+4);//此时a内含有1,2,3,4四个元素b+n中的n可任意3 添加原创 2021-03-04 21:20:01 · 221 阅读 · 1 评论