![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
觅你风川间!!!
热爱编程,努力学习
展开
-
静态链表的基本操作
###数据实现单链表#include<bits/stdc++.h>using namespace std;int m , head , idx;//head为头指针 idx 为插入的结点索引const int N = 100010;int ne[N] , v[N];//ne[]为指针域 v[]为数据域//单链表的初始化void _init(){ idx = 0; head = -1;}//向头结点后插入纸void add_head(int x){原创 2021-04-04 09:30:17 · 91 阅读 · 0 评论 -
线性查找与二叉排序树
文章目录线性表上的查找分块查找树表的查找二叉排序树二叉排序的查找二叉排序的插入二叉排序的生成二叉排序的删除线性表上的查找顺序查找. 折半查找. 分块查找分块查找将表分成若干块块间有序,块内无序(或者有序)树表的查找表结构在查找过程中动态生成二叉排序树, 平衡二叉树 , B- 树, B+ 树,键树二叉排序树若左子树非空, 则左子树所有结点的值均小于根结点的值若右子树非空,则右子树所有结点的值均大于根结点的值左右子树本身又是一棵二叉排序树二叉排序的查找key原创 2021-10-29 20:41:50 · 141 阅读 · 0 评论 -
最短路径与拓扑排序
迪杰特斯拉算法初始化:找出源点到周围顶点(通过一条弧到达)的直达路径选择:从这些路径中,找出一条最短的路径更新:对其余路径进行调整如果存在(u,Vk),且 (V0 , U) + (U ,Vk) < (v0 , vk),则用更短的路径来代替重复上述步骤拓扑排序在有向图中选一个没有前驱的顶点输出在图中删除该顶点和以它为尾的弧重复上述俩步,直到全部顶点均已输出或者当前图不存在无前驱的图为止关键路径求ve(i) , vl(j)求 e(i) , l(i)求l(i) -原创 2021-10-22 11:30:44 · 130 阅读 · 0 评论 -
最小生成树
生成树:所有顶点都有边连在一起,但不存在回路的图特点:生成树是图的极小连通图一个n个顶点的连通图的生成树有n-1条边生成树任意俩个顶点间的路径是唯一的无向图的生成图:深度优先生成树广度优先生成树最小生成树定义:给定一个无向网络,在该网的生成树中,使得各边的权值之和最小的那棵树称为最小生成树MST性质:具体可以使用反证法来证明构造最小生成树prim算法设TE是最小生成树的边的集合初始令 U = {u₁},TE = {}在所有u属于U,v属于V-U中,找一个权值最下的边原创 2021-10-19 18:22:34 · 77 阅读 · 0 评论 -
图的定义与基本术语
图定义:定点V与边长E的集合基本术语无向图:简单来说就是顶点与顶点之间的边是没有方向的有向图:简单来说就是顶点与顶点之间的边是有方向的稀疏图:边数很少的图称为稀疏图(e < nlogn)稠密图:与稀疏图的定义相反领接:有边或者弧相连俩个定点之间的关系权和网:实际中每条边有实际的意义,这个数值称为边上的权,带权的图称为网度:顶点的度是与顶点相关联的边的数目完全图:任意俩个点都有一条边相连,有向完全图有n*(n-1)条边,无向完全图有*(n-1)*n/2入度:是以定点v为终点的有向原创 2021-10-13 15:50:02 · 115 阅读 · 0 评论 -
哈夫曼树与哈夫曼编码
哈夫曼树与哈夫曼编码基本概念路径:树中一个结点到另一个结点之间分支构成的这俩个结点之间的路径结点的路径长度:俩结点间路径上的分支数树的路径长度:从树根到每一个结点的路径长度之和权:将树中的结点赋值一个有着某种含义的值结点的带权路径长度:根结点到该结点的路径长度乘该结点结点的权(路径长度*权)树的带权路径长度:树中所有叶子结点的带权路径长度之和哈夫曼树:带权路径长度最短的二叉树(最优二叉树)哈夫曼树的构造算法(贪心思想)根据给定的权值构成n棵二叉树的森林 F = {T1 , T2 ,原创 2021-10-05 19:10:52 · 121 阅读 · 0 评论 -
树与森林及其与二叉树的转换
文章目录树与森林树的存储结构双亲表示法孩子链表表示法孩子兄弟表示法(二叉链表表示法)树与二叉树的转化树转化为二叉树二叉树转化为树森林转化为二叉树二叉树转化为森林二叉树转化为森林树与森林森林:m棵互不相交的树的集合树的存储结构双亲表示法数据域:存放结点本身的信息双亲域:指示本结点双亲在数组中的位置结点结构的表示typedef struct node{ int data; int parent;}Node;树的结构typedef struct { Node nod原创 2021-10-04 19:57:03 · 94 阅读 · 0 评论 -
二叉树存储与基本算法
文章目录树与二叉树树的定义树的基本术语二叉树的定义二叉树的性质满二叉树:深度为k且有2^ - 1 个结点的二叉树特点完全二叉树特点:性质顺序存储链式存储二叉链表的结点形式三叉链表遍历二叉树递归前序遍历非递归前序遍历递归实现中序遍历非递归实现中序遍历递归实现后序遍历非递归后序遍历二叉树二叉树的层次遍历建立二叉树前序递归建立二叉树的复制树的深度的计算树的结点数的计算计算叶子结点数树与二叉树树的定义树是n个结点的有限集合若n等于0,称为空树若n>0,满足一下条件有且仅有一个根(root)其原创 2021-09-18 21:20:40 · 282 阅读 · 0 评论 -
朴素匹配与KMP
串的匹配方式串的朴素匹配方式#include<stdio.h>#include<string.h>int index (char * s , char * t ){ int i ,j ; for (i = 0 ; i < strlen(s) ; i ++) { if (s[i] == t[0]){ for (j = 0 ; j < strlen(t); j ++ , i ++)原创 2021-07-21 16:27:42 · 107 阅读 · 0 评论 -
队列基本内容
队列循环队列队列的通用长度为**(tail - front + queue_size) % queue_size(数组的长度)**循环队列是为了解决假溢出的问题为了方便表示规定front == tail时为空队列(q->tail + 1)% max == q->front 判断队列是否已经满了顺序储存#include<stdio.h>#define max 200typedef struct { int data[max]; int fron原创 2021-07-11 18:02:38 · 122 阅读 · 0 评论 -
中缀表达式转后缀表达式
中缀表达式转后缀表达式四则表达式四则表达式的计算,我们通常所见的表达式形式为中缀表达式。这是易于我们人类所理解的。机器更适合与理解后缀表达式。中缀表达式**“9+(3 - 1)* 3 + 10 / 2 ”,转化为后缀表达式就是9 3 1 - 3 * + 10 2 / +**中缀表达式是将以运算符为中心的计算的树形结构,用栈的来实现###中缀表达式转化为后缀表达式的方法若是数字将其压入到数字栈中若是**‘(’**,压入运算符栈中若是**‘)’,计算‘(’**表达式的值原创 2021-07-09 16:49:01 · 95 阅读 · 0 评论 -
栈的顺序储存和链式储存
栈##顺序栈的定义栈是一种先进后出的结构,属于一种线性结构栈顶指针用于控制数据的压入与弹出当栈为空时top == -1#define max 20typedef struct { int data[20]; int top;}stack;##顺序栈的压入与弹出int push(stack *p , int data){ if (p ->top == max - 1) return 0; p ->top ++; p ->d原创 2021-07-08 11:36:56 · 75 阅读 · 0 评论 -
单链表的基本操作
#动态单链表的基本操作#include<stdio.h>#include<stdlib.h>struct node { int data; struct node *next;};typedef struct node *linklist;//头插法生成链表void createlist (linklist *head , int n){ linklist p , s; int i; //srand(time(0));原创 2021-06-03 19:43:08 · 62 阅读 · 0 评论 -
动态链表!!!
#动态链表#include<stdio.h>#include<stdlib.h>struct node{ int data; struct node * next;};typedef struct node Node;void add (Node **head , int data)//增加结点{ Node *p = *head; Node * newnode = (Node *)malloc(sizeof(Node));原创 2021-05-29 10:06:21 · 49 阅读 · 0 评论 -
搜索与图论
#搜索与图论首先花费了好长时间才弄明白,邻接表的储存原理。这个笔记上有。第二就树的重心这个题,也是花费将近一个小时才弄明白。还有就是链表的范围至少是数据范围的俩倍,否则就会越界。产生错误答案,这题就遇到了。#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int h[N] , e[N] , ne[N] ,idx ,ans = N ,n;bool st[N];//用于记录状态void a原创 2021-05-09 20:05:39 · 69 阅读 · 0 评论 -
试除法判断质数
##试除法判断质数#include<bits/stdc++.h>using namespace std;int a[110];bool prime(int x)//一个数的因子,必然是一个大于x^0.5 和一个小于x^0.5,所以说我只需要判断小于的那部分{ if (x < 2) return false; for (int i = 2 ; i <= x / i ; i ++) //这里用 i <= x / i 而不是 i*i <= x 是因为i原创 2021-04-20 16:42:26 · 113 阅读 · 0 评论 -
筛法
##筛法//埃筛#include<bits/stdc++.h>using namespace std;const int N = 1e6;int cnt;bool st[N];int prime(int n){ for (int i = 2 ; i <= n ; i ++) { if (!st[i]) { cnt ++; for (int j = i + i ; j <原创 2021-04-20 16:41:47 · 59 阅读 · 0 评论 -
哈希表
##哈希表哈希表的拉链储存#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 3;int h[N] , idx , e[N] , ne[N];//h[N]用于储存每一个的头结点//idx 是一个下标的索引void insert_(int x){ int k = (x % N + N) % N; e[idx] = x; ne[idx] = h[k]; h[k] = idx ++原创 2021-04-18 19:48:28 · 73 阅读 · 0 评论 -
单调队列
##单调队列给定一个大小为 n≤106 的数组。有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到 k 个数字。每次滑动窗口向右移动一个位置。以下是一个例子:该数组为 [1 3 -1 -3 5 3 6 7],k 为 3。窗口位置 最小值 最大值[1 3 -1] -3 5 3 6 7 -1 31 [3 -1 -3] 5 3 6 7 -3 31 3 [-1 -3 5] 3 6 7 -3 51 3 -1 [-3 5 3] 6 7 -3 51 3 -1原创 2021-04-17 19:04:25 · 42 阅读 · 0 评论 -
tire树储存数字并且求最大异或值
###tire树储存数字并且求最大异或值在给定的 N 个整数 A1,A2……AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?输入格式第一行输入一个整数 N。第二行输入 N 个整数 A1~AN。输出格式输出一个整数表示答案。数据范围1≤N≤105,0≤Ai<231 首先我们来进行这道题目的分析,首先呢,来分析一下数据范围。每个数字转化为2进制占31位,那么一个数字占31位,那么最坏的情况就是每个数字都占31位,当然这种情况不可能达到,所以说我们开的数据范围为3原创 2021-04-15 15:26:12 · 122 阅读 · 0 评论 -
堆的初始化,以及排序
##堆的初始化,以及排序//无映射关系的堆#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int a[N];int cnt ;void down(int x){ int t = x; if ((2*x) <= cnt && a[2*x] < a[t]) t = 2 * x; if ((2 * x + 1) <= cnt &&原创 2021-04-13 22:45:11 · 189 阅读 · 0 评论 -
Tire树
##Tire树#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;char str[N];int a[N][26] ,cnt[N] ,idx;//cnt[N]是一个字符串结尾标记有几个字符串,idx是标记下一个字符应该去哪儿找。a[N][26]用于储存字符串树void insert1(char str[]){ int p = 0; for (int i = 0 ; str[i] ; i原创 2021-04-13 22:44:36 · 65 阅读 · 0 评论 -
单调栈
###单调栈所谓单调栈就栈中的元素都是单调的,就是单调性是一致的。不会出现波折。比如说在给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。这道题中如果用暴力做法时间复杂度会非常高如果说使用单调栈时间复杂度会降到线性的复杂度首先单调栈用到了双指针的思想 , 我们从前往后读取数字 , 那么假如说 第3个数字x3 >x5,那么在读取下一个找左边最近的小于的数字一定不会找到x3,所以说就没有用,x3就可以删掉。还有一种情况就是 如果读入的x小于 栈顶元素原创 2021-04-04 16:03:46 · 49 阅读 · 0 评论 -
数组模拟队列
###数组模拟队列#include<bits/stdc++.h>using namespace std;const int N = 100010;int q[N] , hh , tt = - 1;//向队尾插入元素void push(int x){ q[++ tt] = x;}//弹出队头元素void pop(){ hh ++;}//检查队列是否为空bool empty_(){ if (hh <= tt) return false;原创 2021-04-04 14:57:14 · 46 阅读 · 0 评论 -
数组模拟栈
###数组模拟栈#include<bits/stdc++.h>using namespace std;const int N = 100010;int stk[N];int tt ;//向栈顶压入元素void push(int x){ stk[++ tt] = x;}//弹出栈顶元素void pop(){ tt --;}//检查栈中是否有元素bool empty_(){ if (tt > 0) return false; el原创 2021-04-04 14:22:18 · 43 阅读 · 0 评论 -
双链表
###双链表#include<bits/stdc++.h>using namespace std;const int N = 100010;int r[N] , l[N] ,v[N];int idx ;初始化时 左端点占1 指向右端点的0右端点的占0 指向左端点的1void init_(){ idx = 2; l[1] = 0; r[0] = 1;}双链表的增加void add(int k,int x){ v[idx]= x; r原创 2021-04-04 11:10:44 · 55 阅读 · 0 评论