一对好基友,深度优先vs.广度优先搜索

Posted 极客见闻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一对好基友,深度优先vs.广度优先搜索相关的知识,希望对你有一定的参考价值。

广度优先搜索

BFS是图的遍历策略,该算法从某一指定节点出发 先搜遍所有的邻居节点,然后再拓展到下一层级,

如下图,以树为例,BFS结果是:

 
   
   
 
  1. [1]

  2. [2, 3, 4]

  3. [5, 6, 7, 8]

  4. [9, 10, 11, 12]

深度优先搜索

DFS图的遍历策略,与BFS策略相反,该算法从某一指定节点出发,先探索尽可能远,然后回溯

回溯是指,先遍历[1, 2, 3, 4], 然后4没有更深的节点,然后把4丢掉,退回[1, 2, 3],再把5填到结果中得到[1, 2, 3, 5],以此类推

如下图:DFS结果是:

 
   
   
 
  1. [1, 2, 3, 4] pop 4

  2. [1, 2, 3, 5] pop 5, 3

  3. [1, 2, 6] pop 6, 2

  4. [1, 7] pop 7

  5. [1, 8, 9, 10] pop 10

  6. [1, 8, 9, 11] pop 11, 9

  7. [1, 8, 12]

代码实现

递归实现:

DFS

 
   
   
 
  1. class node(object):

  2.    def __init__(self):

  3.        val = 0

  4.        children = []

  5. def search(node):

  6.    if node is None:

  7.        return

  8.    print node.val

  9.    for sub in node.children:

  10.        search(sub)

非递归实现:

DFS

 
   
   
 
  1. nodes_to_visit = [root]

  2. while( len(nodes_to_visit) > 0 ) {

  3.  #从尾部取出

  4.  node = nodes_to_visit.pop()

  5.  print node.val

  6.  for sub in node.children:

  7.      nodes_to_visit.append(sub)

  8. }

BFS

 
   
   
 
  1. nodes_to_visit = [root]

  2. while( len(nodes_to_visit) > 0 ) {

  3.  #从头部取出

  4.  node = nodes_to_visit.pop(0)

  5.  print node.val

  6.  for sub in node.children:

  7.      nodes_to_visit.append(sub)

  8. }

如果你仔细观察,非递归版本BFS与DFS是非常对称,只是DFS从尾部取出(Stack),BFS从头部取出(Queue)

PS:图的搜索遍历一定要记得记得去重, 如果你对代码还不太熟,对着代码,多调试几遍吧~

--END--


以上是关于一对好基友,深度优先vs.广度优先搜索的主要内容,如果未能解决你的问题,请参考以下文章

深度优先搜索法和广度优先搜索法

算法入门深度优先搜索(DFS)

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)

图的广度、深度优先搜索和拓扑排序

图解:深度优先搜索与广度优先搜索

图的遍历之 深度优先搜索和广度优先搜索