图宽度优先算法 (graph BFS)

这也是面试中非常容易碰到的算法,上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过然后再做操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值