这也是面试中非常容易碰到的算法,上python-like伪代码:
# Given starting_node, try to reach target_node using BFS
visit(starting_node)
dequeue = deque(starting_node)
while not dequeue.empty():
node = dequeue.popleft()
if node == target_node:
return
for adjacent_node in node.neighbor():
if has_visited(adjacent_node) == False:
visit(adjacent_node)
dequeue.append(adjacent_node)
adjacent_node.parent = node
这里面有一些值得讨论的东西:
- 如果知道data_structure是一颗树的话,当然不需要去维护一个东西有没有visit过;我感觉这个部分主要是在general graph中使用来规避graph cycle这个麻烦的事情。
- deque变成stack就变成DFS了
- deque contains elements about frontier
- 最后一行assign parents可以很方便寻找path (e.g. shortest path) 以及回溯
还有一些具体实现的东西:
- 上面的算法和wikipedia https://en.wikipedia.org/wiki/Breadth-first_search 是一致的,这里面dequeue中的元素是先visit过再放入dequeue中。
- 另一种同样正确的方法是先放入dequeue然后再visit,这样在实现的时候不需要visit the starting node, 另外visit也是从dequeue拿出来后再visit;所有visit实现的逻辑都是先看是否visit过然后再做操作。