系列文章目录
第五章:广度优先搜索
前言
积累算法,记录学习
一、图简介
图模拟一组连接。由节点(node)和边(edge)组成。
比如《图解算法》中给出的生动例子,这个图指出欠钱关系,比如ALEX欠了EAMA的钱,RAME又欠了ADIT钱,以此类推。
并且,一个节点可能与众多节点直接相连,这样的节点被称为邻居,也有一些互不相连的节点,可以通过彼此的邻居进行关系连接。因此直接相连称为“一度关系”,经过一个邻居相连(比如ALEX和ADIT)被称为“二度关系”,依此类推。
总之,图用来模拟不同对象是怎么相连的。在我认为的所有算法中,图算法应该是最有用的。
二、广度优先搜索
广度优先搜索是一种用于图的查找算法,用于解决最短路径问题,可以帮助回答两类问题:
- 从节点A出发,有前往节点B的路吗?
- 从节点A出发,前往节点B的哪条路径最短?
1、查找有无路径?
1)依次检查一度关系,查看能否相连
2)如果能相连,则成功结束
3)不能相连,将每一个一度关系的邻居加入查找名单
4)循环,直到寻找到路径或者循环完毕
2、查找最短路径
最短路径肯定会优先出现在一度关系,然后是二度关系,依次类推
因此只有按顺序查找,才能实现这个目的,可实现这种目的的数据结构是队列(queue)
3、队列
队列的工作原理与现实生活中的队列完全相同,是一种先进先出(First In First Out,FIFO)的数据结构,与栈的后进先出(Last In First Out)区别开来。
三、代码实现
1、实现图
使用上一节讲到的散列表来表示图
比如和“我”有一度关系的是:BOB、CLAIRE、ALICE,散列表将键映射到值,我们将节点映射到所有邻居:
>>> graph = {
}
>>> graph