赞
踩
BFS 和 DFS 是遍历图节点常用的算法
考虑下面的图,不考虑边的权重:
可以用 字典 来存储,key 为顶点,value 为相邻顶点的列表(如果考虑边的权值,则 value 为包含了边权重的字典):
G = {
'A': ['B', 'C', 'G'],
'B': ['A', 'D', 'G', 'E'],
'C': ['A', 'D'],
'D': ['B', 'C', 'E'],
'E': ['B', 'D', 'F'],
'F': ['E'],
'G': ['A', 'B']
}
DFS 为深度优先遍历算法,首先考虑深度,等遍历完深度后再考虑广度
算法步骤:
我们可以使用 list
的 pop()
和 append()
充当栈的功能:
def DFS(G, start): stack = [] result = [] visited = [] stack.append(start) visited.append(start) while stack != []: node = stack.pop() neighbors = G[node] for neighbor in neighbors: if neighbor not in visited: stack.append(neighbor) visited.append(neighbor) result.append(node) return result
结果为:
['A', 'G', 'C', 'B', 'E', 'F', 'D']
BFS 为广度优先,刚好与 DFS 相反
算法步骤:
我们可以使用 list
的 pop(0)
和 append()
充当队列 queue 的功能:
def BFS(G, start): queue = [] result = [] visited = [] queue.insert(0, start) visited.append(start) while queue != []: node = queue.pop() neighbors = G[node] for neighbor in neighbors: if neighbor not in visited: queue.insert(0, neighbor) visited.append(neighbor) result.append(node) return result print(BFS(G, 'A'))
结果为:
['A', 'B', 'C', 'G', 'D', 'E', 'F']
对比两个算法可以发现,顶点都是从列表尾部进去,唯一的差别在于出列表的元素,一个是列表尾部(stack)一个是列表首部(queue)
完结
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。