图搜索算法 - 深度优先搜索法(DFS)

图搜索算法

图搜索算法也可以叫图的遍历,指从图上任意一个顶点出发,访问图上的所有顶点,而且只能访问一次。这和上一节树的遍历功能类似。但由于图没有层级结构,也没有类似树的根结点那样的特殊顶点,因此相对要复杂一些。本文主要介绍深度优先搜索法(DFS)。

深度优先搜索法(DFS)

根据字面意思,就是顺着起始顶点访问一个没有访问过的顶点,一直走到没有新的顶点可以访问的时候,才往后退回上一个顶点,看一下有没有新的顶点可以访问,如果有又继续深入,直到所有顶点都被访问。这个过程类似浏览网页,点开新闻,再点开体育新闻,然后再看足球新闻,看完今天的足球新闻,那就回到体育新闻,然后访问下一个栏目-篮球新闻。看完了体育新闻,就回到新闻首页,找下一个新闻栏目,如娱乐新闻。

利用深度优先搜索法,从【A】顶点出发来遍历所以结点。然后利用之前学过的栈结构来存储访问记录,下面模拟计算机的访问过程。

(1)首先访问【A】顶点,同时把【A】顶点入栈,如图所示。

(2)顺着【A】顶点,找到未访问的顶点【B】,同时把【B】顶点入栈,如图所示。

(3)顺着【B】顶点,找到未访问的顶点【D】,同时把【D】顶点入栈,如图所示。

(4)顺着【D】顶点,没有发现未访问的顶点,那么把【D】顶点出栈,然后继续访问栈的头,也就是回到【B】顶点,又发现另外一个未访问的顶点【E】,同时把【E】定入栈,如图所示。

后面的过程也是这样重复下去,最终结果如图所示。

那么现在用代码来表示刚才这个遍历过程。

python 复制代码
# 根据图1-43创建无权无向图的邻接列表
graph = {'A': ['B', 'C'],
         'B': ['A', 'D', 'E'],
         'C': ['A', 'F', 'G'],
         'D': ['B'],
         'E': ['B', 'F', 'G'],
         'F': ['C', 'E'],
         'G': ['C', 'E']}
def graph_dfs(adjacency_list, start_point):
    """图的深度优先搜索法"""
    visited = [start_point]      # 保存已经访问过的顶点
    stack = [[start_point, 0]]   # 用栈数据结构来记录访问历史,
    #result = [start_point]
    while stack: # 当栈为空,说明全部顶点已经遍历完成
        (current_point, next_point_index) = stack[-1]  # 获取当前访问的顶点
        if (current_point not in adjacency_list) or (next_point_index >= len(adjacency_list[current_point])):
            stack.pop() # 当前顶点没有新的可以访问关联顶点,那么就出栈
            continue
        next_point = adjacency_list[current_point][next_point_index]
        stack[-1][1] += 1            # 记录当前访问的顶点的这个关联顶点已经被访问
        if next_point in visited:    # 若已经访问了,继续找下一个
            continue
        visited.append(next_point)   # 若是新的顶点,那就添加到已访问顶点
        stack.append([next_point, 0])# 新的顶点入栈 
    return visited  # 返回访问顶点的结果
#------------测试--------------------
res = graph_dfs(graph, 'A')
print("->".join(res))
#------------结果--------------------
A->B->D->E->F->C->G
相关推荐
xing-xing14 分钟前
魔搭社区(ModelScope)下载模型文件
python·jupyter·llm
承渊政道25 分钟前
【Python学习】(了解使用库、标准库、第三方库以及综合案例实操)
python·学习·pycharm·标准库·第三方库·使用库·综合案例
草莓熊Lotso37 分钟前
【LangChain】输出解析器全解:让大模型输出从 “聊天” 变 “机器可读”
服务器·数据库·python·langchain·pip
卷无止境42 分钟前
Python 脚本工程化:从"能跑就行"到"生产级代码"
后端·python
卷无止境43 分钟前
Python 函数式编程:从思想到实践
后端·python
满怀冰雪10 小时前
06-自动微分入门:用 Paddle 计算梯度
人工智能·python·深度学习·paddle
可编程芯片开发12 小时前
基于MATLAB的PEF湍流风场生成器模拟与仿真
算法
罗西的思考12 小时前
【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 --- (9)--- Reward Judging
人工智能·算法·机器学习
Mr.HeBoYan13 小时前
一次持续三天才出现的丢包故障——深入解析 DPDK Memory Ordering、rte_ring 与 CPU Memory Barrier (下)
linux·网络·算法·架构·dpdk
wabs66614 小时前
关于图论【深度优先搜索的理论基础】
算法·深度优先·图论