BFS系列(一)
来源:互联网 发布:winrar64解压软件下载 编辑:程序博客网 时间:2024/06/05 07:26
起源
最开始接触BFS算法是从图算法开始的,但是图本身不是一个适合初学者的数据结构,所以这个系列的文章为BFS的学习者引路。
例子
Input: A graph Graph and a starting vertex root of Graph
Output: Goal state. The parent links trace the shortest path back to
root Breadth-First-Search(Graph, root):create empty set Screate empty queue Q add root to SQ.enqueue(root) while Q is not empty: current = Q.dequeue() if current is the goal: return current for each node n that is adjacent to current: if n is not in S: add n to S n.parent = current Q.enqueue(n)
上面的例子是Wiki上给出的用BFS求简单图最短路径的伪代码,虽然有缺陷,但是可以研究和注意的地方有很多。
BFS基本思想
先分析这个最短路径算法,本来BFS的提出就是为了解决这个问题。输入为无权无向图,给出的是起始位置。
首先看通用的BFS都需要什么,需要一个队列(FIFO数据结构),一个哈希表(判断是否已访问)一个root..(起始结点)。首先把root加入哈希表,代表已经访问过,然后把root加入队列。。。while循环判断队列是否空,拿出队列中的一个元素,如果当前元素就是所要求的目标,访问,程序结束。否则对于每个与current相邻的元素,如果adj不在哈希表中(没有被访问过),那么将其加入哈希表(标记已经访问过),再将其加入队列。
补充说明:parent域是用来跟踪一直从找的终点到首结点的辅助域。。。这里不是很通用。
BFS千变万化
这里的图可以是二叉树,那么就不需要哈希表S了。另外这里的哈希表也很有讲究,因为有时候根据给出图的自身条件(比如二维矩阵)就不用再建哈希表了,天然的boolean数组。。。
而且这个相邻元素也很有讲究,对于二叉树就是其左右子树,对于棋盘,就是上/下/左/右的点,或者更多方向。
最后说这个层级遍历,层级遍历不是必须的,但有时候需要,比如求最短路径的长度或者将二叉树按层级遍历输出
面试常考BFS
由于给出一个图不太方便,所以面试基本上会给出一个棋盘背景,这个时候就特别要注意边界的问题以及边界函数的写法。
练习
光说不练,没有体会和提高,这里选了一些BFS题带读者感受BFS..
https://www.lintcode.com/zh-cn/problem/binary-tree-level-order-traversal/#
https://www.lintcode.com/zh-cn/problem/number-of-islands/
https://www.lintcode.com/zh-cn/problem/surrounded-regions/
https://www.lintcode.com/zh-cn/problem/knight-shortest-path/
- BFS系列(一)
- BFS系列(二)
- 迷宫寻宝(一)(bfs)
- DFS and BFS (一)
- DFS&BFS专题(一)
- 迷宫系列(二)搜索、BFS、DFS
- 迷宫寻宝(一)(BFS)
- 数据结构(一) 广度优先遍历 BFS
- 【BFS】迷宫寻宝(一)(nyoj-82)
- nyist 82迷宫寻宝(一)(BFS)
- NYOJ82 迷宫寻宝(一)【BFS】
- nyoj 82 迷宫寻宝(一) 【BFS】
- NYOJ迷宫寻宝(一)【BFS】
- NYOJ82 迷宫寻宝(一)(BFS)
- NYOJ 迷宫寻宝(一) bfs
- nyoj ACM:迷宫寻宝(一)(bfs)
- nyoj 82 迷宫寻宝(一)BFS
- nyoj82 迷宫寻宝(一) (bfs)
- Redis CentOS单点部署与自启动
- locate、find命令使用总结
- 持续集成工具集之六 参考
- 返回上一页 小结
- mybatis大于小于的转义
- BFS系列(一)
- 把排序数组转换为高度最小的二叉搜索树
- 写给初学者19_android_四大组件_ContentProvider初级
- runloop理解
- jacoco的maven插件使用
- Java 多线程池ThreadPoolExecutor解析及Executors类中提供的静态方法来创建线程池
- 微信小程序 navbar
- 微信 php form post 为空
- Vitamio 导入依赖库出错 :Error:(9, 0) Could not get unknown property 'ANDROID_BUILD_SDK_VERSION' for project