云莉的技术专题

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

2020-04-07  本文已影响0人  云莉6

搜索

深度优先搜索算法:

实现方法:

  1. 首先将根节点放入 stack 中。
  2. 从 stack 中取出第一个节点,并检验它是否为目标。如果找到目标,则结束搜寻并回传结果。否则将它某一个尚未检验过的直接子节点加入 stack 中。
  3. 重复步骤 2.
  4. 如果不存在未检测过的直接子节点。将上一级节点加入 stack 中。重复步骤 2。
  5. 重复步骤 4。
  6. 若 stack 为空,表示整张图都检查过了—亦即图中没有欲搜寻的目标。结束搜寻并回传“找不到目标”。

代码模版

递归写法:

visited = set() 

def dfs(node, visited):
  if node in visited: # terminator
    # already visited 
      return 

  visited.add(node) 

  # process current node here. 
  ...
    
  for next_node in node.children(): 
    if next_node not in visited: 
      dfs(next_node, visited)

非递归写法:

def dfs(self, tree): 
  if tree.root is None: 
    return [] 

  visited, stack = [], [tree.root]

  while stack: 
    node = stack.pop() 

    visited.add(node)

    process (node) 
    nodes = generate_related_nodes(node)     
    stack.push(nodes) 

  # other processing work 
  ...

广度优先搜索算法:

实现方法:

  1. 首先将根节点放入队列中。
  2. 从队列中取出第一个节点,并检验它是否为目标。
    • 如果找到目标,则结束搜索并回传结果。
    • 否则将它所有尚未检验过的直接子节点加入队列中。
  3. 若队列为空,表示整张图都检查过了—亦即图中没有欲搜索的目标。结束搜索并回传“找不到目标”。
  4. 重复步骤 2。

代码模版

def bfs(graph, start, end):
  visited = set()
  queue = [] 
  queue.append([start]) 

  while queue: 
    node = queue.pop() 
    visited.add(node)
     process(node) 
    nodes = generate_related_nodes(node) 
    queue.push(nodes)

  # other processing work 
  ...
上一篇下一篇

猜你喜欢

热点阅读