更进一步!可视化一切递归算法!

news2024/11/18 15:41:47

学算法认准 labuladong

后台回复课程查看精品课

点击卡片可搜索文章👇

在线学习网站:

https://labuladong.gitee.io/algo/

133e6b0b4248bc11c80beb5e06cb6430.png

上次我发布了算法代码可视化功能,适配了我的网站和我的系列插件,最近我修复了一些 bug 并增加了一些功能优化。

其中最重要的一个更新是支持了递归算法的可视化,而且可视化的方式可以说是我之前系列文章所阐述的算法思想的的具体实现,我真的动手把抽象的思想给展示出来了,绝对可以帮助你更好的理解算法的本质!

在我的网站首页可以快速体验:

https://labuladong.gitee.io/algo/

https://labuladong.github.io/algo/

我先简单梳理一下我之前的文章对递归算法的阐述,然后再介绍一下这次的可视化更新为什么能帮助你更好的理解递归算法。

基础梳理

首先,我在 我的算法学习心得 中说过,算法的本质是穷举,而大家普遍认为比较难的算法,比如回溯算法、动态规划、DFS 算法等,它们的本质也是穷举,住不过需要借助递归的形式,或者说是递归的思想,来实现穷举。

关于这些比较抽象的递归算法,我在 DFS/BFS/回溯/动归算法的融会贯通 中用二叉树这种简单的基本结构把它们都穿起来了,我把二叉树系列算法分为两种解题思路:

一种是分解问题的思维模式,这种思路代表着动态规划、分治算法等;另一种是遍历问题的解题思维模式,这种思路代表着回溯算法、DFS 算法等

反过来,在用动态规划/回溯算法等比较复杂的问题时,我也会教大家用树的视角来理解算法,把递归函数理解成递归树上的一个指针,比如 回溯算法秒杀排列/组合/子集问题 中我画出了全排列问题的回溯树:

73b0d11553652b402456c1318fddd8bc.jpeg

在 动态规划算法核心框架 中,我画出了斐波那契问题的递归树:

c6863f3eed66858b391a21e013e94d9c.jpeg

只要把递归树画出来,就可以很直观地理解这些递归算法:回溯算法就是在遍历一棵多叉树,并收集叶子节点的值;动态规划就是在分解问题,用子问题的答案来推导原问题的答案

有了这些基础,我们再来看看这次的可视化更新。

递归算法的可视化

之前的可视化功能只支持数据结构的可视化,比如说二叉树、链表、数组等。而函数的递归过程是通过递归堆栈的可视化来体现的:

e4fc1d644361c87a867ca73a168df73e.jpeg

而现在我可以将递归函数的递归过程抽象成递归树,并且这棵递归树会随着算法的执行动态生长,这样就可以很直观地看到递归算法的执行过程了:

9fdedb16eeab6a495ff5613440e9860d.gif

而且值得一提的是,这棵递归树上每个节点的信息都是被我精心设计的

比如说对于动态规划算法这种分解问题的思路,我会把每个节点的值显示为「状态」,当递归节点对应的递归调用结束之后,该节点也会记录递归调用的结果,这样就可以很直观地理解问题是如何分解的,以及子问题的答案是如何推导出原问题的答案的。

举个具体的例子,比如说 动态规划算法核心框架 中讲的斐波那契问题,我们把fib(n)的参数n作为这个问题的「状态」,那么节点的值就是每次递归调用的这个n的值。

当整个算法结束之后,我们就可以看到这棵递归树的完整结构,鼠标移到一个节点上,还可以显示该次递归调用的具体返回值:

f9760be5766012416a44281de2fd5f2a.jpeg

这样,我们就可以很直观地看到问题的分解以及通过子问题的答案是推导原问题答案的过程。

另外,你也可以直观地看到备忘录剪枝的效果,比如这是不带剪枝逻辑的斐波那契算法:

cbb60ed2f3f7b4ee65ff0879cc79d71b.jpeg

这是带备忘录剪枝逻辑的斐波那契算法:

5cff972fc950487aefd69ea634cd1d63.jpeg

是不是发现树上的节点明显少了很多?这就是备忘录剪枝的效果,直不直观?学习算法的门槛都给你降到这份上了,再说自己学不会,理解不了那真的是借口了吧~

当然,斐波那契这个问题很简单,我只是拿来举例方便大家理解。我的网站上的所有动态规划题目都支持了类似的可视化,因为正如前文 DFS/BFS/回溯/动归算法的融会贯通 所说,它们本质都是树。

再看看回溯算法,因为回溯算法是遍历的思路,所以我会把每个节点的值显示为「路径」,记录遍历到当前节点经过的路径。比如说 回溯算法秒杀排列/组合/子集问题 中的全排列问题,这是算法最终执行完成的样子:

416119654f30843bc0b2eb9eaeb12f58.jpeg

可以看到,这棵递归树上的每个节点都记录了从根节点到当前节点的路径,每个叶子节点就是一个全排列的结果,和我之前画的回溯树一模一样:

2fcccacbf6589607e2336d51fa6be092.jpeg

其实我觉得只要画出递归树已经比较好理解了,但可视化面板是可交互的,执行到的代码会高亮显示,你可以结合着代码的执行,更直观地理解回溯算法的遍历过程。

课程涨价预告

目前这个可视化功能可以在我的网站以及配套刷题插件上使用。我的课程已经和系列刷题插件整合,现在正在整合可视化功能,整合完成之后我的课程会涨价,所以这里提前通知一下,如果课程的内容是你需要的,现在赶紧购买,两顿饭钱,绝对物超所值。

目前我亲自制作了两门课程,分别是《数据结构精品课》和《二叉树(递归)专题课》,前者主要带你了解常用数据结构的实现原理,且手把手带你解决相关的算法技巧;后者主要带你训练递归思维,按照 DFS/BFS/回溯/动归算法的融会贯通 总结的二叉树的两种思维模式,手把手带你运用这两种思想解决所有二叉树的题目。

具体介绍可扫码查看:

b660733fad86e3d2e5699a33c68825d9.jpeg

另外,有了这个递归算法可视化的功能,我也在着手制作一个动态规划/回溯算法的专题课,制作完成会通知大家,购买其他课程的读者肯定会有优惠,大家敬请期待。

------------------

最后推广一下,我的朋友轩辕之风(公众号「编程技术宇宙」号主)最近出了一本新书《趣话计算机底层技术》,记得多年前我学习 docker 的时候还看过轩辕大佬的文章,非常有趣易懂:

2e3904f1fe9a357e0f8166925fb598d8.png

现在轩辕大佬把他的系列文章整理成书了,新书打折,对技术底层原理感兴趣的读者赶紧入手!

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

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

相关文章

windows系统根据端口查询pid并结束进程

用管理员权限打开命令指示符,输入命令: 1、查看被占用端口所对应的 PID netstat -aon|findstr “端口号” 2、查看指定PID的进程 tasklist|findstr ”57672” 3、结束进程 taskkill -pid 进程号 -f

Unity VR 开发教程:Meta Quest 一体机开发 (二)混合现实 MR 透视 Passthrough 环境配置

文章目录 📕教程说明📕配置透视的串流调试功能📕第一步:设置 OVRManager📕第二步:添加 OVRPassthroughLayer 脚本📕第三步:在场景中添加虚拟物体📕第四步:删除…

c++摘花生

先看题目: Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。 地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘…

html前端输入框模糊查询2

1、一个页面内多个模糊查询情况&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width, initial-scale1.0, user-scalable0, minimum-scale1.0, maximum-…

网络安全合规-渗透工程师

首先放一张渗透工程师薪资招聘。 各类网络空间人才缺口高达97%&#xff0c;专业人才供不应求。市场环境对网络安全人才求贤若渴&#xff0c;渗透测试工程师尤为紧俏&#xff0c;企业高薪求才&#xff0c;薪资一涨再涨&#xff01; 工资高&#xff0c;待遇好&#xff0c;但是有…

大模型浪潮下的平台、框架、AI编译器和芯片架构丨2023智源大会精彩回顾

导读 在大模型时代&#xff0c;应该如何组织AI系统使其能力与市场需求对齐&#xff0c;是底层的AI工程师需要不断思考和探讨的话题。围绕这一问题&#xff0c;在2023智源大会AI系统分论坛上&#xff0c;从事AI框架开发、芯片研发和AI编译器优化的专家汇聚在一起&#xff0c;共同…

广告行业中那些趣事系列63:使用chatgpt类大模型进行文本分类任务

导读&#xff1a;本文是“数据拾光者”专栏的第六十三篇文章&#xff0c;这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇主要介绍了使用chatgpt类大语言模型进行文本分类任务&#xff0c;对于希望使用chatgpt类大语言模型上进行数据标注、文本分类和关键词抽取等…

debug调试高级用法

文章目录 前言一、如何给程序加断点,并调试二、开始调试1.断点查看2.查看所有断点,去掉断点,批量去断点3. 断点改值4. 断点条件 总结 前言 在开发调试中,如果你不会debug调试,一般情况下,就只能控制台打印,然后一遍一遍重启了,所有debug是必不可少的技能,尤其当遇到问题的时候…

xxl-job的实践

pom.xml文件导入xxl-job 包 <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>${xxl-job.version}</version></dependency><xxl-job.version>2.3.1</xxl-job.version> …

Android学习日志 二、Button组件调用函数

文章目录 Button组件调用函数配置代码By-Round Moon Button组件调用函数 Android Studio 版本:2022.2.1 patch 2 配置 接日志一的操作&#xff0c;我们创建一个空项目&#xff0c;名字可以自己起 等待构建完成后&#xff0c;我们创建一个模块 创建一个activity 在相应的x…

Spring Boot中RabbitMQ自动配置的介绍、原理和使用

Spring Boot中RabbitMQ自动配置的介绍、原理和使用 引言 RabbitMQ是一种高性能的消息队列系统&#xff0c;它支持多种消息协议和丰富的功能&#xff0c;如消息路由、消息确认、消息重试、死信队列等。在Spring Boot中&#xff0c;我们可以通过自动配置的方式来使用RabbitMQ。…

碳排放预测模型 | Python实现基于时间序列趋势外推的碳排放预测模型(线性趋势、指数趋势、平方趋势)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于时间序列趋势外推的碳排放预测模型(线性趋势、指数趋势、平方趋势) 源码设计 import pandas as pd import numpy as np import scipy

SpringBoot(三)SpringBoot热部署

在开发SpringBoot项目过程中&#xff0c;你有没有遇到如下的问题&#xff1a;每次修改java代码&#xff0c;都得重新run一下Application才会生效。起初我也遇到了这样的问题&#xff0c;但SpringBoot这种成熟的框架&#xff0c;怎么可能不支持热部署呢。本篇&#xff0c;我们就…

Ubuntu虚拟机文件系统挂了:Failure: File system check of the root filesystem failed

问题描述 太久不用虚拟机Ubuntu 20.04&#xff0c;就把虚拟机移动到了移动硬盘中&#xff0c;然后虚拟机挂了。准确地说是文件系统挂了。由于没有保护好现场&#xff0c;出错位置是一个/dev/xxx&#xff0c;提示Failure: File system check of the root filesystem failed。 …

10 DCT变换对灰度图像压缩(matlab程序)

1.简述 一、设计任务 1、在图像的变换和压缩中&#xff0c;常常用到离散余弦变换&#xff08;DCT&#xff09;。DCT变换用于图像的压缩实例。请在测试图像中验证你的结论。 2、请编程实现图像的真彩色增强。 3、通过直方图均衡化的方法实现图像的灰度变换&#xff0c;在测试…

threejs材质

个人博客地址: https://cxx001.gitee.io 前言 前面简单的介绍了材质&#xff0c;你已经了解到材质结合几何体就可以创建网格&#xff0c;网格对象才可以添加到Threejs渲染的场景中。材质就像物体的皮肤&#xff0c;决定了几何体的外表。如&#xff0c;几何体看起来是否像金属…

GPT模型训练实践

一、GPT模型解释 GPT 模型是 Generative Pretrained Transformers 的缩写&#xff0c;是一种先进的深度学习模型&#xff0c;旨在生成类人文本。GPT 的三个组成部分&#xff0c;即 Generative、Pre-Trained 和 Transformer&#xff0c;其解释如下&#xff1a; 生成&#xff1…

【CCF计算领域学术会议介绍:2024日程安排、CCF会议deadline汇总、2022年录用率】

CCF计算领域学术会议介绍&#xff1a;2024日程安排、CCF会议deadline汇总、2022年录用率 0、目录 1、2024日程安排及deadline汇总2、会议介绍及2022年录用率 1、2024日程安排及deadline汇总 1、Conference List 这个网站汇总了CCF学术会议2023及即将开启的2024学术会议&…

递归:探索问题的无限深度

引言&#xff1a; 在计算机科学中&#xff0c;有一种强大的概念叫做递归。它可以帮助我们解决各种复杂的问题&#xff0c;使代码更加简洁而优雅。递归是一种函数调用自身的技术&#xff0c;通过将问题分解成较小的子问题&#xff0c;以及逐步将其解决&#xff0c;从而达到解决整…

【前端】案例1 轮播图【HTML/CSS/JS】+JQ

引入JQ <script src"https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>CSS代码 /* 轮播图部分 */.two_content {width: 100%;height: 490px;position: relative;overflow: hidden;cursor: pointer;z-index: 1;}.bigimages {width: 10…