广度优先算法可以让你计算出A点到B点是否存在路径; 如果存在路径, 则计算出最短路径.
通过解决计算最短路径, 我们引入了图的概念. 图由点和边组成, 一个节点可以和多个节点直接相连, 这些节点之间称为邻居.
举例
你需要在你的人际网中找到一个芒果供应商
方法: 你先找遍你所有的朋友, 确认他们是否是供应商; 如果他们不是的话, 则再找他们的朋友. 你的朋友可以称为一度关系, 你的朋友的朋友则是二度关系. 因为我们要找最短路径, 所以只有确认你的朋友当中没有供应商, 才会再去确认朋友的朋友中有没有供应商(这里存在一个顺序关系, 可以用队列实现). 一直到遍历了所有的人际网, 没有的话表示你的人际网中没有供应商, 如果有的话, 你可以知道最少找几个人就可以找到这个供应商. 由于某些朋友的朋友是重复的, 所以问过的朋友要做标记.
如果要用代码来实现图, 我们可以用散列表来实现.1
2
3
4
5
6
7
8
9#用来实现图的数据结构
graph = {}
graph['you'] = ['alice', 'bob', 'chris']
graph['bob'] = ['peggy']
graph['alice'] = ['amy', 'peggy']
graph['chris'] = ['john']
graph['peggy'] = []
graph['amy'] = []
graph['john'] = []
A–>B, 但是B没有到A, 这个称为有向图
A–B, 这个是无向图, 和有向图的A–>B, B–>A是等价的
函数实现
1 | #deque是一种双向队列 |