DFS 算法:记忆化搜索

news2024/9/21 1:50:56

在这里插入图片描述

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页

往 {\color{Red} {\Huge 往} } 期 {\color{Green} {\Huge 期} } 文 {\color{Blue} {\Huge 文} } 章 {\color{Orange} {\Huge 章}}


此系列更新频繁,求各位读者点赞
关注我可以了解更多内容哦
偷偷告诉你,我正在冲 1100 粉 {\color{Gray} {\small 偷偷告诉你,我正在冲1100粉} } 偷偷告诉你,我正在冲1100
你们有什么想了解的可以发在评论区,我会仔细的看 {\color{Gray} {\small 你们有什么想了解的可以发在评论区,我会仔细的看} } 你们有什么想了解的可以发在评论区,我会仔细的看
1100 粉时我会抓几个做文章 {\color{Gray} {\small1100粉时我会抓几个做文章} } 1100粉时我会抓几个做文章


目录

  • 今天我们学什么
  • 例题
    • 斐波那契数列
      • 题目描述
      • 题目输入
      • 题目输出
      • 样例
        • 样例 1
          • 输入
          • 输出
    • 递推做法
    • 递归
  • 总结

今天我们学什么

今天我们要学习的是——记忆化搜索!
这是一种以空间换时间的算法,能有效提高效率
我们将会以一道“简单”的题入手,带你了解这个“有趣”的算法

例题

那么例题就是——斐波那契数列!
题目如下

斐波那契数列

题目描述

有一种兔子,出生后一个月就可以长大,然后再过一个月一对长大的兔子就可以生育一对小兔子且以后每个月都能生育一对。
现在,我们有一对刚出生的这种兔子,那么,第n个月时,我们会有多少对兔子呢?
假设所有的兔子都不会死亡。

题目输入

输入仅一行,包含一个自然数n。 n<=46

题目输出

输出仅一行,包含一个自然数,即第n个月时兔子的对数。

样例

样例 1
输入
5
输出
5

递推做法

我知道你想怎么做,这样呗

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll f[50];
int main() {
	int n;
	cin >> n;
	f[1] = f[2] = 1;  // 初始化
	for (int i = 3; i <= n; i++) {
		f[i] = f[i - 1] + f[i - 2];
	}
	cout << f[n];
	return 0;
}

没错,这种代码效率高,是做这道题的不二之选
但是,我们想要递归的代码

递归

此时,作为OIer / coder的你 打出了GG 打出来了一下的代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;

ll f(int x) {
	if (x == 1 || x == 2) {
		return 1;    // 若 x 为 1 或者 2 ,则返回 1
	}
	return f(x - 1) + f(x - 2);
}
int main() {
	int n;
	cin >> n;
	cout << f(n);
	return 0;
}

此时你看到了满屏的
在这里插入图片描述
这是为什么呢?
我们来画一颗搜索树(以5为例)
请添加图片描述

此时,我们可以发现
有些地方重复了!
请添加图片描述
我们此时为了快,要努力去把重复部分的计算次数变成1次而不是多次
我们可以在此处添加一个ans数组来记忆状况,这就是记忆化搜索,具体如下(需要自行理解):

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll ans[50];
ll f(int x) {
	if (x == 1 || x == 2) {
		return 1;     // 若 x 为 1 或者 2 ,则返回 1
	}
	if (ans[x]) {
		return ans[x];   // 若 ans[x] 已经计算,则直接返回 ans[x]
	}

	return ans[x] = f(x - 1) + f(x - 2);  
	/*
	上面的一行代码使用了简写,也可以写作如下代码
	
	ans[x] = f(x - 1) + f(x - 2);
	return ans[x];
	
	上面的更加简洁,下面的更加容易理解
	*/
}
int main() {
	int n;
	cin >> n;
	cout << f(n);
	return 0;
}

怎么样,记忆化搜索是不是很简单呢?

总结

以下内容使用了AI大模型

记忆化搜索是一种以空间换时间的算法,用于优化递归中的重复计算。通过建立一个记忆数组,将已经计算过的结果保存起来,下次需要计算时直接查询数组,避免重复计算。记忆化搜索可以有效提高算法的效率,特别适用于递归问题。

在记忆化搜索中,需要注意以下几点:
- 在递归函数中添加记忆数组,用于保存已经计算过的结果;
- 在递归函数中,先查看记忆数组中是否已经有计算好的结果,若有则直接返回,若无则进行计算;
- 在计算完成后,将结果保存到记忆数组中;
- 主函数中调用递归函数,并输出结果。

记忆化搜索的实现步骤如下:
1. 创建记忆数组,大小与递归函数的参数范围相对应;
2. 在递归函数中,先检查记忆数组是否有计算好的结果,若有则直接返回结果;
3. 若记忆数组中没有计算好的结果,则进行计算,并将结果保存到记忆数组中;
4. 在主函数中调用递归函数,并输出结果。

记忆化搜索的优点是能够避免重复计算,提高算法效率。缺点是需要额外的空间来保存计算结果。

记忆化搜索在解决递归问题时非常有用,可以大大提高算法的效率。在实际应用中,可以根据问题的特点和递归深度来决定是否使用记忆化搜索。

再见!记得关注我哦

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

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

相关文章

视频号小店:微信生态下的新零售革命者

在数字化浪潮的席卷之下&#xff0c;微信视频号凭借其独特的社交基因和庞大的用户群落&#xff0c;正悄然崛起为新零售战场上的新晋强者。特别是视频号小店体系的创立&#xff0c;为商家打造了一个集商品展现、交易促进与营销策略部署于一体的综合运营平台&#xff0c;实现了业…

网络安全中的人工智能应用

1. 引言 随着网络攻击的复杂性和频率不断增加&#xff0c;传统的安全防护措施逐渐难以应对这些威胁。人工智能&#xff08;AI&#xff09;作为一种变革性的技术&#xff0c;正在逐步成为增强网络安全的重要工具。AI通过自动化、智能化的方式&#xff0c;可以有效提高威胁检测、…

【JAVA基础】多态

文章目录 多态向上转型练习题 多态 父类的引用指向子类的对象 public class A {public String name;public int age;public void run(){ //该run()方法被覆盖System.out.println("a跑的快");}public void eat(String name){System.out.println(name"吃的很多&…

从零到一,我的AI绘画赚钱之旅:准大一新生暑假自学成才,月入学费不是梦!

大家好&#xff0c;我是即将步入大学校园的准大一新生。在这个漫长的暑假里&#xff0c;我决定学习一门新技术&#xff0c;充实自己。在一次网上冲浪的过程中&#xff0c;我偶然发现了AI绘画这个神奇的世界。以下是我在暑假期间学习AI绘画的经历&#xff0c;以及我是如何通过它…

缓存之Tair

介绍 ​ 在Tair出现之前的很长一段时间里&#xff0c;像redis、memcache这些知名NoSql数据库是不支持分布式的&#xff0c;在这样的背景下&#xff0c;由淘宝网自主开发并在2010.6开源的一个高性能、高扩展、高可靠分布式缓存&#xff0c;类似map的key/value结构&#xff0c;在…

C#实现数据采集系统-数据反写(3)ModbusTcp写入数据模块开发

写入报文分析 ModbusTcp报文详细解析见 ModbusTCP协议报文解析 写入常用的四个功能码&#xff0c;线圈 05,15&#xff08;0x0F&#xff09;,寄存器06,16&#xff08;0x10&#xff09; 详细报文如下&#xff1a; //00 01 00 00 00 06 FF 05 00 01 FF 00 写单个线圈 //00 01 …

【人工智能】AI虚拟主播制作初体验:生成数字人到视频创作全流程

文章目录 &#x1f4af;AI虚拟主播&#x1f4af;使用AI绘画工具生成数字人借助GPT生成数字人所需的提示词方案一&#xff1a;使用Midjourney生成数字人方案二&#xff1a;使用TensAI生成数字人补充方案三&#xff1a;在D-ID内直接生成数字人 &#x1f4af;使用D-ID生成数字人视…

CS1.5快捷键

《黑神话悟空》玩不起&#xff0c;玩起了23年前的cs1.5 B11&#xff1a;USP(警察自带手枪&#xff09; B12&#xff1a;Glock18(匪徒自带手枪) B13&#xff1a;Desert Eagle&#xff08;沙漠之鹰&#xff09; B14&#xff1a;P-228 B15&#xff1a;Dual Berettas&#xff08;匪…

git命令大全(git checkout ,git merge,git branch,git cherry-pick)

git stash 和git commit区别git文件状态命令手册git init git clone提交和修改git log远程仓库操作 git pull git push创建分支&#xff08;增删改查&#xff09;git checkout ,git branch ,git mergegit loggit taggit add, git stash ,git rebase,git cherry-pick git stash …

AI绘画SD三分钟入门教程!秋叶大佬8月最新的Stable Diffusion整合包V4.9来了,完整安装部署教程奉上,附各种模型插件一次性用爽!

大家好&#xff0c;我是画画的小强 前几天8月15日&#xff0c;国内AI绘画工具开源大佬更新了StableDiffusion整合包最新版本4.9&#xff0c;相关信息从图中能看到&#xff0c;本次更新后SD WebUI已经能够支持最新的AI绘画大模型SD3.0&#xff0c;以及更新了SD最强的控制插件Co…

nvm 安装老的node,npm版本

1、今天想安装一个老的node与npm版本&#xff0c;但出现问题&#xff0c;安装不了 2、后来修改settings.txt文件增加如下&#xff1a; node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: https://npmmirror.com/mirrors/npm/ 否则因为现在访问https://nodejs.or…

Jmeter 性能测试实战教程

一、性能测试流程 进行性能测试前&#xff0c;我们首先需要了解一下性能测试大致分为哪些流程&#xff0c;这样才能保证测试过程有序开展&#xff1a; 1、性能需求分析 了解哪些业务需要&#xff08;一般都是用户量大的核心业务&#xff0c;比如登录&#xff0c;查询等功能&…

HTML5休闲小游戏《切割大师》源码,引流、刷广告利器

HTML5休闲小游戏《切割大师》源码&#xff0c;直接把源码上传到服务器就能使用了&#xff01; 下载链接&#xff1a;https://www.huzhan.com/code/goods467910.html

webpack--webpack的启用

1、创建项目目录结构 2、安装依赖 2.1 初始化项目 npm init -y 2.2 安装webpack和webpack-cli npm i webpack webpack-cli -D 2.3 打包 npx webpack ./src/main.js --modedevelopment “./src/main.js”是指定需要打包的文件 --mode是指定打包的环境--mode有两个值&#xff0c;…

【vue3|第27期】Vue Router 中的 Meta 属性:灵活控制与增强你的应用

日期&#xff1a;2024年8月23日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉在这里插入代码片得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不…

Python优化算法11——螳螂优化算法(GOA)

科研里面优化算法都用的多&#xff0c;尤其是各种动物园里面的智能仿生优化算法&#xff0c;但是目前都是MATLAB的代码多&#xff0c;python几乎没有什么包&#xff0c;这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考&#xff1a;Python优化算…

销售易CRM怎么样?如何自动同步?

销售易CRM是什么&#xff1f; 销售易CRM是一款企业级CRM软件&#xff0c;它利用先进的移动互联、社交网络和云计算技术&#xff0c;提供从营销、销售到服务的一体化解决方案。销售易CRM不仅是一个软件工具&#xff0c;更是一种企业经营管理理念&#xff0c;通过智能技术的应用…

【Hot100】LeetCode—105. 从前序与中序遍历序列构造二叉树

目录 1- 思路递归 2- 实现⭐105. 从前序与中序遍历序列构造二叉树——题解思路 3- ACM 实现 原题连接&#xff1a;105. 从前序与中序遍历序列构造二叉树 1- 思路 递归 前序&#xff1a;中左右中序&#xff1a;左中右 让前序的第一个元素作为中序的分割点 分割思路 1- 递归…

推荐一个java低代码开发平台-橙单

文章目录 前言一、项目介绍二、技术选型三、项目特点四、基础功能介绍五、源码下载六、官方文档总结 前言 大家好&#xff0c;今天为大家推荐一个开箱即用&#xff0c;快速开发的低代码平台。项目采用 Boot3 Flowable7 Sa-Token Vue3技术栈。 一、项目介绍 橙单中台化低代…

如何使用ssm实现基于SSM框架云趣科技客户管理系统

TOC ssm079基于SSM框架云趣科技客户管理系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff…