深度优先搜索(DFS)以及应用举例

深度优先搜索

  • 定义
  • 伪代码
  • 应用

寻找最短路径和最小生成树的算法需要考虑遍历顶点和边的顺序,但是,在一些算法中,不需要考虑访问顶点的顺序,采用系统的顺序来访问顶点。在本篇文章中,我们主要介绍其中的深度优先搜索。

定义

深度优先搜索是一种强有力的遍历方法,本质是前序遍历的推广。设 G ( V , E ) G(V,E) GV,E一个图,G的深度优先搜索如下:首先在所有顶点都标上未访问,接着选择一个起始节点,比如 v v v, 标注已访问。假设 w w w是邻接于 v v v的任一顶点,我们把w标注已访问并前进至另一个顶点…

伪代码

主函数

 1. predfn <- 0; postfn <- 0;
 2. for 每个顶点 v 属于 V
 3. 	标记v未访问
 4. end for
 5. for 每个顶点 v 属于 V
 6. 	if	v未访问 then dfs(v)
 7. end for

子函数

dfs(v)
 1. 标记v已访问
 2. predfn <- predfn + 1
 3. for 每条边(v, w)属于E
 4. 	if w标记为未访问 then dfs(w)
 5. end for
 6. postfn <- postfn + 1

应用

Leetcode–矩阵中的路径1
示例:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        def dfs(i, j, k):
            # 首先,判断异常情况,主要包含边界溢出以及当前值不符合要求
            if not 0 <= i < len(board) or not 0 <= j < len(board[0]) or board[i][j] != word[k]:
                return False
            # 设置递归中止条件
            if k == len(word) - 1 :
                return True
            # 将已访问的位置赋值,将当前位置的值赋予temp
            temp, board[i][j] = board[i][j], ''
            k = k+1
            result = dfs(i+1, j, k) or dfs(i, j+1, k) or dfs(i, j-1, k) or dfs(i-1, j, k)
            # 再次将访问位置的值赋值回到原位置,以用于下次的遍历
            # 一次深度遍历结束之后,需要将原始的矩阵复原
            board[i][j] = temp
            return result

        for i in range(len(board)):
            for j in range(len(board[0])):
                # 如果存在对应的组合
                if dfs(i, j, 0):
                    return True
        return False

  1. 参考代码:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof/solution/mian-shi-ti-12-ju-zhen-zhong-de-lu-jing-shen-du-yo/ ↩︎

你可能感兴趣的:(面试,算法)