【算法学习】搜索算法之深度优先搜索

深度优先搜索

DFS

1.算法介绍

深度优先搜索(DFS)算法是一种用于遍历或搜索树或图的算法。它的基本思想是尽可能深地搜索图的分支,直到到达叶节点或无法再深入为止,然后回溯到前一个节点,继续探索其他分支。这种搜索策略可以确保图中的每个节点都被访问到,除非它是一个环。
深度优先搜索的实现通常使用递归或栈来实现。对于树或图的遍历,可以从根节点或任意节点开始,然后沿着某个分支深入搜索,直到达到叶节点或无法再深入为止。在这个过程中,需要记录已经访问过的节点,以避免重复访问。当一条路径搜索完成后,需要回溯到上一个节点,继续搜索其他分支。

2.算法原理

深度优先搜索(DFS)算法的原理主要基于图的遍历。给定一个图(可以是有向图或无向图),DFS从某个起始节点出发,尽可能深地搜索图的分支,直到达到叶节点或无法再深入为止。然后,它回溯到上一个节点,继续搜索其他未遍历的分支。这个过程反复进行,直到图中所有可达的节点都被访问过。
DFS使用栈(stack)这种数据结构来辅助实现。在搜索过程中,将当前访问的节点以及从起始节点到该节点的路径上的所有节点都放入栈中。当搜索到叶节点或无法再深入时,从栈中弹出当前节点,并回溯到上一个节点,继续搜索。
DFS的核心思想包括两个方面:
1.回溯(backtracking):当搜索到叶节点或无法再深入时,需要回溯到上一个节点,继续搜索其他未遍历的分支。这种走不通就退回再走的技术称为回溯法。满足回溯条件的某个状态的点称为“回溯点”。
2.剪枝(pruning):在搜索过程中,通过某些条件判断,提前终止对当前分支的搜索,以减少不必要的搜索。这种减小搜索树规模、尽早排除搜索树中不必要的分支的手段称为剪枝。
DFS的时间复杂度在最坏情况下为O(n!),其中n为图中节点的数量。这是因为对于每个节点,都可能有n种选择(即选择下一个要访问的节点),从而导致搜索树的规模达到n的阶乘。然而,在实际应用中,DFS通常能在较小的搜索空间内找到解,因此其平均时间复杂度往往低于最坏情况。

3.算法实现

下面是一个使用C语言实现的深度优先搜索(DFS)算法示例。在这个示例中,我们使用邻接矩阵来表示图,并使用递归来实现DFS。

#include <stdio.h>
#include <stdbool.h>#define MAX_VERTICES 100// 函数原型声明
void dfs(int graph[MAX_VERTICES][MAX_VERTICES], bool visited[], int v);int main() {
    // 示例图的邻接矩阵表示
    // 1 表示存在边,0 表示不存在边
    int graph[MAX_VERTICES][MAX_VERTICES] = {
        {0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
        {1, 0, 0, 1, 1, 0, 0, 0, 0, 0},
        {1, 0, 0, 0, 0, 1, 0, 0, 0, 0},
        {0, 1, 0, 0, 0, 1,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

inBuilder低代码平台新特性推荐-第十六期

各位友友们&#xff0c;大家好~今天来给大家介绍一下inBuilder低代码平台社区版中的系列特性之一 —— 构件热加载&#xff01; 01 概述 构件热加载指的是&#xff1a;构件代码修改后&#xff0c;无需重启应用&#xff0c;通过WebIDE的部署或发布工程后&#xff0c;即可正常调…

08-静态pod(了解即可,不重要)

我们都知道&#xff0c;pod是kubelet创建的&#xff0c;那么创建的流程是什么呐&#xff1f; 此时我们需要了解我们k8s中config.yaml配置文件了&#xff1b; 他的存放路径&#xff1a;【/var/lib/kubelet/config.yaml】 一、查看静态pod的路径 [rootk8s231 ~]# vim /var/lib…

代码的复用——Mixin使用例子

Mixin&#xff08;混入&#xff09;是一种在Sass和Vue.js等框架中常用的技术&#xff0c;用于分发和重用代码。以下是Sass和Vue.js中Mixin的使用举例。 在Sass中&#xff0c;Mixin允许你定义可以在整个样式表中重复使用的样式。以下是一个Sass中Mixin的使用例子&#xff1a; …

华为配置直连三层组网直接转发示例

华为配置直连三层组网直接转发示例 组网图形 图1 配置直连三层组网直接转发示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户接入WLAN网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff…

标题:从预编译到链接:探索C/C++程序的翻译环境全貌

引言 在软件开发的世界里&#xff0c;我们通常会遇到两种不同的环境——翻译环境与运行环境。今天&#xff0c;我们将聚焦于前者&#xff0c;深入剖析C/C程序生命周期中至关重要的“翻译环境”&#xff0c;即从源代码到可执行文件这一过程中涉及的四个关键阶段&#xff1a;预编…

三七互娱,顺丰24春招内推

三七互娱&#xff0c;顺丰24春招内推 ①三七互娱 【介绍】知名上市游戏企业&#xff0c;24届本科及以上可投递&#xff0c;使用内推码&#xff0c;面试快人一步&#xff01; 【岗位】美术设计类&#xff0c;运营类&#xff0c;游戏研发类&#xff0c;策划类&#xff0c;市场推广…

设备改造经历干扰处理

设备改造完了,终于松了口气。没过几天,客户打电话过来,刚松了的那口气立马又吊了起来。通过客户描述,感觉麻烦来了。 客户每台机器都用了4台伺服,国产某品牌的,之前就经常发生液压站压力变送器损坏、某个环节偶尔不工作等情况,通过增加滤波电路、分开走线等措施解决了。…

开发的软件如何在安卓市场上架

要在安卓市场上架开发的软件&#xff0c;你需要遵循一系列步骤来确保你的应用符合市场的要求和标准。以下是一个基本的上架流程&#xff1a; 1. 注册开发者账号 在Android安卓市场&#xff08;如Google Play Store&#xff09;上注册一个开发者账号。提供必要的信息&#xff…

LeetCode 算法题 (数组)存在连续3个奇数的数组

问题&#xff1a; 输入一个数组&#xff0c;并输入长度&#xff0c;判断数组中是否存在连续3个元素都是奇数的情况&#xff0c;如果存在返回存在连续3个元素都是奇数的情况&#xff0c;不存在返回不存在连续3个元素都是奇数的情况 例一&#xff1a; 输入&#xff1a;a[1,2,3…

数论 - 博弈论(Nim游戏)

文章目录 前言一、Nim游戏1.题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 2.算法 二、台阶-Nim游戏1.题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 2.算法 三、集合-Nim游戏1.题目描述输入格式输出格式数据范围输…

Python编程-使用OpenCV和Numpy库实现图片去水印(附代码)

目录 安装OpenCV和NumPy库 开始 读取图像 选取水印位置 删除指定位置的水印 去除并修复水印(完整代码) 优化修复方法 效果(标红区域是原水印位置) 注意 安装OpenCV和NumPy库 cv2是基于OpenCV的图像处理库,可以对图像进行腐蚀,膨胀等操作;Numpy这是一个强大的处理矩…

【C++】创建多级目录下的指定文件

文章目录 一、判断文件存在二、获取文件所在目录三、创建指定目录四、使用方法 一、判断文件存在 static bool exists(const std::string &pathname) {// 方法1 获取文件状态&#xff0c;若存在则可能获取成功&#xff0c;若不存在则一定失败struct stat st;if (stat(path…

React18原理: React核心对象之ReactElement对象和Fiber对象

React中的核心对象 在React应用中&#xff0c;有很多特定的对象或数据结构.了解这些内部的设计&#xff0c;可以更容易理解react运行原理列举从react启动到渲染过程出现频率较高&#xff0c;影响范围较大的对象&#xff0c;它们贯穿整个react运行时 如 ReactElement 对象如 Fi…

美易平台:力拓2023年全年财报分析

力拓&#xff08;Rio Tinto&#xff09;是一家全球知名的矿业公司&#xff0c;其2023年全年财报显示&#xff0c;公司取得了可喜的业绩。根据公布的数据&#xff0c;力拓2023年全年基础盈利达到118亿美元&#xff0c;略高于预估的116.6亿美元。每股末期股息为2.58美元&#xff…

IO 作业 24/2/21

1、使用多线程完成两个文件的拷贝&#xff0c;第一个线程拷贝前一半&#xff0c;第二个线程拷贝后一半&#xff0c;主线程回收两个线程的资源 #include <myhead.h> //定义分支线程1 void *task1(void *arg) {int fdr-1;//只读打开被复制文件if((fdropen("./111.txt…

2024光伏展

2024年光伏展是一个专业的光伏行业展览会&#xff0c;旨在展示最新的光伏技术和产品&#xff0c;并促进光伏行业的发展和合作。 该展览会预计将吸引来自全球各地的光伏制造商、供应商、投资者和专业人士。参展的公司将有机会展示他们的最新产品和技术&#xff0c;与其他行业领导…

HTTP协议要点总结

一、什么是 HTTP 协议 1. 超文本传输协议 (HTTP &#xff0c; HyperText Transfer Protocol) 是互联网上应用广泛的一种网络协议。 是工作在 tcp/ip 协议基础上的 , 所有的 WWW 文件都遵守这个标准。 2. http1.0 短连接 http1.1 长连接 3. http 是 TCP/IP 协议的一个…

react实现转盘抽奖功能

看这个文章不错&#xff0c;借鉴 这个博主 的内容 样式是背景图片直接&#xff0c;没有设置。需要的话应该是 #bg { width: 650px; height: 600px; margin: 0 auto; background: url(turntable-bg.jpg) no-repeat; position: relative; } img[src^"pointer"] {positi…

旁门左道:借助 HttpClientHandler 拦截请求,体验 Semantic Kernel 插件

前天尝试通过 one-api dashscope(阿里云灵积) qwen(通义千问)运行 Semantic Kernel 插件&#xff08;Plugin&#xff09; &#xff0c;结果尝试失败&#xff0c;详见前天的博文。 今天换一种方式尝试&#xff0c;选择了一个旁门左道走走看&#xff0c;看能不能在不使用大模型…

马斯克称首位受试者可凭思维操控鼠标;字节低调推出视频模型丨 RTE 开发者日报 Vol.148

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…