数据结构和算法
文章平均质量分 57
wanxiang_zx
这个作者很懒,什么都没留下…
展开
-
内建函数对象
即STL内部建立的一些函数对象。原创 2022-08-30 22:09:52 · 52 阅读 · 0 评论 -
谓词
谓词(一元,二元)原创 2022-08-30 17:27:18 · 59 阅读 · 0 评论 -
常用算法
for_each、transform、 find、find_if、 adjacent_find、 binary_searc、 count、count_if、random_shuffle 、merge、reverse 、copy、replace、replace_if、swap、accumulate 、fill、set_intersection 、set_union、set_difference原创 2022-08-31 20:50:22 · 52 阅读 · 0 评论 -
优先队列,bitset
优先队列,bitset原创 2022-03-14 20:50:59 · 292 阅读 · 0 评论 -
关联式容器:map和multimap 及unordered_map
set和multisetset是有序集合,multiset是有序多重集合。set的值和键是统一的,值就是键,set的每个键都是唯一的不允许重复;multiset允许多个值的键相同。使用二者时,均需引入头文件#include<set>.set和multiset的迭代器为双向访问,不支持随机访问,执行一次++或--的时间复杂度为O(logn).set<int>a; //升序set<int,greater<int> &g原创 2022-03-15 12:27:15 · 324 阅读 · 0 评论 -
关联容器:set和multiset,pair
set,multiset,pair原创 2022-08-30 15:40:05 · 143 阅读 · 0 评论 -
list
list是一个双向链表,可以在常数时间内插入和删除,不支持数组表示法和随机访问。使用list时,需要引入头文件#include.原创 2022-08-29 12:02:46 · 105 阅读 · 0 评论 -
deque
deque是一个双端队列,可以在两端进出队,支持数组表示法和随机访问。使用deque时,需要引入头文件#include.它在中间或头部存数据比vector快,但是它输出某个元素需要一个一个找,较慢。原创 2022-08-29 11:45:32 · 130 阅读 · 0 评论 -
vector
swap,预留空间(减少动态扩展容量次数)原创 2022-03-14 14:31:53 · 349 阅读 · 0 评论 -
string及其常见函数
查找、截字串、替换、与数字相互转换原创 2022-08-29 11:11:48 · 2644 阅读 · 0 评论 -
字符串处理
字典树又称Trie树、单词查找树。利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。字典树的创建void insert(string s)//将字符串s插入字典树中 { int len=s.length(); int p=1; for(int i=0;i<len;i++) { int ch=s[i]-'a'; if(!trie[p][ch]) trie[p][ch]=++tot; p=trie[p][ch]; } en原创 2022-05-18 23:01:18 · 63 阅读 · 0 评论 -
点分治
分治是什么?其原理就是把原问题拆解成几个子问题,分别求解子问题之后再合并出原问题。那么点分治其实就是对一棵树进行拆开,分治。寻找重心极端情况下,树会退化成链,那么对于链,我们最不划算的选择分治方式是每次选择链头,那么就会变成递归n次。所以我们每次分治都要尽可能地使一棵树被均匀分开,而所找的这个分治点就是树的重心。树的重心指删除该节点后得到的最大子树的节点数最少。例如k=3;A为重心,0 1 1 2 2 2cal(B)时:dst[B]=1 dst[C]=2 ...原创 2022-05-03 14:47:46 · 102 阅读 · 0 评论 -
一笔画问题
一笔画问题,即欧拉通路问题,经过每条边一次且仅一次,行遍所有节点。经过图G中每个边恰好一次的路径叫做欧拉通路。若一个回路是欧拉通路,则称之为欧拉回路。有欧拉回路的图叫做欧拉图,有欧拉通路但没有欧拉回路的图叫做半欧拉图。一个无向图存在欧拉回路,当且仅当联通且无奇度节点。 一个有向图存在欧拉回路,当且仅当联通且所有节点的入度都等于出度。 一个无向图存在欧拉通路,当且仅当联通且无奇度节点或恰好有两个奇度节点。 一个有向图存在欧拉通路,当且仅当联通且所有节点的入度都等于出度或恰好有两个节点的一个出度比原创 2022-04-27 19:26:12 · 514 阅读 · 0 评论 -
区间信息维护与查询
倍增、ST、RMQRMQ(区间最值查询)问题有多种解决方法,用线段树和ST解决RMQ问题对比如下:线段树预处理的时间为O(nlogn),查询的时间为O(logn),支持在线修改; ST预处理的时间为O(nlogn),查询的时间为O(1),不支持在线修改。ST(sparse table,稀疏表)算法采用了倍增思想,在O(nlogn)时间构造了一个二维表之后,可以在O(1)时间在线查询[l,r]区间的最值,有效解决在线RMQ(range minimum/maximum query,区间最值查询)问题原创 2022-04-27 12:26:07 · 200 阅读 · 0 评论 -
树及其相关
树的存储1.顺序存储:双亲表示法、孩子表示法、双亲孩子表示法优缺点:双亲表示法只记录了父节点,无法得知该节点的孩子而后两者方法因为不知道每个节点有多少孩子,只能按最大的度分配空间,浪费。2.链式存储孩子链表表示法:每个节点记录两种信息:当前节点数据和孩子下标,如A有三个孩子,则A->孩子1->孩子2->孩子3兄弟孩子表示法:每个节点记录三个信息:当前节点信息、第一个孩子下标,第一个兄弟下标。这种方法可以将任何树和森林转化为二叉树。二叉树二叉树的性质第原创 2022-04-06 10:57:30 · 173 阅读 · 0 评论 -
线性表的应用
1.线性表有两种存储方式:顺序存储和链式存储。采用顺序存储的线性表被称为顺序表,采用链式存储的线性表被称为链表。顺序表1.顺序表指逻辑上相邻的数据在计算机内的存储位置也是相邻的,其又可分为静态分配和动态分配两种。2.插入:需要从最后一个元素开始向前,将每个元素后移一位。删除:从下一个元素开始,将每一个元素前移一位3.顺序表的优点:操作简单,存储密度高,可以随机存取,取出某个元素只需要O(1)的时间缺点:需要预先分配空间,进行插入和删除操作时需要移动大量元素。链表链表是线性原创 2022-04-05 12:49:29 · 1841 阅读 · 0 评论 -
图论的存储、遍历,Tarjan算法
图的存储图的存储可分为顺序存储和链式存储。顺序存储包括邻接矩阵和边集数组,链式存储包括邻接表、链式前向星、十字链表和邻接多重表。邻接矩阵其实就是用二维数组存边,优点是可以快速判断两节点之间是否有边,并且方便计算各节点的度(O(n)的时间复杂度);缺点是不利于增删节点,不便于访问所有邻接点。邻接表是自己创造了两种数据结构:节点和邻接点。每个节点后面跟一串邻接点。有向图的邻接表又可分为出弧和入弧两种。邻接点的优点是便于访问所有邻接点,且空间复杂度低;缺点是不便于判断两个节点之间是否有边,也不便于判断原创 2022-04-07 19:21:15 · 131 阅读 · 0 评论 -
图的应用之最短路径:Dijkstra、Floyd、Bellman-Ford、SPFA算法
Dijkstra算法(O(n^2))对于有向带权图,边权非负,求解一个某一个节点到所有节点的最短路void dijkstra(int u){ for(int i=1;i<=n;i++) { dist[i]=a[u][i];//初始化源点u到其他各个节点的最短路径长度 flag[i]=false; if(dist[i]==INF) p[i]=-1;//节点i与源点u不相邻 else p[i]=u;//节点i与源点u相邻,设置节点i的前驱p[i]=u原创 2022-04-13 10:00:33 · 166 阅读 · 0 评论 -
c++定义动态数组
一维数组int *a=new int[n];……delete[] a;二维数组 int **array=new int*[m];//定义一个m行n列的二维数组for(int i=0;i<m;i++) array[i]=new int[n];//按行分配空间……for(int i=0;i<m;i++) delete[] array[i];//按行释放空间delete[] array; ...原创 2022-03-14 10:37:28 · 4437 阅读 · 0 评论 -
cout的格式化输出
setprecision(int n) 设置以n表示的数值精度double d=sqrt(2.0);for(int i=0;i<5;i++) cout<<setprecision(i)<<d<<endl;//分别设置精度为0、1、2、3、4输出为:111.41.411.414setw(int n) 设置以n表示的域宽 double d=sqrt(2.0);cout<<cou...原创 2022-03-14 10:22:23 · 1263 阅读 · 0 评论 -
并查集-最优美简单的算法(1)
并查集,主要用于解决元素分组问题,它管理的是一些不相交的集合,并支持两种操作:合并(Union):把两个不相交的集合合并为一个集合。 查询(Find):查询两个元素是否在同一个集合中模板题:(洛谷P1551)亲戚题目背景若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。题目描述规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。输入格式第一行:三原创 2022-03-07 08:54:56 · 178 阅读 · 0 评论 -
三种按位运算
按位与运算符(&)参加运算的两个数,按二进制位进行“与”运算。运算规则:只有两个数的二进制同时为1,结果才为1,否则为0。(负数按补码形式参加按位与运算)即 0 & 0= 0 ,0 & 1= 0,1 & 0= 0, 1 & 1= 1。例:3 &5 即 00000011 & 00000101 = 00000001 ,所以 3 & 5的值为1。按位或运算符(|)参加运算的两个数,按二进制位进行“或”运算。运算规则:参加.原创 2022-02-06 18:22:47 · 635 阅读 · 0 评论 -
两种素数筛
•埃氏筛:做法其实很简单,首先将2到n范围内的整数写下来,其中2是最小的素数。将表中所有的2的倍数划去,表中剩下的最小的数字就是3,他不能被更小的数整除,所以3是素数。再将表中所有的3的倍数划去……以此类推,如果表中剩余的最小的数是m,那么m就是素数。然后将表中所有m的倍数划去,像这样反复操作,就能依次枚举n以内的素数,这样的时间复杂度是O(nloglogn)。•欧拉筛:欧拉筛法的基本思想 :在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。其他复杂度(O(n)).#in原创 2022-01-29 09:04:05 · 75 阅读 · 0 评论 -
KMP算法
KMP算法应该是每一本《数据结构》书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么一回事,但总感觉有些地方自己还是没有完全懂明白。这两天花了点时间总结一下,有点小体会,我希望可以通过我自己的语言来把这个算法的一些细节梳理清楚,也算是考验一下自己有真正理解这个算法。什么是KMP算法:KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。其中第一位就是《计算原创 2022-01-26 11:29:00 · 84 阅读 · 0 评论 -
0x3F3F3F3F——ACM中的无穷大常量
在算法竞赛中,我们常常需要用到设置一个常量用来代表“无穷大”。比如对于int类型的数,有的人会采用INT_MAX,即0x7fffffff作为无穷大。但是以INT_MAX为无穷大常常面临一个问题,即加一个其他的数会溢出。而这种情况在动态规划,或者其他一些递推的算法中常常出现,很有可能导致算法出问题。所以在算法竞赛中,我们常采用0x3f3f3f3f来作为无穷大。0x3f3f3f3f主要有如下好处:0x3f3f3f3f的十进制为1061109567,和INT_MAX一个数量级,即10^9数量级,而转载 2022-01-22 20:14:17 · 533 阅读 · 0 评论 -
快速幂的两种实现
#include<iostream>using namespace std;long long mo(int a,int b,int c) //递归法{ if(b==0) return 1; if(b%2) return ((mo(a,b-1,c)%c)*a)%c; else return ((mo(a,b/2,c)%c)*(mo(a,b/2,c)%c))%c; }int ksm(int a,i...原创 2021-11-07 20:20:03 · 62 阅读 · 0 评论