![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法
_xw2018
越努力越幸运
展开
-
kmp算法
问题:判断一个串t是否为另一串s的子串,及t在s的位置如:t=”abab”, s=”abacabab”。1、Brute-Force算法图解时间复杂度O(strlen(t)*strlen(s)),效率低,在较大的数据下容易超时。2、kmp算法匹配图解:时间复杂度O(strlen(t)+strlen(s)),相对于Brute-Force算法效率高,避免了不必要的匹配...原创 2019-05-06 00:43:21 · 146 阅读 · 0 评论 -
并查集
并查集是一种树形的数据结构,用于处理一些不相交集合的合并及查询问题。主要操作:(1)初始化:将每个点所在集合初始化为其自身;(2)查找操作:查找元素所在集合,即查找根节点;(3)合并操作:将两个元素所在集合合并为一个集合(根节点相连);合并操作图解:现有四个集合(这里以节点权值最小的作为根节点)如下:将集合1和集合2合并,集合3和集合4合并:查找操作图解:...原创 2019-05-11 14:56:32 · 126 阅读 · 0 评论 -
SPFA算法
SPFA算法和Dijkstra一样是处理单源最短路径的算法。是对Bellman-Ford算法的队列优化,可以处理带负权的图。给定一个图G和源点v,dist数组保存v到其他顶点的距离,vis顶点集记录队列中的顶点,顶点v到自己的距离为0。步骤如下:将源点v入队; 从队列中取出一个顶点k,k出队(vis[k]=0); 以顶点k为中间点遍历与顶点k相邻的顶点更新dist数组,当(v,k,...原创 2019-05-11 02:57:16 · 187 阅读 · 0 评论 -
Prim算法
Prim算法是由R.C.Prim于1956年提出,是一种构造性算法。假设G=(V,E)是一个具有n个顶点的带权无向连通图,T=(U,TE)是G的最小生成树,其中,U是T的顶点集,TE是T的边集,则由G构造从起始顶点v出发的最小生成树T的步骤如下:初始化U={v},以v到其他顶点的所有边为候选边; 从候选边中挑选出权值最小的边加入TE,设该边在V-U中顶点为k,将k加入U中; 考察当前V-U...原创 2019-05-07 21:45:13 · 438 阅读 · 0 评论 -
Dijkstra算法
Dijkstra算法是典型的单源最短路径算法,用于计算一个顶点到其他所有顶点的最短路径。给定一个图G和源点v,dist数组保存v到其他顶点的距离,顶点v到自己的距离为0。步骤如下:通过v到其他顶点的权值初始化dist数组,将顶点v添加到顶点集S; 从dist数组从选出权值最小的边(v,k),且k不属于顶点集S,将k添加到顶点集S; 以顶点k为中间点更新dist数组,即当(v,k,t...原创 2019-05-10 13:36:05 · 254 阅读 · 1 评论 -
字典树(Trie树)
字典上是一种树形结构,是利用字符串的公共前缀来节约存储空间,最大限度减少无谓的字符串比较。Trie树特点:根节点不包含任何字母,其他每个结点都包含一个字母; 每个结点的所有儿子包含的字母各不相同; 从根节点到某个结点,路径上的字母依次连接起来所构成的字母序列称为该结点对应的单词;用给定的单词:i、is、he、her、man、map、she。一、由这些所构成的字典上如下(插入操作)...原创 2019-05-14 02:55:08 · 181 阅读 · 0 评论 -
Kruskal算法
Kruskal算法是一种按权值的递增次序选择合适的边来构造最小生成树的方法。对于给定的一张图,其算法思路:将边按权值升序排序; 选出权值最小的边加入到最小生成树中,如果产生回路就放弃这条边(利用并查集来判断是否产生回路); 重复步骤2,直到所有顶点都加入最小生成树中;算法过程图:将图的边按权值排序,每个顶点放在单独的集合里:(1)选出权值最小的边(0,2)加入到最小...原创 2019-05-09 00:20:15 · 1432 阅读 · 0 评论 -
广度优先搜索(BFS)
算法思路(使用队列):广搜遍历图,从图某个初始顶点出发:将初始顶点入队,标记为访问过 从队列中取出一个顶点v,出队 依次将所有与v相邻且未访问过的顶点w压入队列,并标记为访问过 重复2、3两个操作直到所有顶点都访问过扩散式的搜索,直到所有顶点全访问结束对于这样的一个图以1为初始顶点则广度优先遍历结果为:125693478模板函数:int map[MAXN][MA...原创 2019-05-06 02:16:51 · 168 阅读 · 0 评论 -
深度优先搜索(DFS)
算法思路(递归):深搜遍历图,从图某个初始顶点v出发访问顶点v,标记为访问过 选择一个顶点v相邻并且没被访问过的顶点w 以w为初始顶点进行深度优先搜索,直到所有顶点都标记为访问过沿着图的一条路一直走到走不通,再回溯到第一个没被访问过的点(一条路走到尽头就回头)对于这样的一个图以1为初始顶点则深度优先遍历结果为:123456789模板函数:bool flag[MAX...原创 2019-05-06 01:52:00 · 225 阅读 · 0 评论 -
快速排序
排序思路(升序排序为例):在待排序的n个元素中任取一个元素作为基准(一般取第一个); 根据取出的元素将剩余元素划分为两个区间(无序的),把所有比基准元素小的元素放置在左区间,把比所有比基准元素大的元素放置在右区间; 将基准元素放入划分的两个区间中间(元素归位); 对划分的两个区间分别进行1~3的操作(递归实现,直到区间长度为1或0结束);示意图:快速排序模板函数:void...原创 2019-05-06 00:46:46 · 134 阅读 · 0 评论 -
最长公共子序列(图解)
给定两个字符串strA[]=“ abfcab",strB[]=" abcfbc",求最长公共子序列。图解:最长公共子序列=4;状态转移方程: dp[0][0]=0; int lenA=strlen(strA+1); int lenB=strlen(strB+1); for(int i=1;i<=lenA;i++) { for(int j=1;j<=lenB;j++...原创 2019-04-19 00:11:31 · 3138 阅读 · 0 评论 -
初等几何(已知三角形三边,求外接圆直径)
p=(a+b+c)/2;①海伦公式:s=sqrt( p*(p-a)(p-b)(p-c));②三角形面积公式:s=(absin(∠ab)) / 2;③正弦定理:a / sin(∠bc) = b / sin(∠ac) = c / sin(ab) = d;联立①②③解得:直径d = (abc) / 2*s;...原创 2019-04-05 13:12:17 · 3198 阅读 · 0 评论 -
向量叉积(图解)
int cross(point &amp;a,point &amp;b,point &amp;c){int x1=b.x-a.x;int y1=b.y-a.y;int x2=c.x-a.x;int y2=c.y-a.y;return x1y2-x2y1;//大于0为突出的点}原创 2019-03-10 01:37:52 · 4206 阅读 · 0 评论 -
最长上升子序列 O(nlogn)
给定一个数列arr[]={5,2,1,4,5,3};定义一个数组dp,dp[0]初始化为最小值(小于arr的最小值),定义top指向dp数组最后一个元素,定义i=0为arr数组指针; 从数组arr中取第一个数(value1),与dp数组最后一个数(value2)比较; 若value1>value2,则将value1插入到dp数组最后一位,dp数组长度+1(dp[++top]=arr[...原创 2019-05-12 12:50:44 · 1040 阅读 · 0 评论