一、广度优先遍历-BFS
顾名思义,BFS总是先访问完同一层的结点,然后才继续访问下一层结点,它最有用的性质是可以遍历一次就生成中心结点到所遍历结点的最短路径,这一点在求无权图的最短路径时非常有用。广度优先遍历的核心思想非常简单,用python实现起来也就十来行代码。下面就是超精简的实现,用来理解核心思想足够了:
1 importqueue2
3 defbfs(adj, start):4 visited =set()5 q =queue.Queue()6 q.put(start) #把起始点放入队列7 while notq.empty():8 u =q.get()9 print(u)10 for v inadj.get(u, []):11 if v not invisited:12 visited.add(v)13 q.put(v)14
15
16 graph = {1: [4, 2], 2: [3, 4], 3: [4], 4: [5]}17 bfs(graph, 1)
上面的代码:
1. 创建一个队列,遍历的起始点放入队列
2. 从队列中取出一个元素,打印它,并将其未访问过的子结点放到队列中
3. 重复2,直至队列空
时间复杂度:基本与图的规模成线性关系了,比起图的其它算法动不动就O(n^2)的复杂度它算是相当良心了
空间复杂度:我们看到程序中使用了一个队列,这个队列会在保存一层的结点