![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
数据结构代码合集
青云遮夜雨
这个作者很懒,什么都没留下…
展开
-
图论——连通无向图的双连通性
定义补充一个连通的无向图如果不存在被删除之后使得剩下的图不再连通的顶点,那么这样的无向连通图称为双连通如果一个图不是双连通的,那么将其删除使得图不再连通的那些顶点叫做割点背向边:指在深度优先搜索中如果v搜索到了已知点w,则称存在一条v到w的背向边,代表存在一个环求割点深度优先搜索提供一种找出连通图中所有割点的线性时间算法如图是一个连通图,首先,从图中任意顶点开始,执行深度优先搜索并在顶点被访问时给他编号,对于每一个顶点v我们称其先序编号为Num[v],然后对于深度优先搜索生成树上的每一个结点v,原创 2021-10-02 16:52:14 · 1711 阅读 · 0 评论 -
图论算法——最短路问题
最短路问题无权最短路简单介绍算法1无权最短路简单介绍对于无权图G(边没有权值或认为权值为1),如果G是连通的,则每个顶点之间都存在路径。最短路径算法就是要找到一条连接不同顶点的最短路径。例如:V2到V5可以是V2->V5,也可以是V2->V0->V3->V5,很明显最短路是前者算法1主要思路: 广度优先搜索(bfs) :对于每个顶点,我们将跟踪三个信息,known标记此顶点是否被访问过,dist标记此顶点到起始点的深度,path标记前面的顶点,用于标记路径步骤:我们以原创 2021-09-19 22:08:21 · 347 阅读 · 0 评论 -
图论算法——拓扑排序
拓扑排序拓扑排序是对有向无环图的顶点的排序,它使得如果存在一条从v1到v2的路径,那么在排序中v2会出现在v1后面过程:1.对于一个图,我们先遍历此图,找到所有入度为0的结点(一个顶点的入度为有多少顶点指向此结点),将其入队2.当队列非空时,取出第一个顶点,将其存入输出数组中,相当于将它从图中删除,对于所有它指向的顶点的入度减一,如果入度为0,入队,直到队列为空3.如果循环次数大于顶点数,说明存在环,打印错误4.释放数组伪代码void topsort(Graph G){ Queue原创 2021-09-18 17:32:37 · 182 阅读 · 0 评论 -
数据结构——不相交集(并查集)
#include<bits/stdc++.h>using namespace std;#define NumSize 100#ifndef DisjSet_DisjSet_h#define DisjSet_DisjSet_h const int NumSets = 10; /* * Disjoint Set 不相交集 / 并查集 * 主要操作为:查找和合并 */typedef int DisjSet[NumSets + 1]; // 为了下标对齐,这里设定数组大小为Nu原创 2021-09-14 11:15:12 · 107 阅读 · 0 评论 -
数据结构基础——ST表
ST表定义及思路初始化查询定义及思路用来解决RMQ问题,即查询区间内的最大值或者最小值,以下以最大值举例用于解决可重复贡献问题的数据结构,需满足x pot x=x,如max(x,x)=x时间复杂度:预处理o(nlogn),查询o(1)讲解前定义:st[i][j]表示[i,i+2j)区间内的最大值(最小值)思路: 动态规划(类似与区间DP)st[i][j]=max(st[i][j-1],st[i+(1<<j-1)][j-1])初始化void pre(){ for(int j原创 2021-04-02 20:02:07 · 325 阅读 · 0 评论 -
数据结构基础——并查集
并查集定义find函数merge函数模板题并查集拓展定义并查集是一种树形的数据结构,用于处理不相交集合的查询和合并问题有两种基本操作,查询(find)和合并(merge)这里我们用一个通俗的例子火并过程中4和2碰见了,为了确定是不是友军,4向3询问上级,3向1询问上级,发现1是boss,2向1询问上级,发现1是boss,此时2和4有了相同的boss,2和4是一个帮派的,那么就不会发生冲突帮派1被帮派2打败了,帮派2要合并两个帮派,也就是说1的上级变成了6,此时两个帮派合二为一find原创 2021-04-01 19:21:26 · 202 阅读 · 0 评论 -
数据结构基础——线段树
线段树概述建树区间查询单点修改区间修改优化概述用于维护 区间信息 的数据结构。O(logn) 实现 区间查询,单点修改,区间修改等操作,信息需满足可加性(包括标记)。可加性:通过两区间加和得到统计结果,否则,不可能通过分成的子区间来得到[L,R]的统计结果一个非常典型的例子:数字之和——总数字之和 = 左区间数字之和 + 右区间数字之和最大公因数(gcd)——总gcd = gcd( 左区间gcd , 右区间gcd )那么什么不符合区间可加性呢?例如:众数——只知道左右区间的众数,没法求总区原创 2021-04-06 21:01:47 · 200 阅读 · 2 评论 -
数据结构基础——栈
栈栈是只在一段进行插入和删除操作的线性表特点:先进后出栈就像一段封闭的羽毛球桶一样,羽毛球只能从一段进入,也只能从这段输出,而且后进入的羽毛球会先被取出,最先进去的羽毛球最后才能被拿出栈有栈顶和栈底:栈顶:允许进行插入和删除操作的一段,可以理解为羽毛球桶的开口处栈底:固定不动的一段,可以理解为羽毛球桶封闭的一段核心操作:pop(弹出栈顶元素) push(将一元素压入栈中)例题:洛谷P4387 验证栈序列...原创 2021-03-14 01:03:49 · 201 阅读 · 0 评论 -
数据结构基础——链表
链表单链表单链表中每个结点包含两个元素:当前点数据和一个指向下一位的指针typedef struct Node{ ElemType data; struct Node* next;}Node;typedef struct Node* linklist;单链表的读取数据思路:(获取第i个数据)1.声明一个指针p指向链表的第一个结点,初始化j从1开始2.当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j++3.若到链表末尾p为空,则说明结点不存在4.若查找成功原创 2021-03-10 21:01:57 · 124 阅读 · 0 评论 -
数据结构基础——树
树计算机中的树很怪,它是倒着长的通俗来说,树是一个n个点的集合,其中有一个点为树的根,这些点之间共有n-1条边,每条边都表示着父子关系二叉树每个结点最多有两个儿子的树叫做二叉树二叉树的储存struct node{ int l,r; }t[maxn];完全二叉树和满二叉树满二叉树就是每个结点只有无儿子和两个儿子两种情况如图就是一个满二叉树完全二叉树1.叶子节点都在最后一层或者倒数第二层2.叶子节点都向左聚拢特点:(1)所有的叶结点都出现在第k层或k-l层(层次最大的两层)原创 2021-03-23 00:55:24 · 104 阅读 · 0 评论 -
数据结构基础——队列
队列队列是只允许在一段进行插入操作,另一端进行删除操作的线性表队列是一种先进先出的线性表,简称FIFO,允许插入的一端是队尾,允许删除的一段是队首。队列在程序运行设计中用的十分频繁,,比如键盘进行的各种字母数字的输入输出。循环队列1.队列顺序储存的不足假设一个队列有n个元素,我们就需要一个大于n的数组,插入操作很好理解,就是在队尾的下一个位置储存一个数据,但如果是删除数据呢?显然我们有两种方式。一种就是将队首删除,然后每个元素向前移动一位,但是这样的时间复杂度是O(n)。可是想想,为什么出队一原创 2021-03-15 22:16:13 · 196 阅读 · 0 评论 -
数据结构——单链表
数组实现#include<stdio.h>#include<stdlib.h>#include<iostream>using namespace std;#define LISTSIZE 100#define LISTINCREMENT 10typedef int ElementType;typedef struct Llist *SqList;struct Llist{ ElementType* elem; int length原创 2021-09-12 17:36:31 · 100 阅读 · 0 评论 -
数据结构——散列
分离链式法#include<stdio.h>#include<stdlib.h>#define MinTableSize (10)#ifndef _HashSep_Htypedef int ElementType;typedef unsigned int Index;struct ListNode;typedef struct ListNode* Position;struct HashTbl;typedef struct HashTbl* HashTa原创 2021-09-12 17:47:20 · 90 阅读 · 0 评论 -
数据结构——堆
二叉堆#include<stdio.h>#include<stdlib.h>#define MinData -1typedef int ElementType;#ifndef _BinHeap_H struct Heapstruct;typedef struct Heapstruct *PriorityQueue;PriorityQueue Initialize(int MaxElements);void Destroy(PriorityQueue h);原创 2021-09-12 17:45:38 · 81 阅读 · 0 评论 -
数据结构——队列
#include<stdio.h>#include<stdlib.h> #ifndef _Queue_hstruct QueueRecord;typedef struct QueueRecord *Queue;typedef int ElementType;int IsEmpty(Queue Q);int IsFull(Queue Q);Queue CreateQueue(int MaxElement);void DisposeQueue(Queue Q);v原创 2021-09-12 17:40:00 · 61 阅读 · 0 评论 -
数据结构——栈
数组实现#include<stdio.h>#include<stdlib.h>#define EmptyTOS -1#define MinStackSize 5#ifndef _Stack_h//stack头文件struct StackRecord;typedef struct StackRecord *Stack;typedef int ElementType;int IsEmpty(Stack S);int IsFull(Stack S);Stack C原创 2021-09-12 17:38:44 · 121 阅读 · 0 评论 -
数据结构——树
二叉树#include<stdio.h>#include<stdlib.h>typedef int myType;typedef struct treeNode { myType element; //值域元素 struct treeNode *lchild; //左孩子 struct treeNode *rchild; //右孩子}Btree;void createTree(Btree **T) //传入一个Btre原创 2021-09-12 17:43:33 · 152 阅读 · 0 评论 -
数据结构——线性表
#include<stdio.h>#include<stdlib.h>#include<iostream>using namespace std;#define LISTSIZE 100#define LISTINCREMENT 10typedef int ElementType;typedef struct Llist *SqList;struct Llist{ ElementType* elem; int length;原创 2021-09-12 17:33:56 · 52 阅读 · 0 评论 -
排序总结(标题必须五个字)
排序O(N^2)冒泡排序插入排序O(NlogN)希尔排序基数排序堆排序归并排序快速排序O(N^2)冒泡排序void BubbleSort1(int array[], int n){ for (int i = 0; i < n-1; i++) { for (int j = i + 1; j < n-1; j++) { if (array[i]>array[j]) { int t=array[i]原创 2021-09-12 17:31:39 · 73 阅读 · 0 评论