zoukankan      html  css  js  c++  java
  • 深度优先搜索(DFS)解题总结

    定义

    深度优先搜索算法(Depth-First-Search),是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分支。

    例如下图,其深度优先遍历顺序为 1->2->4->8->5->3->6->7

    image

    算法步骤

    1. 访问顶点v;
    2. 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
    3. 若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

    算法模板

    # Python 递归写法
    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, root): 
    
    	if tree.root is None: 
    		return [] 
    
    	visited, stack = [], [root]
    
    	while stack: 
    		node = stack.pop() 
    		visited.add(node)
    
    		process (node) 
            # 生成相关的节点
    		nodes = generate_related_nodes(node) 
    		stack.push(nodes) 
    
    	# other processing work 
    	...
    
    // Golang 递归写法
    type TreeNode struct {
        Val   int
        Left  *TreeNode
        Right *TreeNode
    }
    
    var visited map[*TreeNode]bool = make(map[*TreeNode]bool)
    
    func dfs(node *TreeNode, visited *map[*TreeNode]bool) {
        if _,ok:= (map[*TreeNode]bool)visited[node]; ok { // terminator
            // already visited
            return
        }
        
        (map[*TreeNode]bool)visited[node] = true
        
        // process current node here
        ...
        
        for _,next_node := range node.children() {
            if _,ok := (map[*TreeNode]bool)visited[next_node]; !ok{
                dfs(next_node, visited)
            }
        }
    }
    
    // 非递归写法
    func DFS(root *TreeNode) {
        if root == nil {
            return
        }
        visited := make(map[*TreeNode]bool)
        stack := make([]*TreeNode, 0)
        stack = append(stack, root)
        for len(stack) > 0 {
            node = stack[len(stack)-1]
            stack = stack[:len(stack)-1]
            visited[node] = true
            
            process(node)
            // 生成相关的节点
            nodes = generate_related_nodes(node)
            stack.push(nodes)
        }
        // other processing work
    }
    

    要点

    • 使用栈 stack
    • 记录已访问节点 visited ,通常使用哈希表

    适用场景

    • 二维数组

    实战题目

    参考资料

  • 相关阅读:
    elasticsearch文档
    swagger 接口文档
    IOS Pod install 443
    Celery 中文文档
    orm 不设置外建进行跨表查询
    There is no current event loop in thread
    django 中文文档
    MJRefresh 下拉刷新 上拉加载
    beeline导出hive数据
    什么是数据湖_二(转载)
  • 原文地址:https://www.cnblogs.com/liang24/p/13539997.html
Copyright © 2011-2022 走看看