深度优先搜索 (DFS)

图的深度优先搜索从图中的一个顶点开始,在回溯之前尽可能访问图中的所有顶点。
图的深度优先搜索类似于树遍历,树遍历中讨论的树的深度优先搜索。对于树,搜索从根开始。在图中,搜索可以从任何顶点开始。

深度优先搜索树首先访问根,然后递归访问根的子树。类似地,图的深度优先搜索首先访问一个顶点,然后递归地访问与该顶点相邻的所有顶点。不同之处在于该图可能包含循环,这可能导致无限递归。为了避免这个问题,你需要跟踪已经访问过的顶点。

该搜索被称为深度优先,因为它尽可能在图中搜索“更深”。搜索从某个顶点 v 开始。访问完 v 后,它会访问 v 的未访问的邻居。如果 v 没有未访问的邻居,则搜索回溯到到达 v 的顶点。我们假设图是连通的,并且搜索开始从任何顶点都可以到达所有顶点。

深度优先搜索算法

深度优先搜索的算法在下面的代码中描述。

输入:g = (v, e) 和起始顶点 v
输出:一棵以 v 为根的 dfs 树 1 树 dfs(顶点 v){
2 访问 v;
v 的每个邻居 w 为 3 个 4 if (w 还没有被访问过) {
5 将 v 设置为树中 w 的父级;
6 dfs(w);
7 }
8 }

您可以使用名为

isvisited

的数组来表示某个顶点是否已被访问。最初,对于每个顶点 i,isvisited[i]false。一旦访问了某个顶点(例如 v),isvisited[v] 就会设置为 true.考虑下图 (a) 中的图表。假设我们从顶点 0 开始深度优先搜索。首先访问 0,然后访问它的任何邻居,比如 1。现在访问 1,如下图 (b) 所示。顶点 1 有三个邻居:0、2 和 4。由于 0 已经被访问过,因此您将访问 2 或 4。让我们选择 2。现在 2 被访问,如下图 (c) 所示。顶点 2 有 3 个邻居:0、1 和 3。由于 0 和 1 已经被访问过,所以选择 3。现在访问 3,如下图 (d) 所示。至此,顶点已按以下顺序被访问过:

纳米搜索 纳米搜索

纳米搜索:360推出的新一代AI搜索引擎

纳米搜索 30 查看详情 纳米搜索 0

123由于 3 的所有邻居都被访问过,所以回溯到 2。由于 2 的所有顶点都被访问过,所以回溯到 1。4 与 1 相邻,但 4 还没有被访问过。因此,访问4,如下图(e)所示。由于 4 的所有邻居都已访问过,因此回溯到 1。

由于 1 的所有邻居都已访问过,所以回溯到 0。由于 0 的所有邻居都已访问过,因此搜索结束。

深度优先搜索 (DFS)由于每条边和每个顶点仅被访问一次,因此

dfs

方法的时间复杂度为o(|e| + |v|),其中|e|表示边数,|v | 顶点数量。 深度优先搜索的实现

上面代码中的dfs算法使用了递归。很自然地使用递归来实现它。或者,您可以使用堆栈。

dfs(int v)

方法在 abstractgraph.java 中的第 164-193 行实现。它返回 tree 类的实例,以顶点 v 作为根。该方法将搜索到的顶点存储在列表searchorder(第165行)中,将每个顶点的父级存储在数组parent(第166行)中,并使用isvisited数组来指示某个顶点是否已被访问(第166行) 171)。它调用辅助方法 dfs(v,parent, searchorder, isvisited) 来执行深度优先搜索(第 174 行)。在递归辅助方法中,搜索从顶点

u

开始。 u 在第 184 行添加到 searchorder 并标记为已访问(第 185 行)。对于u的每个未访问的邻居,递归调用该方法来执行深度优先搜索。当访问顶点e.v时,e.v的父顶点存储在parent[e.v]中(第189行)。当访问连通图或连通组件中的所有顶点时,该方法返回。

深度优先搜索 (DFS)下面的代码给出了一个测试程序,显示上图中从芝加哥开始的图的 dfs。从芝加哥出发的dfs示意图如下图所示

public class TestDFS {    public static void main(String[] args) {        String[] vertices = {"Seattle", "San Francisco", "Los Angeles", "Denver", "Kansas City", "Chicago", "Boston", "New York", "Atlanta", "Miami", "Dallas", "Houston"};        int[][] edges = {                {0, 1}, {0, 3}, {0, 5},                {1, 0}, {1, 2}, {1, 3},                {2, 1}, {2, 3}, {2, 4}, {2, 10},                {3, 0}, {3, 1}, {3, 2}, {3, 4}, {3, 5},                {4, 2}, {4, 3}, {4, 5}, {4, 7}, {4, 8}, {4, 10},                {5, 0}, {5, 3}, {5, 4}, {5, 6}, {5, 7},                {6, 5}, {6, 7},                {7, 4}, {7, 5}, {7, 6}, {7, 8},                {8, 4}, {8, 7}, {8, 9}, {8, 10}, {8, 11},                {9, 8}, {9, 11},                {10, 2}, {10, 4}, {10, 8}, {10, 11},                {11, 8}, {11, 9}, {11, 10}        };        Graph graph = new UnweightedGraph(vertices, edges);        AbstractGraph.Tree dfs = graph.dfs(graph.getIndex("Chicago"));        java.util.List searchOrders = dfs.getSearchOrder();        System.out.println(dfs.getNumberOfVerticesFound() + " vertices are searched in this DFS order:");        for(int i = 0; i < searchOrders.size(); i++)            System.out.print(graph.getVertex(searchOrders.get(i)) + " ");        System.out.println();        for(int i = 0; i < searchOrders.size(); i++)            if(dfs.getParent(i) != -1)                System.out.println("parent of " + graph.getVertex(i) + " is " + graph.getVertex(dfs.getParent(i)));    }}

在此 dfs 顺序中搜索 12 个顶点:

芝加哥 西雅图 旧金山 洛杉矶 丹佛

堪萨斯城 纽约 波士顿 亚特兰大 迈阿密 休斯顿 达拉斯
西雅图的父母是芝加哥
旧金山的父母是西雅图
洛杉矶的父母是旧金山
丹佛的父母是洛杉矶
堪萨斯城的父母是丹佛
波士顿的父母是纽约
纽约的父母是堪萨斯城
亚特兰大的父母是纽约
迈阿密的父母是亚特兰大
达拉斯的父母是休斯顿
休斯顿的父母是迈阿密

深度优先搜索 (DFS) dfs的应用

深度优先搜索可以用来解决很多问题,例如:

检测图是否连通。从任意顶点开始搜索图。如果搜索到的顶点数与图中的顶点数相同,则该图是连通的。否则,图形未连接。检测两个顶点之间是否存在路径。寻找两个顶点之间的路径。找到所有连接的组件。连通分量是最大连通子图,其中每对顶点都通过路径连接。检测图中是否存在环路。在图中找到一个循环。找到哈密顿路径/循环。图中的哈密尔顿路径是只访问图中每个顶点一次的路径。 哈密尔顿循环 只访问图中的每个顶点一次,然后返回到起始顶点。前六个问题可以使用abstractgraph.java中的dfs方法轻松解决。要找到哈密顿路径/循环,您必须探索所有可能的 dfs,以找到通向最长路径的路径。哈密​​顿路径/循环有很多应用,包括解决著名的骑士之旅问题。

以上就是深度优先搜索 (DFS)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/498425.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
“BOSS直聘崩了”冲上热搜,官方回应:短时间刷新所致
上一篇 2025年11月8日 19:10:48
tp5.0 的模型类型转换问题
下一篇 2025年11月8日 19:10:55

相关推荐

  • python爬虫框架制作教程

    构建 Python 爬虫框架:创建项目目录和虚拟环境;安装依赖项;建立框架结构(core、extractors、pipelines、utils);开发核心爬取逻辑;创建数据提取器;构建数据处理管道;编写实用函数;组装框架;根据目标网站编写配置文件;调用爬虫进行数据提取和处理。 Python 爬虫框架…

    2025年12月13日
    000
  • python爬虫代码新手教程

    网络爬虫是一种自动遍历和下载网页内容的软件。Python爬虫因语法简单、生态系统丰富和跨平台运行而备受推崇。对于初学者,准备工作包括安装Python 3.x、requests和BeautifulSoup。编写爬虫代码需要发送HTTP请求、解析HTML页面,并从中提取所需信息。常见问题包括403 Fo…

    2025年12月13日
    000
  • 爬虫机器人修理视频教程

    通过视频教程修复爬虫机器人需要以下步骤:识别故障症状。查找与爬虫机器人型号和故障症状相关的视频教程。观看教程,了解修复过程。准备工具并清除工作区域。逐个步骤按照视频教程中的说明修复。测试修复,确保爬虫机器人正常工作。定期维护爬虫机器人,防止故障。 爬虫机器人修复视频教程 问题: 如何通过视频教程修复…

    2025年12月13日
    000
  • 爬虫与搜索引擎视频教程

    爬虫是搜索引擎的重要组成部分,负责抓取网页内容,而搜索引擎视频教程则指导用户如何使用爬虫信息,协同作用体现在以下方面:爬虫抓取视频页面,创建相关信息的庞大索引。视频教程教育用户如何利用该索引搜索相关视频。SEO 优化提高视频在搜索结果中的排名。提高视频内容可见性,吸引用户,生成潜在客户。 爬虫与搜索…

    2025年12月13日
    000
  • 爬虫视频教程哪家好一点

    学习爬虫技术推荐视频教程:Coursera:密歇根大学的 Python 网络爬虫教程全面介绍基本原理、工具库和高级技巧;斯坦福大学的网络爬虫教程由专家教授,深入讲解技术和实践。Udemy:从零开始掌握网络爬虫教程适合初学者,逐步讲解概念和实践;Python 网络爬虫:从初学者到高级教程提供系统性课程…

    2025年12月13日
    000
  • httpclient 爬虫视频教程

    使用 HttpClient 编写爬虫视频教程的步骤包括:1. 导入 HttpClient 库;2. 创建 HttpClient 实例;3. 创建 HttpGet 请求对象;4. 执行请求并获取响应;5. 检查响应状态;6. 获取响应实体;7. 保存视频。提示:对于大型视频文件,可考虑流式传输;使用日…

    2025年12月13日
    100
  • 爬虫视频下载视频教程

    本教程提供了下载视频的六个步骤:1. 准备工作;2. 解析HTML;3. 获取视频URL;4. 下载视频;5. 保存视频;6. 完成。 爬虫视频下载教程 1. 准备工作 确保有稳定的网络连接。安装 Python 和 необходимые 库(如 requests、BeautifulSoup)。确定…

    2025年12月13日
    000
  • python爬虫网站视频教程

    Python爬虫是一种自动抓取网站数据的脚本,可以提取视频、文本、图像等文件。使用Python爬虫抓取网站视频,需要以下步骤:选择视频爬虫库,如BeautifulSoup、Selenium或lxml。获取目标网站URL。使用爬虫库编写代码提取视频链接。使用urllib或requests库下载并保存视…

    2025年12月13日
    000
  • python爬虫技术视频教程

    Python爬虫是一种使用Python构建的程序,用于从互联网上自动收集数据。学习Python爬虫的优势包括:数据收集:获取大量数据用于分析和研究。自动化任务:节省重复性任务的时间和精力。信息提取:从网页中获取结构化数据。数据科学:为机器学习模型提供大量数据。 Python爬虫技术视频教程 什么是P…

    2025年12月13日
    100
  • python爬虫教程全套教程

    网站爬虫自动从互联网抓取数据的软件。Python因其易用性、丰富的库和庞大社区而被广泛用于爬虫开发。Python爬虫教程提供了分步指南,包括:安装环境、发送HTTP请求、解析HTML、提取数据、存储数据、处理分页、避免检测以及高级技术的使用,如Scrapy框架、异步爬虫和分布式爬虫。 Python爬…

    2025年12月13日
    000
  • python爬虫教程爬虫的基本流程

    爬虫是一种自动工具,用于从网络上获取信息。其基本流程包括:1. 初始化 URL 队列;2. 抓取网页并提取数据;3. 分析和存储数据;4. 发现新 URL 并重复步骤 2-4;5. 存储有价值的数据。通过并发抓取、使用代理或分布式爬虫、尊重 robots.txt 协议以及根据网站结构定制爬虫策略,可…

    2025年12月13日
    000
  • python爬虫代码教程网站

    Python 爬虫代码教程网站:教程点:提供全面教程,涵盖基础和高级概念。博客和文档:比如 Beautiful Soup 和 Scrapy 文档,以及 Python 爬虫博客,提供技巧、教程和示例代码。选择教程时考虑的因素:技能水平项目目标教学风格使用教程的提示:仔细阅读教程。练习示例代码。从简单项…

    2025年12月13日
    000
  • python爬虫教程requests使用

    Requests库在Python爬虫中的应用:使用Requests库请求数据:导入库:import requests创建会话对象:session = requests.Session()发送请求:response = session.get(‘URL’)处理响应:响应对象:r…

    2025年12月13日
    000
  • python爬虫自学教程视频

    Python 爬虫是一种用 Python 编写的数据抓取程序,用于从网页提取数据。其好处包括自动化数据收集、从多种来源收集数据以及分析大批量数据。入门步骤包括安装 Python、爬虫库 Requests 和 BeautifulSoup。第一个 Python 爬虫示例演示了如何抓取和提取标题信息。进阶…

    2025年12月13日
    200
  • python爬虫自动下载教程

    Python 爬虫可用于自动下载文件,具体步骤如下:安装 requests 库导入库并指定下载 URL发送 GET 请求并检查状态码获取响应内容并保存到文件中 Python 爬虫自动下载教程 引言Python 爬虫是一种有用的工具,它可以自动从网站提取数据。本文将详细介绍如何使用 Python 爬虫…

    2025年12月13日
    200
  • python爬虫100例教程

    Python爬虫是一种自动化数据提取工具,广泛应用于各个领域。本教程由100个示例组成,涵盖了爬虫的基础、解析、数据提取、高级技巧和实战项目,适合初学者和中级开发者学习。例如,示例25展示了如何使用BeautifulSoup库解析HTML页面。 Python爬虫100例教程:入门到精通 什么是Pyt…

    2025年12月13日
    000
  • 爬虫框架scrapy教程交流 python爬虫scrapy框架教程交流

    Scrapy是一个Python爬虫框架,提供强大的功能来轻松创建高效可靠的爬虫。学习Scrapy的最佳方式之一就是与开发者交流,可以通过在线社区、论坛等平台与其他开发者分享经验、寻求帮助和讨论相关主题。对于希望深入学习Scrapy的开发者,有许多推荐的教程和资源,涵盖了Scrapy的基础知识,如创建…

    2025年12月13日
    000
  • python爬虫框架scrapy教程

    Scrapy是一个功能强大的Python网络爬虫框架,用于从网站提取数据。安装后,可以通过创建项目、编写爬虫、配置设置和运行爬虫来实现网络爬取。使用Scrapy,可以提取数据并将其存储在CSV文件或数据库中。 Python爬虫框架Scrapy教程 简介 Scrapy是一个功能强大的Python爬虫框…

    2025年12月13日
    000
  • scrapy爬虫框架教程交流 爬虫教程scrapy框架交流

    scrapy是一个强大的Python爬虫框架,用于从网站中提取数据。它的特点包括高性能、灵活性、可扩展性和社区支持。scrapy框架由引擎、调度器、下载器、分析器和管道等组件组成。使用scrapy,可以通过以下步骤进行爬取:定义爬虫类、定义解析规则、定义管道和运行爬虫。优点包括易于使用、高效、可维护…

    2025年12月13日
    000
  • scrapy爬虫框架使用教程

    Scrapy是一个Python网络爬虫框架,用于从网站提取数据。它可以通过自动访问和解析网页来实现,并易于定制和扩展。Scrapy的基本组成部分包括:项目:Scrapy项目包含爬虫和提取数据的设置。蜘蛛:负责从网页中提取数据的组件。解析器:提取网页数据并存储到Item中的组件。 Scrapy爬虫框架…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信