深度优先搜索(DFS)-蓝桥杯

news2024/9/28 23:32:04

一、搜索

  • 搜索是“暴力法”算法思想的具体实现。

  • 搜索是“通用”的方法。一个问题,如果比较难,那么先尝试一下搜索,或许能启发出更好的算法。

  • 技巧:竞赛时遇到不会的难题,用搜索提交一下,说不定部分判题数据很弱,得分了!

  • 搜索的基本思路:

  • [BFS] Breadth-First Search,宽度优先搜索,或称为广度优先搜索。

  • [DFS] Depth-First Search,深度优先搜索。

二、暴力法

  • 利用计算机强大的计算能力和存储能力,实现“暴力法”,把所有可能性都列举出来,一一验证,简单直接!

  • 暴力(蛮力)是有效的技术:

  1. 理论上,蛮力法可以解决可计算领域的各种问题。

  1. 蛮力法经常用来解决一些较小规模的问题。

  1. 对于一些重要的问题蛮力法可以产生一些合理的算法具备一些实用价值,而且不受问题规模的限制。

  1. 蛮力法可以作为某类问题时间性能的底限,来衡量同样问题的更高效算法。

  • 暴力的基本方法:

  1. 蛮力的基本方法——扫描。

  1. 关键——依次处理所有元素。

  1. 基本的扫描技术——遍历:

  1. 集合的遍历。

  1. 线性表的遍历

  1. 树的遍历

  1. 图的遍历

  • 非线性方程:指f(x)中含有三角函数、指数函数或其他超越函数。

  • 非线性方程,很难或者无法求得精确解。

  • 二分法是一种求解的方法。

三、老鼠走迷宫

  1. BFS:一群老鼠走迷宫

• 老鼠无限多。
• 在每个路口,都派出部分老鼠探索所有没走过的路。
• 走某条路的老鼠,如果碰壁无法前行,就停下。
• 如果到达的路口已经有别的老鼠探索过了,也停下。
• 所有的道路都会走到,而且不会重复。

------>广度优先、全面扩散、逐层递进。
  1. DFS:一只老鼠走迷宫

• 只有一只老鼠。
• 在每个路口,都选择先走右边 (当然,选择先走左边也可以),能走多远就走多远。
• 碰壁无法再继续往前走,回退一步,这一次走左边然后继续往下走。
• 能走遍所有的路,而且不会重复 (回退不算重复)。

------>深度优先、一路到底、逐层回退。

四、DFS访问示例

  • 设先访问左节点,后访问右节点,模拟老鼠走迷宫;

  • 访问顺序:EBADCGFIHI。

五、DFS的常见操作

  • DFS的代码比BFS更简短。

  • DFS的主要操作:

  • 时间戳

  • DFS序

  • 树深度

  • 子树节点数

  • 中序输出

  • 先序输出

  • 后序输出

六、DFS基础:递归和记忆化搜索

  • 形式上,递归函数是“自己调用自己”,是一个不断“重复”的过程。

  • 递归的思想,是把大问题逐步缩小,直到变成最小的同类问题的过程,而最后的小问题的解是已知的,一般是给定的初始条件。到达最小问题后,再“回溯”,把小问题的解逐个带回给更大的问题,最终最大问题也得到了解决。

  • 递归有两个过程递归前进、递归返回(回溯)。

  • 在递归的过程中,由于大问题和小问题的解决方法完全一样,那么大问题的代码和小问题的代码可以写成一样。

  • 一个递归函数,直接调用自己,实现了程序的复用。

七、例子:斐波那契数列

递推式: f(n) = f(n-1) + f(n-2)
即:前两个数相加得到下一个数。
要求:打印第20个数。
  1. 普通方法实现

  1. 递归方法实现

  • 函数fib(20)计算斐波那契数。

  • 递归过程:

递归前进: fib(20) = fib(19) + fib(18)

递归前进: fib(19) = fib(18) + fib(17)

递归前进: fib(18) = fib(17) + fib(16)

......

递归前进: fib(3) = fib(2) + fib(1)

到达终止条件: fib(2) = 1,fib(1) = 1

  • 回溯过程 :

递归返回: fib(3) = fib(2) + fib(1) =1+1=2

递归返回: fib(4) = fib(3) + fib(2) =2+1=3

......

递归返回: fib(20)=fib(19)+fib(18)=4181+2584=6765

  • 递归的次数:

递推和递归两种代码,结果一样,计算量差别巨大。

递推代码:一个for循环,计算20次。

递归代码: 计算第20个斐波那契数,共计算cnt = 13529次。

  • 为什么斐波那契的递归代码如此低效?

return fib(n-1) + fib(n-2)递归调用了自己2次,倍增。

计算fib(n)时,共执行了O(2的n次方)次递归。

不过,很多递归函数只调用自己一次不个额外增加计算量。

  1. 改进:记忆法

  • 递归的过程中做了重复工作,例如fb(3)计算了2次,其实只算1次就够了,为避免递归时重复计算,可以在子问题得到解决时,就保存结果,再次需要这个结果时,直接返回保存的结果就行了,不继续递归下去。

  • 这种存储已经解决的子问题结果的技术称为“记忆化(Memoization)”。

  • 记忆化是递归的常用优化技术。动态规划也常常用递归写代码,记忆化也是动态规划的关键技术。

  • 递归的关键问题:递归深度不能太大。

Python默认递归深度1000,如果递归深度太大,提示“maximum recursion depth exceeded in comparison”。

用sys.setrecursionlimit()设置递归深度。

常常有深度大于1000的递归题目。

八、DFS的代码框架

  • DFS的框架,请在大量编码的基础上,再回头体会这个框架的作用。

  • 在DFS框架中,最让初学者费解的是第10行和第12行。

  • 第10行的used[i] = 1,称为“保存现场”,或“占有现场”。

  • 第12行的used[i] = 0,称为“恢复现场”,或“释放现场”。

九、例子:DFS搜索和输出所有路径

十、总结:路径问题BFS和DFS

  • 搜所有的路径,应该用DFS;如果只搜最短路径,应该用BFS。

  • 在一张图上,从起点到终点的所有路径数量是一个天文数字,读者可以用上面的代码试试一个8x8的图,看看路径总数是多少。但是搜最短的路径就比较简单,并不需要把所有路径搜出来之后再比较得到最短路,用BFS可以极快地搜到最短路。DFS适合用来处理暴力搜所有情况的题目。

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

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

相关文章

8 Flutter UI 之 路由

一 基本路由路由就是页面的跳转,通过Navigator组件管理路由导航Flutter 提供了两种方式 基本路由和命名路由Container(child: Center(child: Column(children: [ElevatedButton(onPressed: () {// 跳转到购物车界面Navigator.of(context).push(MaterialPageRoute(bu…

教你快速学会画动漫人物表情

动漫人物表情画法,3分钟教你快速学会画表情,快来跟我一起零成本学板绘吧!咱们的免费板绘系列教程又来啦,今天教大家的板绘技能是什么呢?今天的板绘学习教程来教你如何画动漫女生的表情! 板绘动漫女生的表情…

Instruction Tuning:无/少样本学习新范式

作者 | 太子长琴 整理 | NewBeeNLP大家好,这里是NewBeeNLP。今天分享一种简单的方法来提升语言模型的 Zero-Shot 能力——指示(或指令)微调(instruction tuning) ,在一组通过指示描述的数据集上对语言模型微…

Nodejs和JavaScript的区别

ECMAScript 定义了语法,写javascript和nodejs都必须要遵守变量定义,循环、判断、函数原型和原型链、作用域和闭包、异步 可以看阮一峰老师写的ECMAScript 6 入门 即: 不能操作DOM,不能监听click事件,不能发送ajax请求不能处理…

Java LockSupport学习

面试题: 1、LockSupport为什么可以先唤醒线程后阻塞线程? 因为unpark()获得了一个凭证,之后再调用park()方法,就可以名正言顺的消费凭证,故不会阻塞。 2、LockSupport为什么唤醒两次后阻塞两次,但最终结果还会阻塞线程? 因为凭证…

Android 实现沉浸式全屏

前言 本文总结 Android 实现沉浸式全屏的实现方式。 实现沉浸式全屏 在一些需要全屏显示的场景下,比如玩游戏、看横屏视频的时候,内容全屏,占满窗口的体验会让用户更加沉浸到对内容的消费中,带来好的用户体验。 沉浸式显示具体来说就是如状态栏和导航栏部分的显示效果调…

C#:Krypton控件使用方法详解(第五讲) ——kryptonPanel

今天介绍的Krypton控件中的kryptonPanel,下面开始介绍这个控件的属性:首先要介绍的是这个控件的外观属性:Cursor属性:表示鼠标移动过这个控件的时候,鼠标的显示状态。具体属性值有哪些,如下图所示&#xff…

第一批因ChatGPT坐牢的人,已经上路了

大家好,我是 Jack。 ChatGPT 的火爆有目共睹,有人靠着它赚了第一桶金,也有人靠着它即将吃上第一顿牢饭。 任何一件东西的火爆,总会给一些聪明人带来机会。 艾尔登法环火的时候,一堆淘宝卖魂的;羊了个羊火…

动漫人物眼睛画法

本期的动漫绘画课程教大家来学习动漫人物眼睛画法,结合板绘软件从草稿开始一步步教你画出动漫人物眼睛,不用报动漫培训班也能学会,快来跟着本期的动漫人物眼睛画法教程试试吧! 动漫人物眼睛画法步骤教程: 注意&#x…

Linux内核实现完全公平调度算法

Linux 进程调度算法经历了以下几个版本的发展: 基于时间片轮询调度算法。(2.6之前的版本)O(1) 调度算法。(2.6.23之前的版本)完全公平调度算法。(2.6.23以及之后的版本) 完全公平调度算法基本原理 完全公平调度算法 体现在对待每个进程都是公平的,那么…

ChatGPT AI 人工智能 开发路径

ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI研发的聊天机器人程序,于2022年11月30日发布。 推荐以下几个AI 开发学习资源 一、GPTZero AI: GPTZero GPTZero 是普林斯顿大学学生 Edward Tian …

Java爬虫—WebMagic

一,WebMagic介绍WebMagic企业开发,比HttpClient和JSoup更方便一),WebMagic架构介绍WebMagic有DownLoad,PageProcessor,Schedule,Pipeline四大组件,并有Spider将他们组织起来&#xf…

MySQL中JSON数据类型详解

目录 概要及优点 JSON定义 JSON字段的增删改查操作 插入操作 查询操作 修改操作 删除操作 如何对JSON字段创建索引? 加索引查询结果分析: 不加索引查询结果分析: 使用JSON时的注意事项 概要及优点 JSON数据类型是MySQL5.7.8开始支持的…

FlowChartX/Diagramming for ActiveX 4.9.8 Crack

构建完美的图表 如果您的应用程序以 ActiveX 平台为目标,并且您需要实现图表功能,那么您所需要的只是 FlowChartX。它提供了创建、自定义和呈现流程图的所有功能。 ActiveX 图表库:分类图表 图 Diagramming for ActiveX该组件为您提供了一组…

浅谈C++函数重载

C相较于C语言来说,重载是一重大特性,让我们一起简单的回顾一下重载那些事 传送门函数重载是什么为什么有函数重载函数重载是如何实现的总结函数重载是什么 函数重载:是函数的一种特殊情况,C允许在同一作用域中声明几个功能相似的同名函数 这些同名函数的形参列表(参数个数or类…

day19_抽象类丶接口

由来 当我们声明一个几何图形类:圆、矩形、三角形类等,发现这些类都有共同特征:求面积、求周长、获取图形详细信息。那么这些共同特征应该抽取到一个公共父类中。但是这些方法在父类中又无法给出具体的实现,而是应该交给子类各自…

当遇到国外客户的问题,你解决不了的时候怎么办

对我来说,今年的这个春节假期有点长,差不多休了一个月。复工之后,截止目前做到了60万RMB的业绩,但是相较于往年,整体状态还是差了些。往年的春节,我都是随时待命的状态,整个春节天天坐于电脑前&…

JSP 和 JSTL

文章目录🍓摘要🍓一、JSP🍉1.1 JSP的基础语法🍫1.1.1 简介🍫1.1.2 依赖🍫1.1.3 注释🍫1.1.4 Scriptlet 脚本🍉1.2 JSP的指令标签🍫1.2.1 include 静态包含🍫1…

2023年数学建模美赛A题(A drought stricken plant communities)分析与编程

2023年数学建模美赛A题(A drought stricken plant communities)分析与编程 2023年数学建模美赛D题(Prioritizing the UN Sustainability Goals)分析与编程 特别提示: 1 本文介绍2023年美赛题目,进行深入分析…

台式计算机加固态硬盘,台式机添加固态硬盘教程_台式主机固态硬盘怎么安装-win7之家...

固态硬盘是用固态电子存储芯片阵列制成的硬盘,也是电脑中比较常见的内存硬件,有些用户在使用电脑时候,由于内存不足导致系统运行较卡的情况,往往会选择添加固态硬盘来解决,那么台式主机固态硬盘怎么安装呢?…