- 博客(27)
- 收藏
- 关注
原创 归 并 排 序
4.2 这一批逆序对的数量为mid-i+1,(即为左队的长度)因为此时左队所有的数都比右队队首大。4.1 当左队队头a[i]>右队队头a[j],此时构成一批逆序对。4.归并排序求逆序对(时间复杂度为 n log n )2.归并排序的本质是后序遍历(由孩子推出父亲)1.归并排序的主要思想:分而治之,和而用之;3.1 左右队都不为空(哪个队头小选哪个)3.2 左边为空,右边不为空(照抄右队)3.3 左边不为空,右边为空(照抄左队)3.合并时有三种情况。
2024-03-16 19:10:09
129
2
原创 树的存储和遍历
d.孩子兄弟表示法(父亲记住第一个孩子,第一个孩子记住第二个孩子,第二个孩子记住第三个孩子······,也就是图的邻接表存储方式)c.父亲孩子表示法(孩子和父亲互相记住,比如份f[i][j]=k,表示i的第j个孩子是k,F[i]=j表示i的父亲是j)b.父亲表示法(孩子记住父亲,比如F[i]=j,表示i的父亲是j) (并查集用的是父亲表示法)a.孩子表示法(父亲记住每个孩子,比如f[i][j]=k,表示i的第j个孩子是k)a.普通树的遍历(dfs(先序遍历,后序遍历),bfs(按层遍历))
2024-02-16 20:21:54
193
原创 动态规划:线形 树形 矩阵
比如等差数列,a(n)=a(n-1)+d,d为公差;等比数列,q(n)=q(n-1)*p,p为公比;累加和,s(n)=s(n-1)+n;累乘积,f(n)=f(n-1)*n;比如兔子数列f(n)=f(n-1)+f(n-2);b.多推一(人人为我):数塔问题,背包问题,最长公共子序列;a.一推多(我为人人):数塔问题;a.父推子(一推多)b.子推父(多推一)
2023-06-22 21:39:30
81
原创 BFS 广度优先搜索算法
2.3 DFS常用的必要变量(vis[ ],ans[ ]),BFS常用的必要变量(vis[ ],father[ ])。2.2 都是要重点考虑孩子的合法性,即孩子的重复性和是否满足约束条件,只有合法的孩子才能入队(栈),才有机会当父亲。1.2 DFS使用的是栈(隐式的栈,先进后出,后进先出),BFS使用的是队列(先进先出,后进后出)。1.1 DFS是按枝搜索(枪挑一条线),BFS是按层搜索(棍扫一大片)。2.1 都是要重点考虑父亲和孩子的关系,即知道父亲可以找到所有的孩子。3.1 用普通数组实现队列。
2023-06-08 21:26:53
49
原创 DFS算法(深度优先搜索算法)
1.DFS算法是一种暴力的枚举算法(在树上枚举)(枪挑一条线——DFS VS 棍扫一大片——BFS)2.3 子集树(左孩子0,右孩子1)2.1 排序树(孩子不与祖先重复)2.5 搜索树(孩子和亲戚不重复)2.2 组合树(孩子比祖先大)
2023-05-11 21:33:49
118
原创 动态规划基础
1.2 缺点:当数据规模较大时运算时间很长,原因是有重复运算。1.3 优化:用动态规划算法进行优化(记忆化搜索)1.1 优点:程序代码简洁明了。1.用递归算法求兔子数列。
2023-03-06 21:45:18
41
原创 拓扑排序
1.拓扑排序算法:即将一个有向无环图的所有节点生成一个线性的序列(将图拍扁),来表示图中节点之间的先后关系。(必须是有向无环图,也就是说必须有入度为零的点存在)2.2 队列或者堆栈:入度为零的节点先入队/入栈,队首元素出队/出栈。
2023-03-06 21:30:40
66
原创 最小生成树
Prim算法和Dijkstra算法的区别在于d[i]的含义不同:在Dijkstra算法中,的[i]表示起点到i号点的最短路径;在Prim算法中,d[i]表示与第i个节点相连的边的最短长度(没有被别人占过)3.2 Kruskal算法:其算法复杂度为O(n log n),其算法核心思想是一次加边其核心技术是排序(按边的权值大小排序)与并查集(判断是否构成环)。2.最小生成树:只生成树中权值和最小的树。3.最小生成算法有两种,Kruskal算法必须掌握。3.1 Prim算法:其算法复杂度为O(
2023-02-27 21:41:00
84
原创 最短路径算法
此时所有的最短路径算法全部失效,但是用SPFA算法可以检测出负权环,而Dijkstra和Floyd算法无法检测出负权环的存在。1.3 负权边,就是指图中有边的权值为负,此时Dijkstra算法失效(无法计算出最短路径),但是SPFA算法和Floyd算法依然有效。2.2 SPFA算法本质上是BFS算法,主要采用队列,其关键操作是。源最短路径算法,可以算出任意两点之间的最短路径。2.1 Dijkstra算法的步骤:第一步。:经过父节点能使孩子到起点的距离更短。源最短路径算法,可以计算出从。
2023-01-16 21:44:19
580
原创 STL:集合、映射、优先队列
2.1 特点:指两个集合之间相互对应的关系,它弥补了普通数组的缺陷(下标只能是正整数)它的下标可以是任意类型。集合的第一个元素为关键字,第二个元素为值。关键字必须唯一,值不一定唯一。1.1 特点:集合中的元素不可以重复,因此集合可以自动去重。另外一个特点是:集合的增删改查比普通数组快。它的时间复杂度为O(log(n))。3.优先队列(priority_queue)
2023-01-02 20:57:40
85
原创 并查集算法
1.并查集:是对多个集合的合并与查找,以及判断集合内元素的关系(看是不是在同一个集合内)。2.3 合并(将x和y合并到同一个集合,让他们拥有同一个父亲)注意:合并时采用路径压缩(递归)的方法会提高查找的效率。2.1 初始化(每个元素的父亲是自己)2.2 查找(查找元素x的父亲)3. 示例(数据见代码末尾)
2022-12-26 20:29:18
88
原创 图的存储和遍历2
技巧:关键是如何处理父子关系。对于dfs来说父亲出栈,其所有合法孩子入栈。对于bfs来说父亲出队,其所有合法孩子入队。重要工作:判断孩子的合法性。(不重复,满足约束条件)b.数组模拟邻接表(普通数组和动态数组)a.深度优先搜索(dfs)b.广度优先搜索(bfs)1.图的两种常用存储方式。2.图的两种遍历方式。
2022-12-19 20:32:53
102
原创 图的存储和遍历
1.1 边的集合,其记录节点数,边数,每条边的起点和终点。这是最基本,最简单的方法,但是寻找邻居节点比较麻烦。1.2 邻接矩阵(二维数组),其记录任意两点之间是否有边。简单容易理解,但是有很多冗余数据,时间复杂度高。1.3 数组模拟邻接表,其只记录有边的两点。复杂不容易理解,但无冗余数据,时间复杂度低。1.3.2 动态数组实现。1.3.1普通数组实现。
2022-12-12 21:42:12
134
原创 数据结构之--栈和队列
1.1 栈只有一个开口,进栈出栈都从这个开口过1.2 栈能实现先进后出,后进先出1.3 栈只有一个指针,称之为栈顶指针(top)。入栈时栈顶指针增一,出站时栈顶指针减一1.4 dfs算法用到了栈(内隐式)1.5 使用栈时最关键的问题是:出入栈的对象是谁,什么时候入栈,什么时候出栈1.6 栈的基本操作是:出栈,入栈1.7 用普通数组实现栈1.8 用STL实现栈2.1 队列有两个开口,从入口(队尾)进,从出口(队头)出2.2 队列能实现先进先出,后进后出2.3 队列有两个指针,分别称之为头指针(head)
2022-12-05 20:29:38
187
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人