笔试算法题(50):简介 - 广度优先 & 深度优先 & 最小生成树算法

广度优先搜索&深度优先搜索(Breadth First Search & Depth First
Search)

BFS优缺点:

  • 同一层的所有节点都会加入队列,所以耗用大量空间;

  • 仅能非递归实现;

  • 相比DFS较快,空间换时间;

  • 适合广度大的图;

  • 空间复杂度:邻接矩阵O(N^2);邻接表O(N+E);

  • 时间复杂度:O(V+E);

DFS优缺点:

  • 无论是系统栈还是用户栈保存的节点数都只是树的深度,所以空间耗用小;

  • 有递归和非递归实现;

  • 由于有大量栈操作(特别是递归实现时候的系统调用),执行速度较BFS慢;

  • 适合深度大的图;

  • 空间复杂度:邻接矩阵O(N^2);邻接表O(N+E);

  • 时间复杂度:O(V+E);


 1 //BFS只能非递归实现,将queue替换成stack之后就是DFS
2 procedure BFS(G,v):
3 create a queue Q
4 enqueue v onto Q
5 mark v
6 while Q is not empty:
7 t ← Q.dequeue()
8 if t is what we are looking for:
9 return t
10 for all edges e in G.incidentEdges(t) do //遍历所有与t直接相连的边e
11 o ← G.opposite(t,e) //通过边e与t相连的顶点o
12 if o is not marked:
13 mark o
14 enqueue o onto Q
15
16 //DFS递归实现
17 procedure DFS(G,v):
18 label v as explored
19 for all edges e in G.incidentEdges(v) do
20 if edge e is unexplored then
21 w ← G.opposite(v,e)
22 if vertex w is unexplored then
23 label e as a discovery edge
24 recursively call DFS(G,w) //递归调用没有访问的顶点w
25 else
26 label e as a back edge

最小生成树算法(Minimum Spanning Tree Algorithm, eg: Kruskal,
Prim)

Kruskal Algorithm

  • Kruskal属于贪心算法BFS策略,适用于稀疏图,使用并查集实现可具有较好性能,时间复杂度为O(ElogV),空间复杂度为O(V);

  • 首先对于一个含有N个顶点的连通图,Kruskal首先构造一个含有N个独立顶点的图,也就是N棵只有一个顶点的树;然后从带有权值的边集合E中选择当前
    权值最小的边e,如果e连接的顶点属于不同的树i和j,则使用e连接数i和j,并将e从边集合E中删除;然后从边集合E中选择下一个具有最小权值的边e,
    直到左右的边都选择完毕;最终所有的N棵子树将合并成一棵树;

Prim Algorithm

  • 时间复杂度:使用邻接矩阵实现为O(V^2);使用二叉堆和邻接表实现为O(ElogV);使用斐波那契堆实现为O(E+VlogV);Prim与
    Kruskal的不同点在于,Prim从头到尾都只维护一棵树,通过从树的最远顶点相连的还未在树中的顶点中选择边权值最小的顶点进行扩展。


 1 MST-PRIM(G,w,r)
2 Q←V[G] //将G的所有节点记录到Q
3 for 每个包含于Q的u
4 do key[u]←∞ //初始化每个节点的key,表示到根节点r的最短距离
5 key[r]←0 //处理根节点
6 p[r]←NIL
7 while Q≠空集
8 do u←EXTRACT-MIN(Q) //根据节点的key值选取一个最小的节点
9 for 每个包含于Adj[u]的节点v
10 do if v包含于Q and w(u,v)<key[v]
11 then p[v]←u
12 key[v]←w(u,v) //使用节点间的距离赋值节点v的最短距离

笔试算法题(50):简介 - 广度优先 & 深度优先 & 最小生成树算法,布布扣,bubuko.com

时间: 2024-12-29 20:31:29

笔试算法题(50):简介 - 广度优先 & 深度优先 & 最小生成树算法的相关文章

[算法系列之二十七]Kruskal最小生成树算法

简介 求最小生成树一共有两种算法,一个是就是本文所说的Kruskal算法,另一个就是Prime算法.在详细讲解Kruskal最小生成树算法之前,让我们先回顾一下什么是最小生成树. 我们有一个带权值的图,我们要求找到一个所有生成树中具有最小权值的生成树.如下图所示,T是图G的生成树.但不是具有最小权值的生成树. 我们可以把他们想象成一组岛屿和连接它们的可能的桥梁.当然修桥是非常昂贵和费时的,所以我们必须要知道建设什么样的桥梁去连接各个岛.不过有一个重要的问题,建设这样一组连接所有岛屿的桥梁的最低价

[算法第一轮复习] kruskal求最小生成树算法

最小生成树算法即MST,有kruskal,prim两种算法,这里主要介绍kruskal 什么是最小生成树? 对于一个图,保证其中每个点都可以连通的最小的花费 1.算法核心 贪心+并查集 2.算法实现过程 克鲁斯卡尔算法 假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林.之后,从网的边集 E 中选取一条权值最小的边,若该

笔试算法题(32):归并算法求逆序对 &amp; 将数组元素转换为数组中剩下的其他元素的乘积

出题:多人按照从低到高排成一个前后队列,如果前面的人比后面的高就认为是一个错误对: 例如:[176,178,180,170,171]中的错误对 为 <176,170>, <176,171>, <178,170>, <178,171>, < 180,170>, <180,171>. 现在要求从一个整数序列中找出所有这样的错误对: 分析: 逆序对(Inversion Pair):在N个可判断大小的数中,逆序对的数量为[0,n(n-1)/2

FCC的javascript初级算法题解答

FCC上的javascript基础算法题 前一阵子做的基础算法题,感觉做完后收获还蛮大的,现在将自己的做法总结出来,供大家参考讨论.基本上做到尽量简短有效,但有些算法还可以继续简化,比如第七题若采用正则表达式来匹配,则一行代码就可以完成需求.欢迎大家提出不同解法.末尾有FCC的链接,感兴趣的同学可以去做一做. 1.翻转字符串 function reverseString(str) { var arr=str.split(""); str=arr.reverse().join("

经典算法题每日演练——第三题 猴子吃桃

原文:经典算法题每日演练--第三题 猴子吃桃 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个.第二天早上又将剩下的桃子吃了一半,还是不过瘾又多 吃了一个.以后每天都吃前一天剩下的一半再加一个.到第10天刚好剩一个.问猴子第一天摘了多少个桃子? 分析: 这是一套非常经典的算法题,这个题目体现了算法思想中的递推思想,递归有两种形式,顺推和逆推,针对递推,只要 我们找到递推公式,问题就迎刃而解了. 令S10=1,容易看出 S9=2(S10+1), 简化一下 S9=2S10+2 S8=2S

常见算法题合辑(一)

这一章的内容,有些之前已经在微信公众号中将详细的思路及步骤汇总过,有些之后可能会再找时间对其进行分析,这里只将最终实现罗列出来,难易程度不分先后,算法复杂度不保证是最优,留给大家空间自行思考,当然,本章用的是C#语言进行编码,大家可以使用自己熟悉的语言将这些算法实现一遍哦~ 如果你有什么有趣的算法题或者没能解决的算法题,也可以留言给小编,让我们一起玩转算法~ 1. 冒泡排序 这个算是所有算法中最为简单的了,实现方法如下: 2. 插入排序 从排序算法来看,这个算法也是属于比较简单的了,实现方法如下

记一道数字旋转排列算法题

记一道数字旋转排列算法题 面试的时候遇到一道算法题,当时没做出来,也没有什么思路.睡觉前突然想到解法,记录一下. 题的大意如下,数字以1开始,并围绕1做逆时针旋转,其中1的坐标为(0, 0),如下图所示: 要求给一个坐标,求其未知的数是多少?例:给出(1, 0),该坐标的数为2:给出(-1, -2),该坐标上的数为22. 说下解题思路,由点的坐标可以得出目标值所在的圈数p,比如5在第2圈,p的大小为坐标x或y较大绝对值n再+1,比如18为(-2,1),绝对值n为2,则18在第3圈(n+1),然后

笔试算法题(51):简介 - 红黑树(RedBlack Tree)

红黑树(Red-Black Tree) 红黑树是一种BST,但是每个节点上增加一个存储位表示该节点的颜色(R或者B):通过对任何一条从root到leaf的路径上节点着色方式的显示,红黑树确保所有路径的差值不会超过一倍,最终使得BST接近平衡: 红黑树内每个节点包含五个属性:color, key, left, right和p,p表示指向父亲节点的指针:一棵BST需要同时满足下述五个性质才能称作红黑树: 每个节点只能是红色或者黑色节点中的一种: 根节点必须是黑色: 每个叶节点(NULL)必须是黑色:

笔试算法题(47):简介 - B树 &amp; B+树 &amp; B*树

B树(B-Tree) 1970年由R. Bayer和E. Mccreight提出的一种适用于外查找的树,一种由BST推广到多叉查找的平衡查找树,由于磁盘的操作速度远小于存储器的读写速度,所以要求在尽量少 的操作次数内完成CPU分配的任务,B树就按照此原则设计,B树与红黑树的主要区别在于B树节点可以有超过2个子女,从而大大降低树的高度以减少查询时 间: 一棵M阶B树(Balanced Tree of Order M)是一棵平衡的M路搜索树,满足性质: 根节点至少有两个子女: 除根节点和叶子节点外的