
算法与数据结构
博主学过的一些算法及笔记。
若渴.
大智不群,大善无帮,何惧孤步,何惧毁谤。
展开
-
HDU 5929 Basic Data Structure (双向队列+模拟)
题目链接VJ-HDU-5929题解题意创建一种新的数据结构,完成题目所给的四种操作。思路四种操作中比较麻烦的是后两种:Reverse和Query。Reverse:可以记录top位置和bottom位置,交换一下就可以O(1)地完成;Query:略有麻烦:首先我们需要确定一下规律:在碰到0时,与非的结果一定是1;在仅有1的情况下,若数量为奇数,最终结果为1;若为偶数,最终结果为0;然后我们只需要记录一下最后一位0(即距离栈底最近的一个0)的位置就可以解决该问题了(一定要注意原创 2020-09-27 15:35:51 · 110 阅读 · 0 评论 -
树状数组是个啥?浅谈树状数组(一)
树状数组有问题欢迎在评论区讨论!问题引入题目链接:HDU1166n个数字,m次操作。操作分别为:Query i j (查询区间 [i, j] 的和)Add i j (第i个数字增加j)Sub i j (第i个数字减去j)使用树状数组为了简单且高效地解决这个问题,我们需要使用树状数组(当然也可以用线段树)。线段树传送门:线段树那么什么是树状数组呢?模拟树的数组就是树状数组~维护的是前缀和。如图所示。需要的变量为了接下来的介绍,我们先介绍一下需要的变量。int tr原创 2020-08-16 16:40:15 · 338 阅读 · 0 评论 -
主席树是个啥?浅谈主席树
主席树~有问题欢迎在评论区一起讨论(๑•̀ㅂ•́)و✧问题引入n个数字,m次查询。查询方式:l, r, k.即求区间[l, r]中第k大的数字使用主席树为了高效率地解决这个问题,我们需要使用主席树。那么什么是主席树?一言以蔽之:带历史版本的线段树。所谓历史版本,即在插入某个数字之前,这棵线段树的样子。如果用n (数字的数量) 棵线段树实现这种“历史版本”会炸内存的。不过在思考的过程中还是很有必要实践一下的。在稍加模拟之后可以发现相邻的两棵子树中有近乎半数的节点没有发生改变原创 2020-08-15 22:47:46 · 638 阅读 · 0 评论 -
线段树是个啥?浅谈线段树
线段树~有什么问题欢迎在评论区讨论~问题引入n个数字,m次查询。查询方式:l,r即求区间[l,r]的和/最大值/最小值使用线段树为了高效率地解决这个问题,我们需要使用线段树。如图所示,所谓线段树就是将一个大区间分成两个小区间,小区间再分两个小小区间,直到区间中仅剩一个元素为止。线段树有两种,一种比较勤(hen)奋(man), 另一种比较懒,代码上差别不大,所以直接就懒一点吧~~需要的变量int Sum[N << 2], Add[N << 2];//原创 2020-08-15 22:46:50 · 313 阅读 · 0 评论 -
离散化及其C++代码实现
离散化所谓离散化, 就是把无限空间中有限的个体映射到有限的空间中去,以提高算法的时空效率。说人话:在不改变数据之间的大小关系的前提下,使数据中的最大值尽可能地小。举个栗子:原数据离散化12999993-999112代码实现int n, a[N], t[N];// 读入数据for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); t[i] = a[i]; // 复制到 t原创 2020-08-15 20:39:55 · 1608 阅读 · 0 评论 -
归并排序——分而治之
归并排序归并排序采用了分治的策略,对数组进行排序。如图:图片引自:https://www.cnblogs.com/chengxiao/p/6194356.html不断二分,在无法二分时进行比较,并排序,用递归的方法实现比较好理解。代码...原创 2020-07-02 20:33:49 · 246 阅读 · 0 评论 -
堆排序 Heapsort
HeapsortBuild heapThe first step is to build heap.void build_heap(int h_tree[], int n) { int last = n - 1; for (int i = (last - 1) / 2; i >= 0; i--) { heapify(h_tree, n, i); }}Theiinforis the nonleaf node.HeapifyOf course, we原创 2020-06-16 07:42:28 · 109 阅读 · 0 评论 -
ShellSort(希尔排序)
突然想到了希尔排序。Conception插入排序的升级版本。相当于每次对数列进行分组,对小组进行排序,以达到数列整体有序的目的。InsertionSortvoid insert(int a[], int length) { int i = 1; while (i != length) { int j = i; int temp = a[j];...原创 2020-04-10 09:05:38 · 83 阅读 · 0 评论 -
矩阵相乘
很久之前做的,代码也还看得过去吧。#include <stdio.h>#include <stdlib.h>int main(){ int ar, br, ac, bc; //行列 int a[100][100], b[100][100], c[100][100]; //矩阵 int i, j, k, n;原创 2020-06-16 07:32:54 · 130 阅读 · 0 评论 -
CountSort(计数排序)
What计数排序是一种不需要比较的排序,比任何比较的排序都要快。适用于数组中的值不是特别大的情况,因为需要用空间换时间,所以当数组中的值特别大的时候,空间开销会超级大。从代码中可以明显看出来。此外,计数排序只能用于正数排序(个人认为负数排序也是可以的)。Codeconst int MAX = 1e3; //初始数组的值,即输入值的数量。int curr[MAX], final[MAX]...原创 2020-04-09 21:45:42 · 738 阅读 · 0 评论 -
图的存储——前向星与链式前向星
文章目录图的存储与围绕某一结点的遍历前向星链式前向星参考资料图的存储与围绕某一结点的遍历稀疏矩阵怎么存储?图太大了不能用二维数组的邻接表怎么办?该如何遍历与某一结点相连的所有边?我们将围绕这个图进行展开。设该图的输入如下:/*1 22 33 41 34 11 54 5*/前向星前向星是一种特殊的边集数组,我们把数组中的每一条边按照起点从小到大排序,如果起点相同,则按照终点从小到大排序,并记录下以某个点为起点的所有边中第一条边的位置以及所有边的数量。len[i]:以i为原创 2020-07-03 19:19:27 · 378 阅读 · 0 评论 -
快速幂 quickPow
文章目录概念运算实现递归非递归概念快速幂,顾名思义,很快速的进行幂运算。时间复杂度O(log nnn)。运算想要幂得快,就得算的少。从时间复杂度上也可以看出来,快速幂每次都会使运算折半。也就是:举个例子,5^10。5^101:5^52:5^4 * 53:5^24:5^15:5^0 * 5实现mod的存在是为了更好地处理题中碰到取模的情况。不需要的话可以取1e9+7或者直接去掉。递归int mod;int quickPow(int a, int n) { i原创 2020-06-17 14:14:30 · 379 阅读 · 0 评论 -
并查集 Union-set
ConceptionIt’s a data structure which not only is able to judge how many sets relational elements belong to, but also is able to judge if two points in graph structure are connected.AchieveTo achieve union-find sets, we need several funcations.InitThi原创 2020-06-16 07:44:33 · 103 阅读 · 0 评论 -
kmp算法中的NEXT数组
KMP算法kmp算法是一种快速匹配字符串的算法。这个算法的关键是next数组。next数组next数组的作用,一言以蔽之,记录跳跃点。即记录在模式串与子串匹配的过程中,模式串与子串的字符不等时,指针应该指向的位置。如下例[a, b, c, a, b, c, b, b][0, 0, 0, 1, 2, 3, 0, 0]这里有一种较为简单的得到next数组的方式。0 [a] //对于任意next数组,第一个位置值均为00 [a, b]原创 2020-06-16 07:43:36 · 258 阅读 · 0 评论 -
二叉树的各种操作
文章目录二叉树存储数的根节点已知前序中序,还原二叉树已知中序后序,还原二叉树获取树的最大值,这里的最大值函数要求二叉树中所有的值都为正数获取树的深度向二叉平衡树中插入一个结点前序遍历中序遍历后序遍历层序遍历二叉树typedef struct node { int data; node *left; node *right;} Node;存储数的根节点typedef struct tree { Node *root;} Tree;已知前序中序,还原二叉树No原创 2020-06-16 07:41:32 · 149 阅读 · 0 评论 -
什么是差分数组?
定义对于已知有n个元素的数列d,建立记录它每项与前一项差值的差分数组f:显然,f[1]=d[1]-0=d[1];对于整数i∈[2,n],我们让f[i]=d[i]-d[i-1]。性质计算数列各项的值。例如,d[2] = f[1] + f[2] = d[1] + d[2] - d[1] = d[2],即数列第i项的值可以由差分数组的前i项的和计算。计算前缀和。第i项的值可以由差分数组的前i项计算。那么数列的前缀和即可以表示为:用途处理区间内的加减操作对于数列中区间[l,r]内的数字加原创 2020-06-15 14:11:14 · 476 阅读 · 0 评论 -
同余/逆元/
文章目录同余定理定义性质逆元定义费马小定理同余定理定义给定一个正整数m,若两个整数a和b满足(a-b)能够被m整除,即(a-b)/m 得到一个整数,那么就称a与b对模m同余,记作a≡b(mod m)。性质(a + b) % c = (a % c + b % c) % c(a * c) % c = (a % c * b % c) % c逆元定义设c是b的逆元,则有b * c ≡ 1 (mod m)费马小定理a是不能被质数p整除的正整数,则有a ^ (p - 1) ≡ 1 (原创 2020-06-11 21:22:50 · 303 阅读 · 0 评论 -
Manacher 马拉车 算法
文章目录ManacherFirstSecondProblem 1Problem 2ThirdCode寻找原字符串中起始字符的位置Manacher马拉车算法用于寻找最长回文串。其思路如下:First首先,对于一个字符串,其子串的长度一定是奇数或者偶数。判断回文串过程中也是如此,这就增加了判断的难度。对此,马拉车算法采用如下方法将要找的子串全部变为奇数长度:在每个字符前添加同一个字符#。也...原创 2020-04-23 13:04:11 · 164 阅读 · 0 评论 -
Balanced_Binary_Tree(平衡二叉树)
ConceptionBalanced-Binary-Tree follows the rule that root node’s value is bigger than the value of its right node and smaller than its left node.Node Structtypedef struct node { int data; n...原创 2020-04-10 09:08:26 · 160 阅读 · 0 评论