图—广度优先搜索(BFS)
Breadth First Search是搜索图的最简单算法之一,
- 给定图G,以及开始搜索的起始顶点s
- BFS搜索所有从s可到达顶点的边,而且在达到更远的距离k+1的顶点之前,BFS会找到全部距离为k的顶点
- 可以想象为以s为根,构建一棵树的过程,从顶部向下逐步增加层次
- 广度优先搜索能保证在增加层次之前,添加了所有兄弟结点到树中
-
从Fool开始搜索
-
为了跟踪顶点的加入过程,并避免重复顶点,要为顶点增加3个属性
- 距离distance:从起始顶点到此顶点路径长度
- 前驱顶点predecessor:可反向追溯到起点
- 颜色:标识了此顶点是尚未发现(白色),已经发现(灰色), 还是已经完成探索, 还是已经完成探索(黑色)
-
还需要用一个队列queue来对已发现的顶点进行排列
-
决定下一个要探索的顶点(队首顶点)
-
从起始顶点s开始,作为刚发现的顶点,标注为灰色,距离为0,前驱为None,加入队列,下面是循环迭代过程:
- 从队首取出一个顶点作为当前顶点;
- 遍历当前顶点的邻接顶点,如果是尚未发现的白色顶点,则将其颜色改为灰色(已发现),距离增加1,前驱顶点为当前顶点,加入到队列中遍历完成后,将当前顶点设置为黑色,循环回到步骤1的队首取当前顶点
def bfs(g, start):
start.setDistance(0)
start.setPred(None)
vertQueue = Queue()
vertQueue.enqueue(start)
while vertQueue.size() > 0:
currentVert = vertQueue.dequeue()
for nbr in currentVert.getConnections():
if nbr.getColor() == 'white':
nbr.setColor('gray')
nbr.setDistance(currentVert.getDistance()+1)
vertQueue.enqueue(nbr)
currentVert.setColor('black')
-
BFS算法主体是两个循环的嵌套
while循环对每个顶点访问一次,所以是 O ( ∣ v ∣ ) \mathbf{O}(|\mathbf{v}|) O(∣v∣),而嵌套在while中的for,由于每条边只有在其其实顶点u出队的时候才会被检查一次,而每个顶点最多出队1次,所以边最多被检查1次,一共是 O ( ∣ E ∣ ) \mathbf{O}(|\mathbf{E}|) O(∣E∣),综合起来BFS的事件复杂度为 0 ( ∣ v ∣ + ∣ E ∣ ) 0(|v|+|E|) 0(∣v∣+∣E∣)
PS:
词梯文件被存在的地址是 : http://gis4g.pku.edu.cn/course/pythonds/#%E8%AF%BE%E7%A8%8B%E8%B5%84%E6%BA%90 你可以复制网址.在浏览器中打开上面的网址.并在打开的网页中搜索(CTRL+F)关键词 : 字母单词表. 之后,就可以找到一个压缩包.下载到本地并解压它就会得到文章代码所需要的词梯文件.希望回复及时 | |
< |