【算法知识】
sugarbliss
我想要的不多,只是和多数人不一样。
展开
-
深搜和广搜解析
深度优先搜索(DFS)如算法名称那样,深度优先搜索所遵循的搜索策略是尽可能“深”地搜索树。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前(子结点)探索,在探索过程中,一旦发现原来的选择不符合要求,就回溯至父亲结点重新选择另一结点,继续向前探索,如此反复进行,直至求得最优解。深度优先搜索的实现方式可以采用递归或者栈来实现。由此可见,把通常问题转化为树的问题是至关重要的一步,完成了树的转换...原创 2018-04-04 10:57:26 · 3495 阅读 · 0 评论 -
SPFA和BFS的区别
SPFA在形式上和BFS非常类似,不同的是BFS中一个点出了队列就不可能重新进入队列,但是SPFA中一个点可能在出队列之后再次被放入队列,也就是一个点松弛过其它的点之后,过了一段时间可能本身被松弛,于是要再次用来松弛其它的点,这样反复迭代下去。...原创 2019-01-16 11:27:44 · 955 阅读 · 0 评论 -
为什么dijkstra算法处理不了带有负权值的边的图
dijkstra是基于贪心策略,每次都找一个距源点最近的点,然后将该距离定为这个点到源点的最短路径;但如果存在负权边,那就有可能先通过并不是距源点最近的一个次优点,再通过这个负权边,使得路径之和更小,这样就出现了错误。对于下图将A添加到集合中标记已访问,之后选出从A到所有节点中的最短的点,于是把C加入集合中标记已访问,之后C不能在更新了,而显然,A与C之间最短路径权值为0(A-B-C),发生错...原创 2019-01-15 20:17:45 · 10298 阅读 · 7 评论 -
Floyd弗洛伊德算法
暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间则没有,如下图。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程。 ...转载 2019-01-15 18:47:04 · 203 阅读 · 0 评论 -
链式前向星--最通俗易懂的讲解
如果说邻接表是不好写但效率好,邻接矩阵是好写但效率低的话,前向星就是一个相对中庸的数据结构。前向星固然好写,但效率并不高。而在优化为链式前向星后,效率也得到了较大的提升。虽然说,世界上对链式前向星的使用并不是很广泛,但在不愿意写复杂的邻接表的情况下,链式前向星也是一个很优秀的数据结构。 ...原创 2019-01-15 17:55:11 · 64348 阅读 · 66 评论 -
分层图最短路--最通俗易懂的讲解
分层图最短路是指在可以进行分层图的图上解决最短路问题。分层图:可以理解为有多个平行的图。一般模型是:在一个正常的图上可以进行k次决策,对于每次决策,不影响图的结构,只影响目前的状态或代价。一般将决策前的状态和决策后的状态之间连接一条权值为决策代价的边,表示付出该代价后就可以转换状态了。一般有两种方法解决分层图最短路问题:建图时直接建成k+1层。 多开一维记录机会信息。当然具...原创 2019-01-19 13:04:30 · 11874 阅读 · 20 评论 -
差分
差分适用的问题:给你一个区间,然后让你对某一个区间加上或者减去一个数,然后询问区间和等问题,可以用差分。差分就是:除去第一个数外,每一个数减去上一个数。举个例子:有这样6个数:原数组 1 6 4 5 3 2 差分后 1 5 -2 1 -2 -1 我们要求原来的数求前缀和就好了。如果我们要对区间【...原创 2018-07-22 15:31:25 · 365 阅读 · 0 评论 -
二进制枚举--最通俗易懂的讲解
二进制:是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”子集:是一个数学概念:如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集。含有个元素的集合的一切子集的个数为。简单证明一下:含有0个元素的子集有个, 含有1个元素的子集有个, 含有2个元素的子集有个, ............原创 2018-07-18 17:20:47 · 22380 阅读 · 32 评论 -
哈夫曼算法
哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树。 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解答。 (1) 路径和路径长度 定义:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目...转载 2018-05-14 21:11:30 · 22722 阅读 · 3 评论 -
string用scanf读入printf输出(节省时间)
因为string不是c语言的内置数据,所以直接用scanf,printf输入,输出string类型。#include <iostream>#include <stdio.h>#include <string.h>using namespace std;int main(){ string a; a.resize(100); //需要预先...原创 2018-05-03 11:24:19 · 8897 阅读 · 12 评论 -
KMP算法详解
1. 引言 KMP本身不复杂,但网上绝大部分的文章(包括本文的2011年版本)把它讲混乱了。下面,咱们从暴力匹配算法讲起,随后阐述KMP的流程 步骤、next 数组的简单求解 递推原理 代码求解,接着基于next 数组匹配,谈到有限状态自动机,next 数组的优化,KMP的时间复杂度分析,最后简要介绍两个KMP的扩展算法。 全文力图给你一个最为完整最为清晰的KMP,希望更多的人...转载 2018-04-25 15:40:23 · 210 阅读 · 0 评论 -
最小生成树(Prim)算法和最短路(Dijkstra)算法的异同
Prim算法用于构建最小生成树——即树中所有路径之和最小,但不能保证任意两点之间是最短路径。例如,构建电路板,使所有边的和花费最少。只能用于无向图。 Dijkstra算法用于构建单源点的最短路径树(MST)——即树中指定点到任何其他点的距离都是最短的。例如,构建地图应用时查找自己的坐标离北京,上海,郑州等的最短距离。可以用于 有向图 ,但是不能存在负权值(Bellman-Ford可以处理...原创 2018-04-18 09:28:07 · 5072 阅读 · 3 评论 -
最短路问题--最通俗易懂的讲解
最短路径的定义:所谓最短路径是指:如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和(称为路径长度)达到最小。可以将适用最短路的算法分为单源最短路,和多源最短路如下图:多源最短路算法Floyd:Floyd-Warshall 算法用来找出每对点之间的最短距离。它需要用邻接矩阵来储存边,这个算法通过考虑最佳子...原创 2019-01-16 19:13:30 · 5865 阅读 · 6 评论