算法
文章平均质量分 85
千裡
无
展开
-
跳跃表(Skip lists)(算法导论第12课笔记)
目录简介结构搜索复杂度分析插入删除性质代码实现简介跳跃表支持插入、删除、搜索。是个动态(插删)搜索数据结构。同时每个操作复杂度都是对数级别的。“是个随机化的、简单的数据结构。”“几乎可以保证每一步操作都是logN的可能性为(1-1/n^α),n可以取很大。因此极小概率超过logN”其他动态搜索数据结构:树堆(treaps)、红黑树(red-black trees)、B树(B-trees)。结构如果只是一个双向链表,则操作的复杂度是O(n)。下图分别是wiki和课程里两种跳表数据结构的示意原创 2020-08-22 19:07:50 · 549 阅读 · 0 评论 -
tarjan求(强连通分量)缩点与拓扑DP求DAG最长路
http://acm.hdu.edu.cn/showproblem.php?pid=1269https://www.luogu.com.cn/problem/P3387原创 2020-04-08 12:57:59 · 252 阅读 · 0 评论 -
平衡树之splay树入门
目录splay(伸展)树的基本介绍简介数据结构核心操作pushuppushdownrotatesplaysplay树相关操作查找插入删除前驱和后驱第k个元素区间翻转例题splay(伸展)树的基本介绍简介splay树是BST的一种,其均摊复杂度是O(logN),1985年由Tarjan提出。对于单独的一步复杂度可能到达O(N)。其严格证明比较麻烦。splay树不仅提供了平衡二叉树的功能,还可以...原创 2020-04-07 13:37:58 · 640 阅读 · 0 评论 -
康托展开与逆康托展开
目录康托展开概念公式公式分析公式求解例题代码逆康托展开概念求解例题例题分析代码康托展开概念康托展开是为了解决某一个排列是全排列中的第几个的问题。比如:对于数组nums = [1,2,3](各不相同)它的全排列如下:123,132,213,231,312,321相当于,当前面几位都相同并且i<j时,第i个数字在第x位比第j个数字在第x位的序号要小。在该例中可以看成是组合成的排列数...原创 2020-04-05 15:31:33 · 149 阅读 · 0 评论 -
回文串,从O(n^3)暴力到O(n)的Manacher算法
问:求一个字符串的最长回文子串。目录解法一:暴力 O(n^3)解法二:区间dp O(n^2)解法三:中心拓展算法 O(n^2)解法四:Manacher算法 O(n^3)步骤第一步:字符串奇偶预处理第二步:扫描字符串,求解。复杂度分析Manacher模版模版使用方法总结解法一:暴力 O(n^3)显而易见的一个想法是暴力枚举字符串中任意两个端点,然后判断两个端点组成的字符串是不是回文串。该方法...原创 2020-04-02 12:39:01 · 323 阅读 · 0 评论 -
红黑树与B树
目录红黑树定义引理13.1:一棵有n个内部结点的红黑树的高度至多为2lg(n+1)旋转插入删除B树红黑树红黑树是一棵二叉搜索树,它在每个结点上增加了一个存储位来表示结点的颜色。通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因而是近于平衡的。定义每个结点要么是黑色要么是红色。根节点一定是黑色。红色结点的孩子一定是黑色。从任...原创 2020-03-28 22:01:44 · 1935 阅读 · 0 评论 -
学习笔记_二叉搜索树与平衡二叉树
平衡树二叉搜索树(BST)定义二叉搜索树的基本操作查找插入删除平衡二叉树(AVL)定义数据结构AVL树的基本操作查找操作过于简单,略插入操作左旋右旋左右旋的意义插入结点分析插入操作代码删除操作过于复杂,先略二叉搜索树(BST)定义二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树,又称为排序二叉树、二叉排序树。二叉搜索树的递归定义如下:要么一棵二叉搜索树是一...原创 2020-03-12 16:29:12 · 320 阅读 · 0 评论 -
线段树,添加懒标记解决区间修改和区间查找的问题
总结写的很乱,可能只有自己看得懂ORZ区间修改区间查找例题1例题2写的很乱,可能只有自己看得懂ORZ对于区间修改,单点查找问题以及单点修改,区间查找问题使用树状数组可以在O(logN)的时间复杂度上很好解决,但是对于区间修改,区间查找时,就不好解决了。因此使用到了一种叫做线段数的数据结构,类似于堆(结点的编号为n,则左孩子编号为2n,右孩子的编号为2n+1)。原数组为A[1~10]。线段树的结...原创 2020-03-10 23:40:05 · 373 阅读 · 0 评论 -
树状数组原理以及模版
树状数组原码反码与补码定义举例lowbit运算树状数组介绍通过一个问题引入树状数组的定义解决引入的问题1. 设计一个函数getsum(x),返回前x个数组之和A[1]+A[2]+...+A[x]2. 设计一个函数update(x,v),实现将第x个数加上数字v。A[x]+=v;树状数组的其他应用原码反码与补码定义原码:最高位为符号位,正数为0,负数为1,剩余位表示数值的大小。反码:正数的...原创 2020-03-10 05:12:22 · 722 阅读 · 0 评论 -
算法与数据结构模版题
P5788 【模板】单调栈原创 2020-03-09 22:14:12 · 210 阅读 · 0 评论 -
Tria树(前缀树)与AC自动机
目录Tria树(前缀树)介绍数据结构插入,搜索,查找AC自动机Tria树(前缀树)介绍前缀树是一种用于插入查找搜索数据的数据结构,又叫做字典树。后缀树与其类似。和哈希表相比,前缀树不仅可以查找某一个键,也可以查找该键的前缀。并且查找速度只与所要查找的键的字符长度有关。数据结构一个只存储小写字母的tria树的数据结构如下:struct Trienode{ bool is_stri...原创 2020-03-07 00:23:23 · 691 阅读 · 0 评论 -
C++实现高精度大整数及其运算
目录高精度大整数头文件结构体通过字符数组赋值输出大整数大整数的比较大整数的运算大整数之间的加法大整数之间的减法高精度大整数与低精度的乘法高精度除以低精度数,同时返回r为余数其他运算使用示例例题1(贪心+大整数)题目AC代码高精度大整数对于一个数,如果其超过了0x7fffffff,则无法用int存储,如果超过2^63-1则long long也无法存储。因此构造结构体来存储这样的高精度大数。头文...原创 2020-03-05 18:23:27 · 2623 阅读 · 1 评论 -
迪杰斯特拉算法及优化(以及链式前向星的使用)
迪杰斯特拉算法是用来解决两点之间最短路径的算法。给定的图G<V,E>和起点s终点t,用来求出S到T的最短路径。目录伪代码例题邻接矩阵未优化AC代码邻接表_优先队列优化的AC代码伪代码//G为图,数组d为源点到达各点的最短路径长度,s为起点 Dijkstra(G,d[],s){ 初始化; for(循环n次){ u = 使d[u]最小的还未被访问的顶点的标号; 记u已被...原创 2020-03-04 19:47:17 · 1036 阅读 · 0 评论 -
动态规划的背包问题
01背包问题题目:有n件物品,每件物品的重量为w[i],价值为c[i]。现有一个容量为V的背包,问如何选取物品放入背包,使得背包内物品的总价值最大。其中每种物品都只有1件。《算法笔记》样例:5 8 //n=5,V=83 5 1 2 2 //w[i]4 5 2 1 3 //c[i]如果暴力的话,复杂度是O(2^n),因此使用动态规划,复杂度为O(nV);令dp[i][j]表示:...原创 2020-02-20 03:45:08 · 435 阅读 · 0 评论 -
C++中常用函数以及类型总结
记录在刷题过程中经常用到的,方便以后查询。vector(动态数组)需要头文件<vector>构造函数vector<int> nums; //构造数据元素类型为int的空动态数组vector<int> nums(size); //数据元素类型为int,个数为size的动态数组vector<int> nums(size,val); //数据...原创 2019-07-03 14:36:54 · 6339 阅读 · 3 评论 -
刷题笔记
洛谷P1308 统计单词数string库为了读一行string 字符串,使用getline(cin,string)tolower() 把字符转小写toupper() 把字符转大写原创 2020-02-16 00:41:37 · 119 阅读 · 0 评论 -
中缀表达式转后缀表达式(逆波兰式)并且计算结果
原理省去,给出了思路和代码。思路:(1)中缀表达式转后缀表达式设一个运算符栈,用来临时存放操作符,一个队列,用来存放生成的后缀表达式。从左向右扫描中缀表达式,如果遇到操作数num:直接添加num到后缀表达式队列中。如果遇到的是运算符op1:如果该运算符op1比栈顶运算符优先级高,则把该操作符op1入栈。否则把栈顶的运算符弹出加入到后缀表达式队列中,直到当前栈顶的元素优先级小于op1......原创 2019-09-06 17:24:58 · 877 阅读 · 0 评论 -
C++实现冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序、快速排序
总结记录一下,C++实现各种排序算法,加深理解。参考《大话数据结构》原创 2019-07-07 19:31:50 · 950 阅读 · 0 评论