算法学习
文章平均质量分 66
算法学习过程中的一些总结
hclbeloved
这个作者很懒,什么都没留下…
展开
-
所有节点对的最短路径(《算法导论3rd-P399》)
1 介绍求解一个图中所有节点对的最短路径,假设有解,也就是:图中不存在负权重的环。根据前面的文章,主要有两种解法:(1)图中存在负权重边,则遍历图中的节点,使其成为起始节点,调用BellmanFord算法即可。(2)图中不存在负权重边,则遍历图中的节点,使其成为起始节点,调用Dijkstra算法即可。BellmanFord和Dijkstra算法:单源最短路径(《算法导论3rd-P374》)_hclbel...原创 2022-02-04 19:28:29 · 801 阅读 · 0 评论 -
dijkstra算法的逆运用
1 背景dijkstra算法主要用来求解图的最短单源路径路径问题,且图中不存在负权重环,也不存在负权重的路径。其实在求解图的最大权重路径的问题上仍然可以使用 Dijkstra 算法,不过需要做一些变化:(1)最小堆--->最大堆;(2)路径初始化参数以及路径更新的判断条件;2 题目2.1 概率最大的路径1514. 概率最大的路径class Solution {public: double maxProbability(int n, vector<vector原创 2022-02-02 18:46:23 · 471 阅读 · 0 评论 -
单源最短路径(《算法导论3rd-P374》)
1 介绍单源最短路径针对的是带权重的有向图;单源最短路径有解的前提是:有向图中不存在从起点可达的权重和为负值的环路。2 求解单源最短路径的方法(1)Bellman-Foxd算法:求解一般情况下的单源最短路径问题,权重可以为负值。(2)针对有向无环图(DAG)的一种线性方法:使用拓扑排序,然后进行relax。(3)针对权重为非负值的有向图:dijkstra算法3 dijkstra算法3.1 dijk...原创 2022-01-22 16:04:57 · 799 阅读 · 0 评论 -
最小生成树-kruskal-prim(《算法导论3rd-P362》)
1 最小生成树从图中找出一颗覆盖所有节点的树,使得该树中所有边的权重和最小,此树就是一颗最小生成树。常用的最小生成树算法有两个:kruskal和prim算法,二者都是贪心算法。注意:图和树的根本区别是:图可以有环,但树一定没有环。2 kuskal算法待求解的边的集合为A。2.1 kruskal算法描述在kruskal算法中,A是一个森林。其节点就是给定图的节点。每次加入到集合中的安全边永远是权重最小的连接两个不同分量的边。...原创 2022-01-17 14:06:43 · 463 阅读 · 0 评论 -
UnionFind(《算法导论3rd-P328》)
1 简介UnionFind就是常说的并、查集算法,主要用来解决图论中的“动态连通性”的问题,也就是图中的“连通分量”问题。连通分量的讲解在《算法导论3rd-P686》中,介绍主要如下:如果一个无向图中每个顶点从所有其他顶点都是可达的,则称该图是连通的。图的连通分量是顶点在“从...可达”关系下的等价类。2 描述常用有根树来表示集合(树中的每个节点包含一个成员),若干颗树组成一个森林,也就是说一个森林是包含多个集合的。可以将图...原创 2022-01-10 16:58:54 · 483 阅读 · 0 评论 -
图-有向图-无向图-二分图-拓扑排序
1 简介由节点和边构成的,其实就是一种高级点的多叉树。2 图的表示(或者叫实现)图常用邻接表和邻接矩阵进行描述。2.1 邻接表邻接表:每个节点x的邻居都存到一个列表里,然后把x和这个列表关联起来,这样就可以通过一个节点x找到它的所有相邻节点。邻接表相对于邻接矩阵占用的空间较少;但是无法快速判断两个节点是否相邻;2.2 邻接矩阵邻接矩阵:是一个二维布尔数组,暂且称为matrix,如果节点x和y是相连...原创 2022-01-08 13:25:17 · 1462 阅读 · 0 评论 -
广度优先(BFS)
1 广度优先简介常常使用队列来配合解决。2 力扣题目2.1 二叉树的最小深度111. 二叉树的最小深度迭代版本:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {}原创 2022-01-06 11:15:32 · 501 阅读 · 0 评论 -
深度优先(DFS)
1 dfs简介深度优先其实就是回溯算法,也就是暴力穷举,所以效率并不高。深度优先尝尝使用递归来进行编码,套路如下:做出选择;递归;撤销选择;并且需要注意递归的退出点就可以了。2 力扣题目2.1 岛屿的最大面积695. 岛屿的最大面积class Solution {public: int maxAreaOfIsland(vector<vector<int>>& grid) { int maxArea = 0; ...原创 2022-01-06 11:07:17 · 2834 阅读 · 0 评论 -
线段树(对比树状数组)
1 定义2 实现3 应用-剑指 Offer 51. 数组中的逆序对#define lson rt<<1 // 左儿子#define rson rt<<1|1 // 右儿子#define Lson l,m,lson // 左子树#define Rson m+1,r,rson // 右子树const int max_n = 50010;int arr[max_n], backup[max_n];struct Seg {...原创 2022-01-02 09:47:12 · 182 阅读 · 0 评论 -
贪心算法(《算法导论3rd-P242》)
1 贪心算法简介贪心算法每一步都做出当时看起来最佳的选择,即:它总是做出局部最优的选择,寄希望这样的选择能导致全局的最优解。贪心算法并不能保证得到全局最优解,但实际情况中确实可以用该方法得到全局最优解。2 贪心算法原理2.1 如何判断一个问题能否用贪心算法求解?需要满足两个性质:第一:局部最优解可以构造出全局最优解;第二:最优子结构(同动态规划)。2.2 贪心算法与动态规划之间的关系...原创 2022-01-02 09:28:09 · 322 阅读 · 0 评论 -
红黑树(《算法导论3rd》P174)
1 红黑树的性质2 红黑树的旋转红黑树的旋转与AVL树的旋转相同。3 红黑树的插入4 红黑树的删除4.1 红黑树删除的一个例子5 红黑树的实现5.1RBTree.h//file RBTree.h #ifndef _RB_TREE_H_ #define _RB_TREE_H_ #include<iostream> #include<string> #include<sstream>...原创 2022-01-01 15:36:08 · 89 阅读 · 0 评论 -
多路查找树:2-3-4树
1 定义2 2-3-4树的插入3 2-3-4树的删除4 2-3-4树的删除的另外一种描述5 2-3-4树代码实现#include<iostream>#include<cstring>#include<cmath>#define SUC//#define PREDECusing namespace std;class Node{private: int key[4]; int cap;...原创 2022-01-01 15:22:15 · 88 阅读 · 0 评论 -
多路查找树:2-3树
1 定义2 2-3树的插入3 2-3树的删除3.1 具体删除的例子原创 2022-01-01 15:09:38 · 123 阅读 · 0 评论 -
AVL树(《C++数据结构与算法》P202)
1 介绍AVL树严格遵守“平衡二叉查找树”的定义,即:每个节点左右子树的高度差最大为1。AVS树中会用“平衡因子”来指导树的调整,即:AVL树中隐含的使用了平衡树的技术。这个平衡因子的定义为:右子树的高度减去左子树的高度。在AVL树中执行插入和删除都有可能破坏树的平衡,所以需要进行适当的调整。1.1 插入过程1.2 删除过程删除元素的几个旋转操作:2 实现2.1AVLTree.hpp定义和实现...原创 2022-01-01 12:58:54 · 80 阅读 · 0 评论 -
DSW算法(《C++数据结构与算法》P200)
1 构建思路先将任意的二叉查找树转化为类似于链表的树,使之成为主链或者主干;然后进行适当的旋转。2 旋转3 代码#include <iostream>#include<math.h>#include<stdlib.h>#include<list>#include<stack>#include<queue>using namespace std;//栈实现template<class原创 2022-01-01 12:32:57 · 223 阅读 · 0 评论 -
算法-动态规划-《算法导论3rd-P215》
1 动态规划简介动态规划主要用来解决最优化的问题,所以看到求解“最**”的问题时可以先往动态规划考虑下是否可行。使用动态规划解决最优化的问题的两个要素:第一:具有最优子结构,即问题的最优解由相关子问题的最优解组合而成,且这些个子问题可以独立求解。所谓的独立求解就是子问题之间是相互独立的,反例见《算法导论3rd-p218》。第二:子问题重叠,即可用备忘录优化穷举过程。1.1 最优子结构如果一个问题的最优解包含其子问题的最优...原创 2022-01-01 12:07:34 · 393 阅读 · 0 评论 -
字符串查找-KMP算法
这个算法是自己对购买课程中的一个章节的一个总结。1 KMP 算法基本原理KMP 算法是根据三位作者(D.E.Knuth,J.H.Morris 和 V.R.Pratt)的名字来命名的,算法的全称是 Knuth Morris Pratt 算法,简称为 KMP 算法。KMP 算法的核心思想,跟上一节讲的 BM 算法非常相近,但是KMP是从前向后依次对比,与BM算法中从后向前对比是不同的,这里从前向后和从后向前,都是以模式串来看的,也就是将主串与模式串从前向后对比,或者是从后向前对比。我们假设主串是原创 2022-01-01 11:13:32 · 682 阅读 · 0 评论 -
字符串查找-BM算法
这个算法是自己对购买课程中的一个章节的总结。1 BM 算法的核心思想我们把模式串和主串的匹配过程,看作模式串在主串中不停地往后滑动。当遇到不匹配的字符时,BF 算法和 RK 算法的做法是,模式串往后滑动一位,然后从模式串的第一个字符开始重新匹配,如图1.1所示。图 1.1举个例子解释一下,具体如图1.2所示。在这个例子里,主串中的 c,在模式串中是不存在的,所以,我们可以一次性把模式串往后多滑动几位,把模式串移动到 c 的后面。图 1.2...原创 2022-01-01 11:03:42 · 1264 阅读 · 0 评论