![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 80
孙智荣
这个作者很懒,什么都没留下…
展开
-
排序算法
排序算法分类:排序算法分为两类:比较类和非比较类;比较类排序:通过元素间比较来决定他们的相对次序,时间复杂度最大为O(nlogn),也称之为非线性时间比较类排序;非比较类排序:不通过元素间比较决定次序,可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。算法复杂度:相关概念稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 时间复杂度:对排序数据的总的原创 2020-11-03 10:46:13 · 176 阅读 · 0 评论 -
最小生成树
下面介绍两种求最小生成树算法1.Kruskal算法此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。1. 把图中的所有边按代价从小到大排序;2. 把图中的n个顶点看成独立的n棵树组成的森林;3. 按权值从小到大选择边,所选的边连接的两个顶点ui,viui,vi,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。4. 重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。...原创 2020-07-08 12:16:27 · 264 阅读 · 0 评论 -
链式前向星存图
我们首先来看一下什么是前向星.前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了.用len[i]来记录所有以i为起点的边在数组中的存储长度.用head[i]记录以i为边集在数组中的第一个存储位置.那么对于下图:我们输入边的顺序为:...原创 2019-08-12 10:36:21 · 317 阅读 · 0 评论 -
图论--SPFA算法
算法优点: 1.时间复杂度比普通的Dijkstra和Ford低。 2.能够计算负权图问题。 3.能够判断是否有负环(即:每跑一圈,路径会减小,所以会一直循环跑下去)。算法思想:我们用数组记录每个结点的最短路径估计值,用邻接表来存储图G。 我们采取的方法是动态逼近法: ...原创 2019-08-12 10:33:42 · 274 阅读 · 0 评论 -
AStar(A*)算法
A* 寻路算法搜索区域(The Search Area)我们假设某人要从A点移动到B点,但是这两点之间被一堵墙隔开。如图1,绿色是A,红色是B,中间蓝色是墙。图1你应该注意到了,我们把要搜寻的区域划分成了正方形的格子。这是寻路的第一步,简化搜索区域,就像我们这里做的一样。这个特殊的方法把我们的搜索区域简化为了2维数组。数组的每一项代表一个格子,它的状态...原创 2019-08-10 20:08:01 · 2257 阅读 · 0 评论 -
DFS——深度优先搜索法
深度优先搜索属于图算法的一种,英文缩写为DFS即大法师,嘻嘻嘻是Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.举例说明之:下图是一个无向图,如果我们从A点发起深度优先搜索(以下的访问次序并不是唯一的,第二个点既可以是B也可以是C,D),则我们可能得到如下的一个访问过程:A->B->E(没有路了!回溯到A)...原创 2019-08-10 20:01:47 · 557 阅读 · 3 评论 -
BFS——广度优先搜索法
BFS的基本思想是:首先访问初始点v并将其标志为已经访问。接着通过邻接关系将邻接点入队。然后每访问过一个顶点则出队。按照顺序,访问每一个顶点的所有未被访问过的顶点直到所有的顶点均被访问过。广度优先遍历类似与层次遍历。其特点是尽可能先对横向进行搜索,从指的出发点,按照该点的路径长度由短到长的顺序访问图中各顶点。利用队列先进先出的性质,从起点开始,将一步能到达的点全部存入队列,然后将队列中...原创 2019-08-10 17:20:19 · 243 阅读 · 0 评论 -
子集生成和组合问题
子集一个包含n个元素的集合,它的子集(包含空集)的个数为个。这样我们发现,子集的状况可以用二进制的概念进行对照是最直观的。例如:n=3的集合{,,},他的子集和二进制数的关系如下表;子集 ∅ , , , ,, 二进制数 000 001 010 011 100 101 110 1...原创 2019-08-10 16:05:53 · 258 阅读 · 0 评论 -
递归和排列
排列和组合问题n个数的全排列:n!n个数中任意m个数的全排列:n个数中任意m个数的组合:用STL输出全排列:先用sort得到序列最小字典序的排序,然后可以调用next_permutation()得到下一字典序排列。还有一种是pre_permutation(),是可以输出当前字典序的前一字典序排列。递归定义递归是通过嵌套来实现的,一般会用数学中的递推方程来讲解递归的...原创 2019-08-10 15:18:55 · 210 阅读 · 0 评论 -
双向广搜——DBFS
双向:简而言之就是从起点(正向搜索)和终点(逆向搜索)同时开始搜索,当两个搜索产生的一个子状态相同时就结束搜索。通常有两种实现方法:1、用一个队列来储存子状态,起点和终点先后入队,正向搜索和逆向搜索交替进行,两个方向的搜索交替扩展子状态。直到两个方向的搜索产生相同的子状态结束。2、两个方向的搜索虽然是交替扩展子状态的。但是两个方向生成的子状态的速度不一定平衡。所以,可以每次选择子状态数...原创 2019-08-14 16:23:15 · 910 阅读 · 0 评论 -
康托展开
定义康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。原理介绍X = A[0] * (n-1)! + A[1] * (n-2)! + … + A[n-1] * 0!A[i] 指的是位于位置i后面的数小于A[i]值的个数,后面乘的就是后面还有多少个数的阶乘说明 :这个算出来的数康拖展...原创 2019-08-10 09:38:05 · 122 阅读 · 0 评论 -
Floyd
解决最短路径问题有几个出名的算法:1.dijkstra算法,最经典的单源最短路径算法2.bellman-ford算法,允许负权边的单源最短路径算法3.spfa,其实是bellman-ford+队列优化,其实和bfs的关系更密一点4.floyd算法,经典的Floyd算法又叫做插点法Floyd算法: Floyd算法用来找出每对顶点之间的最短距离,它对图的要求是,既可以是无向图...原创 2019-08-14 11:30:46 · 152 阅读 · 0 评论 -
Dijkstra
相对于暴力简单的Floyd算法,Dijkstra算法更为有用且复杂度较为合理--O(N^2)。今天就为大家介绍一下这个算法。Dijkstra算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。算法思路:Dijkstra算法采用的是一种贪心的策略,声明一个数组dis来保存源点到各个顶点的最短距离和一...原创 2019-08-14 10:07:45 · 269 阅读 · 0 评论