算法-----递归~~搜索~~回溯(宏观认识)

目录

1.什么是递归

1.1二叉树的遍历

1.2快速排序

1.3归并排序

2.为什么会用到递归

3.如何理解递归

4.如何写好一个递归

5.什么是搜索

5.1深度(dfs)优先遍历&优先搜索

5.2宽度(bfs)优先遍历&优先搜索

6.回溯


1.什么是递归

我们呢下面介绍一下递归的几个使用的场景,这个里面不会介绍像这个斐波那契数列那样的递归(就是数学函数,很容易理解),我们就拿数据结构里面的排序算法和二叉树的遍历作为例子熟悉一下这个过程

1.1二叉树的遍历

我们这个地方是以后序遍历作为例子。对于一个二叉树而言,这个后序遍历的时候我们先遍历根节点的左子树,再去遍历根节点的右子树。最后遍历这个根节点;

在遍历左子树的时候,我们要先遍历这个左子树的根节点的左子树,再去遍历这个左子树根节点的右子树,以此类推,对于任何一个子树,我们都会先遍历这个根节点的左子树,再去遍历这个根节点的右子树;

1.2快速排序

快速排序和下面介绍的这个归并排序对于初学者而言很相似(我就是这个感觉),但是两个排序算法还是有很多的差异的;

快速排序之所以敢这么叫这个名字,自身的这个时间消耗上面肯定是可以的,它是有使用价值的,并不想其他的一些排序算法只有教学意义,没有实践意义;

快排需要先确定一个基准元素,把小于这个元素的放到左边,大于这个元素的放到右边,分别对于这个左边的和右边的进行排序,还是选择基准元素,按照上面的方法进行下去;

1.3归并排序

归并排序就和上面的快速排序有点不同了,因为归并排序是直接从中间分开,然后再把这个自己左右分开,直到分成一个一个的元素,最后把这个元素有序的组合起来即可;

下面的这个就是归并排序的过程展示:就是分开之后合并的过程,这个合并的时候我们是使用的双指针的方法合并的(通过指针的移动);

2.为什么会用到递归

我们在解决一个问题的时候,把这个问题分解为诸多的子问题,可以使用一个方法解决这个主问题,但是解决子问题的时候同样可以使用这个方法解决;

3.如何理解递归

3.1递归展开细节图:这个是初学的时候,老师经常搞的一种方法,但是这个并不一定会简化我们对于这个递归问题的理解;

3.2二叉树的题目:我们在二叉树学习的时候,尤其是涉及到这个二叉树的遍历,因为二叉树的遍历里面遍历任何一个子树的方法都是一样的,他们都是若干个子问题,我们就可以直接使用递归解决这个问题;

3.3宏观看待递归过程:我们跳出上面的递归细节展开图,找准子问题,只需要关注一个问题的实现,再去套用这个方法解决其他的问题;

下面我们按照这个思路简单的写一下dfs(深度遍历)和归并的伪代码:

我们没有实现,但是我们先把这个root->left作为函数的参数,root->right作为函数的参数,最后判断这个结束条件(到达叶子结点就结束);

void dfs(treenode* root)
{//结束条件:遇到叶子结点if (root == NULL){return;}dfs(root->left);dfs(root->right);printf("%d", root->val);
}

我们先计算这个mid值大小,再把这个mid作为参数传递进去,分别传递这个左边区间,和右边区间,使用这个函数进行排序,最后合并两个有序数组,结束条件就是left>=right,结束递归的过程;

void merge(int* nums, int left, int right)
{//递归结束的出口if (left >= right){return;}int mid = (left + right) / 2;merge(nums, left, mid);merge(nums, mid + 1,right);//合并两个有序数组
}

4.如何写好一个递归

4.1函数头的书写:找到一个主问题里面的字问题,看看是否可以使用相同的方法解决子问题;

4.2函数体的书写:只关注某一个子问题,来进行函数体的实现;

4.3结束条件:找这个递归的出口,作为结束递归的条件;

5.什么是搜索

5.1深度(dfs)优先遍历&优先搜索

深度就是一条路走到尽头之后再去折返回去,这个里面遍历只是过程的一种形式,搜索才是真正想要达到的目的;

5.2宽度(bfs)优先遍历&优先搜索

宽度就是你一层一层的进行,按照这个二叉树的层状结构进行遍历,这一层结束之后进行下一层;

6.回溯

回溯就是深度搜索,我们可以举例一下这个走迷宫的问题帮助我们理解一下,当我们走到一个迷宫的某一个节点的时候,我们有多个选择,我们肯定是只能走其中的一条,这个时候,我们认准一条路并且总下去,这个时候,我们发现走到了死胡同,这个时候我们就需要则返回那个岔路口,这个从现在所在位置返回到刚刚做选择的岔路口就是一个回溯的过程,因此我们说这个回溯和深度搜索没有什么本质的区别,都是一条路走到黑再去选择另外的一条路,仅此而已。

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

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

相关文章

Temu测评自养号如何做?三分钟带你入门!

环境系统 现在市场上很多的系统都是现成的或软件包,没有解决风控的能力,如果有需要建议大家自己学习一套技术,把技术掌握在自己手里,这样不会有依赖性 手机端环境:越狱后的ios指定版本手机可以一键新机的系统(参数调试)独享的家…

梧桐数据库:子查询优化技术

在数据库技术中,子查询是一个强大的工具,但不加优化的子查询可能会导致性能问题。优化子查询可以显著提升查询效率。以下是一些常见的子查询优化技术: 1. 使用连接(JOIN)替代子查询 1.1 基本原理 很多情况下&#x…

【NLP自然语言处理】为什么说BERT是bidirectional

首先,来看一下Transformer架构图: 我们知道,Bert设计时主要采用的是Transformer编码器部分,要论述Bert为啥是双向的,我想从编码器和解码器的注意力机制来阐述。 在看这篇博客前,需要对Transformer有一定的…

[C++] vector入门迭代器失效问题详解

文章目录 vector介绍**vector iterator 的使用** vector迭代器失效问题由扩容或改变数据引起的迭代器失效reserve的实现(野指针)insert实现(迭代器位置意义改变)insert修改后失效的迭代器 it迭代器失效 erase后的问题总结&#xf…

nextjs当后端使-读取excel文件

目前nextjs有种php的感觉,现在的需求是读取excel文件,入数据库,拆分出读取excel的代码如下: import { NextRequest } from "next/server"; import { join } from "path"; import { readFile } from "fs…

MyBatis-Plus的基本使用(一)

目录 前言 特性 MyBatis-Plus入门案例 常用注解 小结 前言 这篇文章主要来学习MyBatis-Plus这个非常强大的框架. 在学习MyBatis-Plus之前,需要有MyBatis的学习基础.因为MyBatis -Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变&#x…

spring —— 全注解实现事务管理器

全注解实现事务管理,就是取消 spring-config.xml 文件,而将配置信息在配置类中实现。 配置类: package com.spring.book;import com.alibaba.druid.pool.DruidDataSource; import org.springframework.context.annotation.Bean; import org…

中英双语简单介绍:字典学习(Dictionary Learning)

中文版 字典学习(Dictionary Learning)是一种机器学习技术,用于从数据中学习一组基元(称为“字典”),以便能够用这些基元来表示数据。该方法特别适用于稀疏表示(Sparse Representation&#xf…

Prometheus通过注册中心nacos、Eureka 实现服务注册自动发现监控

Prometheus通过注册中心nacos、Eureka 实现服务注册自动发现监控 Prometheus通过Eureka 实现服务注册自动发现监控 使用 Prometheus 中的 Eureka (Service Discover)SD 来使用 Eureka REST API 来查询抓取目标。 Prometheus 将定期检查 REST 端点并为每个应用程序实例创建一个…

环境激活的艺术:Conda激活命令全解析

🌐 环境激活的艺术:Conda激活命令全解析 Conda作为Python编程生态中一个不可或缺的包管理器和环境管理器,为开发者提供了一个强大的工具来创建、管理并隔离不同的工作环境。本文将详细解释如何在Conda中使用conda activate命令来激活环境&am…

【Java Bean 映射器】通过 MapStruct 和 BeanUtils 拷贝对象的区别

目录 👋前言 👀一、环境准备 🌱二、拷贝工具使用 2.1 BeanUtils 使用 2.2 MapStruct 使用 💞️三、对比 📫四、章末 👋前言 小伙伴们大家好,最近在一些技术文章中看到了开发时经常接触的对…

面向对象·回顾;万类之祖object;抽象类Abstract。

回顾面向对象 类与对象 类--------(instance实例化对象)-------->对象 类图 调出你public方法–接口 访问控制符 常用private,public。 封装 可见性本类包不同包private✓✕✕不写dafalt(默认)✓✓✕protected✓✓继承✓public✓✓✓…

【工具类】Excel转图片

import com.spire.xls.Workbook; import com.spire.xls.Worksheet; public static void transExcelToImg(String excelPath, String imgPath){//加载Excel工作表Workbook wb new Workbook();wb.loadFromFile(excelPath);//获取工作表Worksheet sheet wb.getWorksheets().get(…

ChatGPT:为什么说 NoSQL 数据库天生支持分布式,数据冗余和数据分片等特性?

ChatGPT:为什么说 NoSQL 数据库天生支持分布式,数据冗余和数据分片等特性? NoSQL 数据库天生支持分布式、数据冗余和数据分片等特性,旨在提供可扩展的高可用高性能数据存储解决方案,有以下几个原因: 1. 分…

【计算机网络】RIP路由协议实验

一:实验目的 1:掌握在路由器上配置RIPv2。 二:实验仪器设备及软件 硬件:RCMS交换机、网线、内网网卡接口、Windows 2019操作系统的计算机等。具体为:三层交换机1台、路由器2台。 软件:wireshark软件、记…

软件架构文档:综合指南

软件开发团队为软件架构做出选择背后的原因常常被迷失。新团队成员常常对为什么开发人员选择 Ruby 或 React 这样的编程语言,或者为什么他们在一个平台而不是另一个平台上托管软件感到困惑。 出于这个目的以及更多目的,负责软件架构开发的团队可能希望记…

01-调试开发k8s

使用 Docker 构建 Kubernete 官方 release 是使用 Docker 容器构建的。要使用 Docker 构建 Kubernetes,请遵循以下说明: Requirements docker Key scripts 以下脚本位于 build/ 目录中。请注意,所有脚本都必须从 Kubernetes 根目录运行 build/run.…

【科研绘图】记录一次论文结果复现

复现原论文中的图片是科研的基本功之一,它不仅验证了研究结果的可靠性,确保了科学工作的准确性和可重复性,还深刻地评估了方法的有效性,体现了对原始研究的尊重和对科学过程的严谨态度。这个过程不仅提高了研究的透明度&#xff0…

记忆注意力用于多模态情感计算!

记忆注意力用于多模态情感计算! 目录 情感计算 一、概述 二、研究背景 三、模型结构和代码 六、数据集介绍 七、性能展示 八、复现过程 九、运行过程 模型总结 本文所涉及所有资源均在传知代码平台可获取。 情感计算 近年来,社交媒体的快速扩张推动了用户…

解析class字节码文件获取魔数和版本号

写在前面 本文看下如何获取class字节码文件的魔数和版本号信息。 1:正文 需要对class字节码的结构有一定的了解,可以参考这篇文章 。 直接看代码: package org.example;import java.math.BigInteger;public class TTTT {//取部分字节码&…