深度优先搜索(DFS)和广度优先搜索(BFS)是两种常用的图搜索算法,用于在图或树等数据结构中查找特定节点或遍历整个结构。它们在解决许多问题时都非常有用,包括路径查找、连通性检测和图形遍历等。
深度优先搜索(DFS):
-
工作原理: 在深度优先搜索中,我们从起始节点开始沿着一条路径尽可能深地探索,直到到达最远的节点,然后返回并探索其他的分支。换句话说,DFS 会尽可能深地搜索当前路径,直到没有更多的未探索节点为止。
-
算法实现: 通常使用递归或栈来实现 DFS。递归的方法将在堆栈中维护当前路径,而非递归方法则需要使用显式的栈数据结构来跟踪节点。
-
特点: DFS 通常需要较少的内存空间,因为它只需要存储当前路径上的节点。但它可能会陷入无限循环,特别是在图中存在环路时。
-
应用: DFS 适用于寻找一条路径、深度优先遍历树或图,以及解决具有递归结构的问题。
-
时间复杂度: 在最坏情况下,DFS 需要遍历整个搜索空间,其时间复杂度取决于节点数量和边的数量。对于树来说,时间复杂度通常为 O(b^d) ,其中 b是每一层平均节点的数量,d 是树的层数。
-
空间复杂度: 在 DFS 中,需要存储当前路径上的节点,因此空间复杂度取决于树的深度。在最坏情况下,当搜索到树的最大深度时,空间复杂度为 O(bd)迭代或者O(d)递归,b是平均节点数目,其中 d 是树的深度((b-1)*d)->bd)。对于图,由于可能存在环路,空间复杂度可能更高,取决于搜索过程中所访问的节点数量。
-
以下是递归实现的实例代码:
def dfs(node, visited): if node not in visited: visited.add(node) # 访问节点的邻居 for neighbor in node.neighbors: dfs(neighbor, visited) # 定义节点类 class Node: def __init__(self, val): self.val = val self.neighbors = [] # 创建树的节点 node1 = Node(1) node2 = Node(2) node3 = Node(3) # 构建树的连接关系 node1.neighbors.append(node2) node1.neighbors.append(node3) node2.neighbors.append(node1) node3.neighbors.append(node1) # 初始化已访问节点集合 visited = set() # 从根节点开始进行深度优先搜索 dfs(node1, visited) print("深度优先搜索结果:", [node.val for node in visited])