数据结构与算法(与进阶)
文章平均质量分 66
算法
CQU_JIAKE
这个家伙不是很懒,只是最后依然也没有留下什么
展开
-
2.24素数筛
6不是质数,所以《=6的所有质数里不包含6,即6的情况里没有6*6,只有2,3,5如果没被筛过,就一定是素数;被筛过的话,就一定是合数,扫描到合数时,就从质数集里最小的质数开始,判断能不能,就是说遇到一个数的话,首先依据数组里是否存数来判断它有没有被筛过,如果没有的话,就是质数,就加到质数集里,有的话就不加;然后对每一个数而言,都让他乘以此时的质数集,来得到可以合成的之后的合数,加一个i*pri>=n判断,来保证不会越界访问数组。原创 2024-03-14 08:38:52 · 367 阅读 · 0 评论 -
2.18博弈论SG函数
总结来说,SG为0表示当前局面是一个必败态,而非0的SG值表示当前局面是一个必胜态。这是根据博弈论中SG函数的定义和理论推导得出的。自己走的是SG不为0的点,那么对手就必须从这个点开始往下继续走了,而不能重复了必败态的后继状态要么没有,即最底层,要么就是必胜态,因为不能连续走两步,必胜的后面必然是必败;同理,必胜的后面至少得有一个必败态,如果后面都是必胜态的话,那么此时为必败态就是底层叶子结点表示结尾,一定是必败态,往上紧邻的一定是必胜态。原创 2024-03-11 15:19:44 · 2169 阅读 · 0 评论 -
2.1tarjian算法求解双连通分量
就是说,要求树里的点度数都至少为2,然后先是连边,连度数都为1的点,这样的话每条边都能消掉2个度为1的,这样的边共可以消掉x*2个度数为1的点,如果点的个数为偶数,那么恰好可以消完,但是如果是奇数,就会剩一个,此时就需要连边到度数不为1的上,此时这个边就只能消掉一个,而且仅存在这一条边,为奇数时;- 如果顶点`v`未被访问过(即`dfn[v]`等于0),则递归调用`tarjan`函数,并更新当前顶点的低链接值为当前顶点的低链接值和顶点`v`的低链接值中的较小值。栈`st`用于存储当前SCC中的节点。原创 2024-02-24 12:28:25 · 1237 阅读 · 0 评论 -
1.31 炸铁路(找桥),Tarjan算法(求联通分支数,找割点,找桥)
关键在于怎么识别割点这个要判别的是桥,而且在输出的时候要满足字典序输出。原创 2024-02-21 23:55:59 · 1210 阅读 · 0 评论 -
1.17堆模板,黑匣子(对顶堆应用,找动态第i大的数),合并果子(哈夫曼树),荷马史诗(多叉哈夫曼树,补空叶子结点)
二叉堆树状数组。原创 2024-01-25 17:41:17 · 729 阅读 · 0 评论 -
1.15火星人(全排列+变进制数),涂国旗(搜索)
首先是要得到当前排序的排名,其次是要得到它的排名n进制就是说满n就进,该位上不可能保持为n,最多保持为n-1;变进制数就是需要注意进制转换的时候的细节问题还有就是转换为后序进制数时,arr[i]在转化过程中是逐渐增加的,原创 2024-01-24 11:58:59 · 776 阅读 · 0 评论 -
1.14选学生会(计数排序),选数(dfs),全排列(dfs)
错了,在递归结束的地方,k和size的检测应该都是m,是要选择的数字的数量。在每次迭代的时候都保留此时的起点,可以实现从头往后的不重不漏的所有检测。vector可以尾删,可以尾插。原创 2024-01-23 00:20:53 · 529 阅读 · 0 评论 -
1.18~1.19蚯蚓(未完),树状数组(区间修改(差分数组),定点查询)(定点修改,区间查询),线段树(未完)
啥玩意破题这么乱,n个初始蚯蚓,一共要操作m次,蚯蚓长度增加q,uv来确定切割的程度就是切割为maxx,一个为maxx*u/v,一个为maxx-maxx*u/vt是一个时间跨度,就是把m分成T份的跨度每操作一次,即切割一次,就会产生一个新蚯蚓,一共操作m次,那最后就多产生m个新蚯蚓,最后就是n+m个蚯蚓操作就是,每次从里面出队一个最长的,然后入队两个新的,同时让队里的元素都增加q这时mlogm的解法需要每次操作后,都给集合里元素+q,原创 2024-01-21 18:22:57 · 888 阅读 · 0 评论 -
1.7数算PPT选择汇总,PTA选择汇总,计算后缀表达式,中缀转后缀、前缀、快速排序
在第一个位置后插入,注意是在后面插入,而不是前面;要移动49,为50-I,第25个的话,移25个如果是插在前面,就移动50,N-I+1,注意是插在前面还是后面删第一个,要移49,即N-I,删第30个,移50-30=20就是除8取余数组大小为50,10+50-35F实指,R虚指,R+20-F=R+5=13F实指,那么为R+30-F%30=11 ,R虚指,即FR不都是实指,如果都是实指,就是R+M-F+1%M如果有一个虚指,就是R+M-F%M归并趟数是LOGN。原创 2024-01-09 00:15:00 · 1034 阅读 · 0 评论 -
1.6PTA集练7-5~7-24、7-1、7-2,堆的操作,部落冲突(二分查找)
采用优先队列,每天,输入一个数,然后检测之前买的股票能不能在今天卖出去,即堆顶元素和今天的比较,不过记得比较之前要保证队列不空,今天卖完后就把今天的股票买进队列里,最后一天不买然后最后的时候把所以股票都卖掉。原创 2024-01-09 00:00:00 · 858 阅读 · 0 评论 -
1.4~1.5链表复习,代码操作(反转链表(用栈解决,双指针),删除链表指定元素),链表选择题,广义表
思路是双指针,定义两个指针,一个去找当前这个数满不满足要求,然后另一个定义为删除区间的起点 ,当不满足时,两个指针同时向后移动;当满足时,前驱指针就不动了,不断的删掉当前的cur,直到为Nullptr或出了区间。原创 2024-01-08 19:00:00 · 1426 阅读 · 0 评论 -
1.5PTA集练6-1~6-4,7-3,7-4(6/26)
这个就是注意L需要是用.,而不是用->,不是用箭头,具体为什么,也不清楚思路是,在原表上进行操作,然后如果满足条件,就加到新数组上,最后更新新数组的长度。原创 2024-01-08 19:00:00 · 862 阅读 · 0 评论 -
1.1数算选择题(循环队列、二叉树、查找、堆、顺序表、生成树、哈夫曼树、排序)
front:头指针rear:尾指针的长度元素个数=(rear-front+m)%m。原创 2024-01-10 00:30:00 · 786 阅读 · 0 评论 -
1.2LeetCode两个链表相加,两数之和(map映射),滑动窗口,链表相交,前K个出现的数,三数之和,对链表进行排序(插入,归并)
当 nums[i]+nums[L]+nums[R]==0nums[i]+nums[L]+nums[R]==0nums[i]+nums[L]+nums[R]==0,执行循环,判断左界和右界是否和下一位置重复,去除重复解。若 nums[i]>0nums[i]>0nums[i]>0:因为已经排序好,所以后面不可能有三个数加和等于 000,直接返回结果。若和小于 000,说明 nums[L]nums[L]nums[L] 太小,LLL 右移。首先判断给定的链表是否为空,若为空,则不需要进行排序,直接返回。原创 2024-01-03 19:12:32 · 851 阅读 · 0 评论 -
12.29最小生成数K算法复习(注意输入输出格式),校园最短路径(通过PRE实现路径输出,以及输入输出格式注意)
用pre数组记录前驱节点的索引,就是在string里的下标,也通过string类里的find函数找到相应字符的下标。用pre数组,用string,然后在string里,用find,用字符下标,都转换为int型。主要是怎么打印路径,以及输入的格式,怎么转换这个输入格式。原创 2024-01-01 23:06:10 · 511 阅读 · 0 评论 -
12.23用树、DAG表示表达式
有向图的顶点的度等于该顶点的入度与出度之和。因此对于邻接表,某个顶点的链表为空,该顶点出度为0。对于逆邻接表,某个顶点的链表为空,该顶点入度为0。一个有向图D=(V, A)满足什么条件是V到V的一个映射的图?A对任意 v∈V, od(v)=1;从Vi到Vj的映射,是指对于V中的每一个元素i,V中都有一个唯一的元素j与之对应,也就是 i--->j 唯一,出度=1。拓扑排序,事件的先后关系,正是体现在唯一的紧邻前驱上。原创 2023-12-28 17:22:57 · 473 阅读 · 0 评论 -
12.27重构二叉树,插入排序,队列(股票,模拟),后缀表达式求值,括号匹配,验证栈序列,选择题部分
误一点基本常识,给你一个后序遍历,那么最后一个就是根(如ABCD,则根为D)原创 2023-12-28 17:22:12 · 350 阅读 · 0 评论 -
12.28网络流,残留网络,增广路,最大流最小割定理
是指在一个每条边都有容量的有向图分配流,。通常在运筹学中,有向图称为网络。顶点称为节点而边称为弧。一个网络可以用来模拟道路系统的交通量、管中的液体、电路中的电流或类似一些东西在一个结点的网络中游动的任何事物。算法案例引入 :然后自来水厂和你家之间修了很多条水管子接在一起 水管子规格不一 有的容量大 有的容量小然后问自来水厂开闸放水 你家收到水的最大流量是多少明确概念 :容量:每条边都有一个容量(水管的最大水流容量)a-d-g后,a是源点,流量是无穷的;原创 2023-12-28 17:20:34 · 1282 阅读 · 0 评论 -
12.25~12.27并查集(查找与合并),全排列,约瑟夫问题(队列,数组)upper/lower_bound,重构二叉树,最优矩阵,线段树(构建),淘汰赛(构建树,队列),医院问题(最短路,弗洛伊德
树若以某点为根,使得该树最大子树的结点数最小,那么这个点则为该树的重心,一棵树可能有多个重心。原创 2023-12-27 15:43:42 · 1094 阅读 · 0 评论 -
12.25构建哈夫曼,检查括号合法,表达式求值,检验出栈入栈合法,寄包柜(map<pair<int,int>,int>),收纳盒(简单dp),链表反转(整体,区间,k个一组),链表合并(二路多路)
构建哈夫曼struct node { int w; char index; node* lchild,* rchild; node(int w, char index = '\0', node* l = nullptr, node* r = nullptr) :w(w), index(index), lchild(l), rchild(r) {}};struct cmp { bool operator()(node a, node b) { return a.w > b.w;/原创 2023-12-25 23:15:37 · 42 阅读 · 0 评论 -
12.25最小生成树(p,k复习)
初始时所有点都是蓝点,min[1]=0,min[2、3、4、5]=∞。权值之和MST=0。第一次循环自然是找到min[1]=0最小的蓝点1。将1变为白点,接着枚举与1相连的所有蓝点2、3、4,修改它们与白点相连的最小边权。最后权值之和MST=6。这n次循环,每次循环我们都能让一个新的点加入生成树,n次循环就能把所有点囊括到其中;每次循环我们都能让一条新的边加入生成树,n-1次循环就能生成一棵含有n个点的树;每次循环我们都取一条最小的边加入生成树,n-1次循环结束后,我们得到的就是一棵最小的生成树。原创 2023-12-25 12:54:23 · 48 阅读 · 0 评论 -
12.21~12.24最短路,dij,堆优化dij,spfa
有条件的最短路径一定长于无条件的最短路径。原创 2023-12-24 20:55:38 · 55 阅读 · 0 评论 -
12.23~12.24最大食物链计数(拓扑序列的数量),图的遍历(每个点所能到达的最大编号,dp方程的dfs),查找文献(保证字典序的图的dfs,bfs),杂务(拓扑序列中的最长路径)最长路(拓扑变式
题目描述给你一个食物网,你要求出这个食物网中最大食物链的数量。(这里的“最大食物链”,指的是,即。Delia 非常急,所以你只有 11 秒的时间。由于这个结果可能过大,你只需要输出总数模上 8011200280112002 的结果。输入格式第一行,两个正整数 �、�n、m,表示生物种类 �n 和吃与被吃的关系数 �m。接下来 �m 行,每行两个正整数,表示被吃的生物A和吃A的生物B。输出格式一行一个整数,为最大食物链数量模上 8011200280112002 的结果。原创 2023-12-24 16:11:20 · 72 阅读 · 0 评论 -
12.18构建哈夫曼树(优先队列),图的存储方式,一些细节(auto,pair用法,结构体指针)
为结构体自身时,用.调用成员变量;为结构体指针时,用->调用成员变量所以存在结构体数组时,调用数组元素里的成员变量,就是要用.结构体自身只有在new时才会创建出来,而其指针可以随意创建在用new时,要返回指向结构体的指针。原创 2023-12-23 14:55:09 · 529 阅读 · 0 评论 -
12.22最小生成树算法prim(dij松弛思想,堆优化),kruskal(并查集实现)
p算法是往树里加点,k算法是往树里加边。原创 2023-12-23 14:52:54 · 76 阅读 · 0 评论 -
12.22~12.23拓扑排序(字典序顺序),dij再理解,链式前向星,pta题目
存储图,就是要存储图的所有点的信息以及所有边的信息在邻接矩阵中,矩阵行列代表边的起点终点,元素代表边的权重在邻接表中,点数组存储第一条边的指针,编号,边里存储下一条边的指针、编号,以及边自身的信息。原创 2023-12-23 14:51:35 · 171 阅读 · 1 评论 -
12.19 单源最短路(dij,dp),最快逃跑方式(贪心模拟)
就是说第一行为1到2~n,第二行为2到3~N.最终构建出来的是一个无向图,然后源点是1,目标点是n,问从1到n的最短路。原创 2023-12-19 19:24:26 · 62 阅读 · 0 评论 -
12.18拓扑排序,DAG,模板,课程安排
在代码的while循环中,每个节点的邻接链表中的每个边都会被访问一次。如果是一个有向无环图,那么一定有一个点的入度为0,如果找不到一个入度为0的点,这个图一定是带环的。一个有向图,如果图中有入度为 0 的点,就把这个点删掉,同时也删掉这个点所连的边。该代码的时间复杂度是O(V+E),其中V表示节点的数量,E表示边的数量。在代码的第一个for循环中,遍历了所有的节点,所以时间复杂度是O(V)。然后D的入度为0,我们同样操作,最后图被删除干净,证明可以拓扑排序。只有从前指向后的边,没有从后指向前的边。原创 2023-12-18 12:01:29 · 56 阅读 · 0 评论 -
12.5,12.15AVL树更新,定义,插入
int _bf;{ }即相比普通BST,多一个量为bf,表示平衡因子此处默认BF=左子树高度减去右子树高度平衡因子为0,说明没有孩子结点或者左右子树高度相同平衡因子为1,说明没有右孩子结点或者左子树比右子树高度高1平衡因子为-1,说明没有左孩子结点或者右子树比左子树高度高1。原创 2023-12-18 00:08:56 · 56 阅读 · 0 评论 -
12.16~12.17图的存储方式(邻接矩阵,邻接表),相应定义与构建,PTA特性(要初始化),BFS抓牛,判断题
If a graph is represented by an adjacency matrix, then the space taken depends only on the number of vertices, not the number of edges. 如果一个图是用邻接矩阵表示的,那么所占用的空间只取决于顶点的数量,而不是边的数量。农夫知道一头牛的位置,想要抓住它。图就是把边和节点串在一起,每个数组里的元素就是一个链表,存储的是链表的头指针,然后链表元素存储指向下一个链表节点的指针。原创 2023-12-18 00:07:34 · 129 阅读 · 0 评论 -
12.11图的存储方式(邻接矩阵、邻接表),对应操作(插入,删除,查找),遍历,最小生成树
先序输入邻接输入。原创 2023-12-14 19:21:47 · 154 阅读 · 0 评论 -
12.7图欧拉回路与路径,图的一些性质,存储方式,图的遍历(有向图无向图BFSDFS)
无向图存在欧拉回路的充要条件一个无向图存在欧拉回路,当且仅当该图所有顶点都为且该图是连通图。无向图存在欧拉路径的充要条件当且仅当该图顶点度数为的点的个数为0或者2。欧拉定理二:如果一个无向图有2n个奇顶点,那么它至少需要n笔画成。有向图存在欧拉回路的充要条件一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图B是要回到出发点,即欧拉回路;A是一笔画即可。原创 2023-12-07 18:33:31 · 153 阅读 · 0 评论 -
12.2旋转,SPLAY树的各种操作(SPLAY与AVL是两种BST)
Splay树和AVL树是两种不同的自平衡二叉搜索树实现。1. 平衡条件:AVL树通过维护每个节点的平衡因子(左子树高度减去右子树高度)来保持平衡,要求每个节点的平衡因子的绝对值不超过1。Splay树则通过经过每次操作后将最近访问的节点调整到根节点的方式来保持平衡,2. 平衡调整:AVL树在进行插入或删除操作时,可能需要通过旋转来调整树的结构以保持平衡。旋转的过程比较固定,需要进行左旋、右旋、双旋等操作。Splay树在进行操作时,将最近访问的节点通过一系列旋转操作调整到根节点,称为"伸展"操作。原创 2023-12-04 21:13:01 · 143 阅读 · 0 评论 -
12.4散列查找定义,散列函数,散列查找(开放定址法,处理冲突),总结
查找长度——在查找运算中,需要对比关键字的次数称为查找长度(有的教材也会把“空指针”的判定算作一次比较)14,68,19,20,23,11这6个元素查一次就可以;1,55,84,10需要查两次;27要3次,79要4次表中记录数就是每个格子里放的数输入指定的元素,输出一个该元素对应的哈希值例没有考虑次序问题,即同字符不同排序会对应同一哈希值造成冲突 所谓分布均匀就是这位上所有数字都有可能出现,不均匀就是这位上更偏向于出现某一特定的值移位叠加就是每行从模的开始开始;边界叠加就是一条龙连续的下来开放定址就是冲突原创 2023-12-04 13:51:55 · 98 阅读 · 0 评论 -
12.1平衡树(splay),旋转操作及代码
tot表示结点数量,rt表示根的编号v[i]表示结点i的权值fa[i]表示结点i的父亲节点chi[i][2]表示结点i的左右孩子cnt[i]表示结点i的权值存在数量,如1123,v[3]=1,则cnt[3]=2;就是说i=3的三号结点的权值为1,那么三号结点的权值存在数量为2,即有两个1存在于数列当中,也就是说自变量是结点编号,因变量是结点的权值以及对应权值出现的次数sz[i]表示结点i的子树中权值数量。原创 2023-12-02 16:42:13 · 95 阅读 · 0 评论 -
11.31链表,之前的数据结构(未完,饼)
第十一周——哈夫曼树51 2 2 5 937桶排序。原创 2023-12-01 21:35:09 · 372 阅读 · 0 评论 -
11.30BST理解,AVL树操作,定义;快速幂,二分求矩阵幂(未完)
完全二叉树结点的度可能有1,满二叉树的度只能为0或2。原创 2023-12-01 21:33:52 · 159 阅读 · 0 评论 -
11.28~11.29基本二叉树的性质、定义、复习;排序算法;堆
5第二次实验——二叉树中序遍历DBEFAGHCI第十一周,后序+中序确定二叉树。原创 2023-12-01 21:32:55 · 225 阅读 · 0 评论 -
11.27二叉查找树,遍历二叉树,层序(判断是不是完全二叉树),根据遍历序列重构二叉树,递归输入建树(树的定义,结构体细节,typedef)
有了typedef才能给结构体struct起别名如果不写typedef就在后面起别名,比如*tree之类的就会报错,但如果一旦写了,就可以自由起别名,在结构体的最后,加*就是指针,不加*就是同一结构体的别名。原创 2023-11-28 21:37:23 · 341 阅读 · 0 评论 -
11.25快速排序细节,sort函数,二分使面积差最小
i从左边开始,遇到大于等于x的停下来,j遇到小于等于x的停下来,然后如果i<j,就交换。递归可能有两种写法,即开始,左-1,左,结束与开始,右,右+1,结束对于左指针而言,左边的值是确定的,一定小于等于x;然后对于右指针而言,j右边的值,一定都是大于等于x当基值如果比。原创 2023-11-28 11:14:41 · 50 阅读 · 0 评论