随笔分类 - 数据结构与算法
摘要:树的同构 1. 同构树 TreeA和TreeB为同构树,当且仅当存在从TreeA到TreeB的一一映射$f(a)$。 \[ f(node[a_i]) = node[b_i] \] 对于以上的树,有映射关系 | TreeA | TreeB | | : : | : : | | 0 | 2 | | 1 |
阅读全文
摘要:单源最短路径 问题描述 分别求出从起点到其他所有点的最短路径,这次主要介绍两种算法,Dijkstra和SPFA。若无负权优先Dijkstra算法,存在负权选择SPFA算法。 Dijkstra算法 非负权 稳定 Dijkstra算法的解决方案 Dijkstra提出按各顶点与源点v间的路径长度的递增次序
阅读全文
摘要:存图 假设输入数据为$u$,\(v\),\(w\),分别为开始点, 结束点,边权 邻接矩阵 用一个矩阵来保存两点之间的联系 \[ \left(\begin{matrix} 0 & 1 & 1 & 0 & 1 \\ 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 0 \\ 0
阅读全文
摘要:ST表 主要用来快速查询静态数据区间最大值 思路 数组$A[i][j]\(存储数列\){a_i}$中区间$i \in [i, i+2^j)$的最大值 查询时只需要查询$max{A[i][k], A[j-2k+1][k]}$即可,保证$2\times2k \geq j - i$即可 预处理使用动态规划
阅读全文
摘要:一些小东西 秦九韶算法 概述 一般地,一元$n$次多项式的求值需要经过$(n+1)\times n/2$次乘法和$n$次加法,而秦九韶算法只需要n次乘法和$n$次加法 \[ f(x) = a_nx^n + a_{n-1}x^{n-1} + \cdots + a_1x + a_0 \] 秦九韶算法按如
阅读全文
摘要:三分法 作用 求函数的驻点 思路 从高数或者大雾借鉴的思路,只要数值求导即可,加上二分法的思想 题目描述 如题,给出一个 N 次函数,保证在范围 [l, r]内存在一点 xx,使得 [l, x] 上单调增,[x, r] 上单调减。试求出 x 的值。 输入格式 第一行一次包含一个正整数 NN 和两个实
阅读全文
摘要:矩阵加速 思路 利用矩阵运算,将递推数列转化为矩阵之幂,利用矩阵快速幂加速数列的计算 P1939 【模板】矩阵加速(数列) 题目描述 已知一个数列 a,它满足: \[ a_x = \left\{ \begin{matrix} 1 & x\in\{1, 2, 3\}\\ a_{x-1} + a_{x-
阅读全文
摘要:矩阵快速幂 为什么要写矩阵快速幂呢,因为快速幂我已经写过了,只要重载一下运算符就好了(一个字:懒),绝对不是我懒啊。 运算符重载 struct Matrix { long long e[101][101]; }; // 此处传reference Matrix operator* (const Mat
阅读全文
摘要:字符串哈希 概念 将字符串通过一个哈希函数转换为哈希值,作为这个字符串的唯一标识。 主要作用是加速判断两个字符串是否相等 实现方法 采用高进制,每个字符对应相应位上的一个数字,这样就将字符串转换为一个巨大的整数 然而这样并不能加速对两字符串的比较 通过对一个大质数取模作为哈希值,这样可以极大加速判断
阅读全文
摘要:欧拉筛 用途 快速查找区间内的所有素数 思路 目标是n以内的所有素数,用isNotPrime[n]判断n是否为素数,1代表是非素数,0代表是素数,prime[]用来记录找出的素数 筛除合数,质数筛掉自己的质数倍 为了提高速度,应避免重复筛除(若从2就筛掉了所有偶数,之后所有对偶数的筛查都是多余) 保
阅读全文
摘要:单调栈 性质 顾名思义,单调的栈,可递增或递减,主要用于求解NGE问题(Next Greater Element) 思路 对输入的一个数列:1 4 2 3 5 我们维护一个单调减栈: 栈为空或者栈顶元素较大时把元素压入,否则弹出栈顶 栈为空,压入1 1 4 > 1,弹出1,栈为空,压入4 4 2 <
阅读全文
摘要:快速幂 思路 分解: \(7^{(1010100)_2} = (7^2)^{(101010)_2} = (7^4)^{(10101)_2} = (7^8)^{(1010)_2}*7^8\) 利用位运算求$b^p$: 不断把指数向右移位,p&1取得最后一位: 每次右移相当于p/2,因此移完后将底数乘二
阅读全文
摘要:树状数组 数组的存储方式 数组建议从索引1开始 单点存储 (存储单个数的值) 单点查询与修改快 查询:a[i] 修改:a[i] += delta 区间查询与修改慢 查询:\(\Sigma a[i]\) 修改:for (int index = i; index <= j; index++) a[ind
阅读全文
摘要:快速排序 思路 以数组中的任一元素为基准,设这个元素的值为av 两个指针(l,r)分别从数组首尾向中间扫描: 保证l ⇐ r(似乎l < r也可?) 从前往后找到比av大的数停下 从后往前找到比av小的数停下 交换这两个数,然后各自走一格(l++,r--) 递归 为避免对本身有序的数组排序时复杂度过
阅读全文
摘要:并查集 Pecco大佬的笔记 特点 并查集被很多OIer认为是最简洁而优雅的数据结构之一,主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作: 合并(Union):把两个不相交的集合合并为一个集合。 查询(Find):查询两个元素是否在同一个集合中。 思路 存储/初始化: 每个
阅读全文
摘要:二叉堆 性质 保证父节点优先级始终高于子节点。 思路 存储: 二叉树的存储方式为数组: 每个节点有一个编号pos 左子节点的编号为2*pos(pos<<1) 右子节点的编号为2*pos+1((pos<<1)+1) 插入: 向堆底插入新节点 向上维护 判断是否到达根节点 到达根节点结束维护 未到达根节
阅读全文

浙公网安备 33010602011771号