首页 > 其他分享 >class 020 递归和master公式

class 020 递归和master公式

时间:2024-09-19 23:21:14浏览次数:11  
标签:arr 递归 int 最大值 master 020 数组 class

这篇文章是看了“左程云”老师在b站上的讲解之后写的, 自己感觉已经能理解了, 所以就将整个过程写下来了。

这个是“左程云”老师个人空间的b站的链接, 数据结构与算法讲的很好很好, 希望大家可以多多支持左程云老师, 真心推荐.
https://space.bilibili.com/8888480?spm_id_from=333.999.0.0

在这里插入图片描述

1. 介绍递归

利用求一个数组中的最大值来理解递归:求 arr = [4, 2, 6, 1], 求这个数组中的最大值.

1.1 代码实例

这个代码真是很简单, 就不进行逻辑讲解了, 直接看就看明白了, 而且下面的递归决策图和递归的系统栈的调用图相信已经说的非常非常明白了!!! (两个结合起来看, 一定是能看懂的).

多画递归决策图, 这样也能很好地帮助大家理解递归.

public static int maxValue(int[] arr) {  
    return f(arr, 0, arr.length - 1);  
}  
  
// arr[l....r]范围上的最大值  
public static int f(int[] arr, int l, int r) {  
    if (l == r) {  
       return arr[l];   // 简单到不能再简单的状态, 已经不能继续往下分了,(base case)
    }  
    int m = (l + r) / 2;  
    int lmax = f(arr, l, m);  
    int rmax = f(arr, m + 1, r);  
    return Math.max(lmax, rmax);  
}  
  
public static void main(String[] args) {  
    int[] arr = { 3, 8, 7, 6, 4, 5, 1, 2 };  
    System.out.println("数组最大值 : " + maxValue(arr));  
}

递归决策图

在这里插入图片描述

递归在系统栈中的调用

在这里插入图片描述
在这里插入图片描述

2.1 压栈:将递归改为非递归

任何递归函数都可以改为非递归, 不用系统帮你压栈, 自己利用内存空间压栈就行了 (哪怕是原原本本的和系统栈一样也行).

系统栈是固定大小的(比较小), 内存也是固定大小 (但是很大),

工程和笔试中需不需要改递归函数在最开始的图片上都有说明, 就不多废话了.

2. master 公式

使用 master 公式的意义:满足这个 master 公式的实例可以直接确定时间复杂度.

在这里插入图片描述

2.1 第一个例子

用上面的代码当成例子解释:有一个数组:arr[l...r], 我们将这个数组分成一半一半了, 然后从左边一半找到最大值和右边一半找到最大值, 然后从这两个部分找到最大值.
所以利用 master公式:T(N) = T(N/2) + T(N/2), 这个是前面的部分, 后面的部分是:除了递归(子过程调用)的部分, 剩下的部分的时间复杂度是:O(1) (因为所有的操作都是O(1)级别的).

所以最后的 master公式:T(N) = T(N/2) + T(N/2) + O(1).
master公式:T(N) = 2 * T(N/2) + O(1). 所以此时:a = 2, b = 2, c = 0(因为N^c, N^0 = 1),

2.2 第二个例子

还是用上面的代码当成例子解释:有一个数组:arr[l...r], 我们将这个数组左边是 2/3, 右边也是 2/3,
分别从左边和右边寻找最大值, 最后找到最大值, 这样肯定是也能找到的.

在这里插入图片描述

这样的 master 公式是:T(N) = 2 * T(N * 2/3) + O(1). 此时:a = 2, b = 3/2, c = 0. (注意:我们这里的公式是:N * ?, 但是原理的公式是:N/?, 所以要取倒数).

2.3 第三个例子

还是用上面的代码当成例子解释:有一个数组:arr[l...r], 我们将这个数组分成一半一半了, 然后从左边一半找到最大值和右边一半找到最大值, 然后从这两个部分找到最大值, 但是此时我就是想在最后遍历一遍数组

下面是代码:

public static int maxValue(int[] arr) {  
    return f(arr, 0, arr.length - 1);  
}  
  
// arr[l....r]范围上的最大值  
public static int f(int[] arr, int l, int r) {  
    if (l == r) {  
       return arr[l];          // 简单到不能再简单的状态, 已经不能继续往下分了,(base case)  
    }  
    int m = (l + r) / 2;  
    int lmax = f(arr, l, m);  
    int rmax = f(arr, m + 1, r);  
  
    for (int i = 0; i < arr.length; i++) {  
       System.out.println(arr[i]);  
    }  
    return Math.max(lmax, rmax);  
}  
  
public static void main(String[] args) {  
    int[] arr = { 3, 8, 7, 6, 4, 5, 1, 2 };  
    System.out.println("数组最大值 : " + maxValue(arr));  
}

这个时候的 master公式 = 2 * T(N/2) + O(n), 因为此时我加入了一个 for循环, 所以对应的, 除了子过程之外的时间复杂度是:O(n), 此时:a = 2, b = 2, c = 1.

当然, 要是我想用两个 for循环, 这样做 c = 2 了.

2.4 第四个例子

还是用上面的代码当成例子解释:有一个数组:arr[l...r], 我们将这个数组分成左边 2/3, 右边是:1/3, 此时就不能用 master公式 了, 因为两边的子问题已经不一样(不等规模)了, 一个是 2/3, 另一个是 1/3, 所以就不能使用了.

2.5 使用 master 公式计算时间复杂度

这没啥能记笔记的, 直接用下面的公式算就行了.

在这里插入图片描述

2.6 补充 (直接记住就行了)

在这里插入图片描述

标签:arr,递归,int,最大值,master,020,数组,class
From: https://blog.csdn.net/2301_80967814/article/details/142371869

相关文章

  • 易优eyoucms网站Fatal error: Class '\think\cache\driver\File' not found
     根据提供的错误信息 Class'\think\cache\driver\File'notfound,这个错误表明PHP无法找到类 \think\cache\driver\File。这通常是因为类文件未被正确加载或命名空间配置不正确导致的。以下是一些可能的解决步骤:1.确认类文件路径确保类文件 File.php 的路径正确并且......
  • 设计资料原理图:622-基于ADRV9002 +ZYNQ7020 的软件无线电 SDR(升级AD9361)
    一、板卡概述   板卡由ADIADRV9002+XilinxXC7Z020-CLG484芯片设计的整板,包含双路射频输入输出通道,支持千兆网络,RS232,触摸屏等接口,双核ARM支持Linux操作系统。板卡功耗很低,适合自定义的无线协议开发,如Loar、Wifi、4G平台等,也适合无线手持机、图传模块的产品开发。二、主要......
  • java class
    cstdioimportjava.util.Scanner;classRead{//ilikeC++getchar()foreverQwQ!!!//idon'tknowwhyjavascannerdonothavethatQAQ!!!staticScannersc;staticStringbuff;staticintbufP;Read(){sc=new......
  • 【Java】若依框架(RuoYi-master)——8.文件上传
     若依框架的自带上传和下载功能,但需要我们进行恰当的操作(具体也可以参考示例和源码)。 新建表格新建一张学生信息表(这里的字段、文件路径、文件名称与改说明相关):DROPTABLEIFEXISTS`sys_student`;CREATETABLE`sys_student`(`student_id`intNOTNULLAUTO_INCRE......
  • 实操触发器的使用 mysql 20240918_102020
    需求新建日志表用于记录老师表的数据化情况起个名字teacher_log需要的列idoperationmsg建老师日志表CREATETABLEteacher_log( idINTPRIMARYKEYAUTO_INCREMENT, operationVARCHAR(11)NOTNULL, msgVARCHAR(200)NOTNULL);定义添加触发器如果往老师表tea......
  • CS 61A Fall 2020 起步
    今天在曹大的知识星球立了一个flag,如下: 为什么会想到立这个flag呢?自己从本科的时候,就对计算机“感兴趣”,考研的时候选择了国内计算机名校的计算机专业,但是在读研期间写的代码并不多,没有从写代码中获得持续的正反馈。去年,我入职了一家国企,从事软件开发工作,刚入职的时候就开......
  • 【数据分享】1975-2020年人口密度POP栅格数据
    数据来源GHS-POP空间栅格产品(GHS-POP_GLOBE_R2023)描绘了人口的分布,表示为每个单元的人数。这个数据集描述了人口的分布和密度,以每个单元的人数表示,1975年-2020年,五年间隔,空间分辨率1000m.官网下载地址:https://human-settlement.emergency.copernicus.eu/download.php?ds=po......
  • 2020 ICPC 上海赛区
    赛时6题。第七题我写的没de出来(给队友跪了)xixike哥太强了有5题代码都是他写的(我只写了半题)ggxxdd哥也非常强特别会数学题。只有我什么都不会G,B都是队友切的签到,没看M:虽然会有重复的,但只要把前缀一起放到map里去就不会有任何重复的点因此可以打标记,这样就能建树了。然后就是......
  • Scala学习之旅-Class Constructor
    在生活和学习中,懂得拿捏对象是非常重要的!本篇我们用Scala和Java来定义一个类,一起来看看Scala在搞定对象方面有啥厉害的地方。ScalaclassclassPerson(valname:String,varage:Int){overridedeftoString:String={s"$name'sageis$age"}defappl......
  • [ACTF2020 新生赛]Upload
    启动靶机,发现有前端验证先绕过前端验证,在burp中尝试发现验证在文件名后缀,且会重命名文件名发现.ini能上传但是会被重命名,既然不像前端显示只有三种格式能上传,这里我们寻找能绕过的后缀尝试发现phtml能上传成功//PHTML扩展名是PHP的一个模块,它允许在HTML文件中使用PHP......