广度优先搜索&深度优先搜索(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);
 //BFS只能非递归实现,将queue替换成stack之后就是DFS
procedure BFS(G,v):
create a queue Q
enqueue v onto Q
mark v
while Q is not empty:
t ← Q.dequeue()
if t is what we are looking for:
return t
for all edges e in G.incidentEdges(t) do //遍历所有与t直接相连的边e
o ← G.opposite(t,e) //通过边e与t相连的顶点o
if o is not marked:
mark o
enqueue o onto Q //DFS递归实现
procedure DFS(G,v):
label v as explored
for all edges e in G.incidentEdges(v) do
if edge e is unexplored then
w ← G.opposite(v,e)
if vertex w is unexplored then
label e as a discovery edge
recursively call DFS(G,w) //递归调用没有访问的顶点w
else
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从头到尾都只维护一棵树,通过从树的最远顶点相连的还未在树中的顶点中选择边权值最小的顶点进行扩展。
 MST-PRIM(G,w,r)
Q←V[G] //将G的所有节点记录到Q
for 每个包含于Q的u
do key[u]←∞ //初始化每个节点的key,表示到根节点r的最短距离
key[r]← //处理根节点
p[r]←NIL
while Q≠空集
do u←EXTRACT-MIN(Q) //根据节点的key值选取一个最小的节点
for 每个包含于Adj[u]的节点v
do if v包含于Q and w(u,v)<key[v]
then p[v]←u
key[v]←w(u,v) //使用节点间的距离赋值节点v的最短距离

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

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

    简单介绍 求最小生成树一共同拥有两种算法,一个是就是本文所说的Kruskal算法,还有一个就是Prime算法. 在具体解说Kruskal最小生成树算法之前,让我们先回想一下什么是最小生成树. 我们有一 ...

  2. java经典算法题50道

    原文 JAVA经典算法50题[程序1]   题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序 ...

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

    出题:多人按照从低到高排成一个前后队列,如果前面的人比后面的高就认为是一个错误对: 例如:[176,178,180,170,171]中的错误对 为 <176,170>, <176,1 ...

  4. FCC的javascript初级算法题解答

    FCC上的javascript基础算法题 前一阵子做的基础算法题,感觉做完后收获还蛮大的,现在将自己的做法总结出来,供大家参考讨论.基本上做到尽量简短有效,但有些算法还可以继续简化,比如第七题若采用正 ...

  5. 前端如何应对笔试算法题?(用node编程)

    用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...

  6. 美团点评2017校招笔试真题-算法工程师A

    美团点评2017校招笔试真题-算法工程师A 1.下面哪种STL容器的实现和其它三个不一样 A. set B. deque C. multimap D. map 正确答案: B STL的容器可以分为以下 ...

  7. 美团点评2017校招笔试真题-算法工程师B

    美团点评2017校招笔试真题-算法工程师B 1.以下关于经典的k-means聚类的说法哪个是错误的? A:k-means聚类算法是全局收敛的 B:k-means的聚类结果和初始聚类中心点的选取有关 C ...

  8. 提前批笔试一道算法题的Java实现

    题目描述 这是2021广联达校招提前批笔试算法题之一. 我们希望一个序列中的元素是各不相同的,但是理想和显示往往是有差距的.现在给出一个序列A,其中难免有相同的元素,现在提供了一种变化方式,使得经过若 ...

  9. Python数据结构与算法之图的广度优先与深度优先搜索算法示例

    本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法.分享给大家供大家参考,具体如下: 根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 ...

随机推荐

  1. php 和 js之间使用json通信

    有时候我们需要用后台从数据库中得到的数据在js中进行处理,但是当从php中获取到数据的时候,使用的是键值对形式的多维关联数组.而我们知道,js只支持索引数组,不支持关联数组,这个时候从后台传递过来的数 ...

  2. ubuntu 12.04 alt+tab无法切换窗口的问题(转载)

    转自:http://www.2cto.com/os/201209/153282.html ubuntu 12.04 alt+tab无法切换窗口的问题   安装cpmpiz配置管理程序.   sudo ...

  3. Linux系统调用之open(), close() (转载)

    转自:http://joe.is-programmer.com/posts/17463.html open函数可以打开或创建一个文件. #include <sys/types.h> #in ...

  4. 哈理工OJ P2320:OX

    题目链接:OX 题意 :给出一个3X3的黑白棋棋盘,棋盘上有若干黑白子,再给出下一个下的人,问下一个下的人能否赢 分析:考虑到只有39种状态,故用一个数保存目前棋盘的状态,记为value,再枚举空位D ...

  5. bzoj 3894 文理分科【最小割+dinic】

    谁说这道和2127是双倍经验的来着完全不一样啊? 数组开小会TLE!数组开小会TLE!数组开小会TLE! 首先sum统计所有收益 对于当前点\( (i,j) \)考虑,设\( x=(i-1)*m+j ...

  6. codeforces 1006 F(折半搜索)

    F. Xor-Paths time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...

  7. 小程序 获取地理位置-- wx.getLocation

    话不多说直接上栗子 //首先声明变量data:{ showLocationAuth:fasle } //这是第一种逻辑实现方式 点击按钮//当第一次点击授权按钮,用户取消授权之后,就会显示 授权当前定 ...

  8. 文件系统访问控制ACL设置

    1.传统Linux文件系统权限的问题 传统Linux文件系统有三类用户:文件属主-u,组用户-g,其它用户-o,以及三种访问权限:读-r,写-w,执行或目录进入-x,但很多时候并不能满足对文件访问的细 ...

  9. Fastjson详解

    Fastjson是一个Java语言编写的高性能功能完善的JSON库.它采用一种"假定有序快速匹配"的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON ...

  10. [POI2001]Goldmine

    Description Byteman作为Byteland的The Goldmine(某一公司厂矿)的最有功的雇员之一,即将在年末退休.为了表示对他的 认真勤恳的工作的承认,The Goldmine的 ...