当前位置: 首页 > news >正文

数据结构03(Java)--(递归行为和递归行为时间复杂度估算,master公式)

前言

本文为本小白🤯学习数据结构的笔记,将以算法题为导向,向大家更清晰的介绍数据结构相关知识(算法题都出自🙌B站马士兵教育——左老师的课程,讲的很好,对于想入门刷题的人很有帮助👍)

已经了解过排序了,在来了解一下递归行为和递归行为时间复杂度估算(master公式)

🙌还是先来看一个问题:
用递归方法找一个数组中的最大值,系统上到底是怎么做的?

package DiGui;public class Digui01 {public static int getMax(int[] arr) {return process(arr,0,arr.length-1);}//用递归方法找一个数组中的最大值,系统上到底是怎么做的?public static int process(int[] arr,int L,int R) {if(L==R){return arr[L];}int mid=L + ((R-L)>>1);//求中点int leftMax=process(arr,L,mid);int rightMax=process(arr,mid+1,R);return Math.max(leftMax,rightMax);}
}

来看看递归的核心思想:把大问题分解成小问题,小问题再分解,直到不能再分(基础情况),然后逐层合并结果。

  1. 把数组从中间分成两半;
  2. 分别找出左半部分的最大值和右半部分的最大值;
  3. 然后取这两个最大值中的较大者,就是整个区间的最大值。

在这里插入图片描述
利用函数一步步的往下分,直到到达最后一层,返回比较一步一步找到最大值。

递归行为时间复杂度如何估算?

来看看什么是master公式:

🌟 一、Master 公式是干什么的?
Master 公式(Master Theorem)是算法分析中一个非常重要的工具,用来快速求解递归算法的时间复杂度,特别是那些采用分治策略(Divide and Conquer)的算法,比如你上面写的递归找最大值、归并排序、快速排序(平均情况)等。

在这里插入图片描述

其中:

  • n:问题规模
  • a>=1:子问题的个数,(递归调用次数)
  • b>=1:每个子问题的规模原问题的1/b(注:也就是说每个子问题规模是一样的
  • f(n): 非递归部分的工作量

看到这个公式,是不是一脸懵,这怎么计算n呢?嗯最重要的来了,这有一个公式(跟着算就好,我也不到杂咋推的🤪):
在这里插入图片描述

🙌我们来用master来算一下,上面代码的时间复杂度:

其中n = R- L + 1 是当前处理的数组长度

每次递归将问题分成两个子问题,每个子问题规模是原问题的一半:

  • 左半:[L, mid]
  • 右半:[mid+1, R]

因此:子问题个数 a = 2 ,每个子问题规模是 n / b,b = 2

Math.max(leftMax,rightMax) 是常数时间:O (1),d = 0

将a,b,d,带入,🎉 最终答案:时间复杂度是 O(n)

小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)

…。。。。。。。。。。。…请添加图片描述

…。。。。。。。。。。。…

http://www.xdnf.cn/news/1317385.html

相关文章:

  • Mac(五)自定义鼠标滚轮方向 LinearMouse
  • Linux软件编程:进程与线程(线程)
  • JVM学习笔记-----StringTable
  • Docker Compose 安装 Neo4j 的详细步骤
  • PostgreSQL导入mimic4
  • go基础学习笔记
  • k8s集群搭建一主多从的jenkins集群
  • Win11 文件资源管理器预览窗格显示 XAML 文件内容教程
  • C++ vector的使用
  • 10 SQL进阶-SQL优化(8.15)
  • 说一下事件委托
  • Java 大视界 -- Java 大数据分布式计算在基因测序数据分析与精准医疗中的应用(400)
  • 【UEFI系列】ACPI
  • 跨越南北的养老对话:为培养“银发中国”人才注入新动能
  • JavaScript 性能优化实战:从评估到落地的全链路指南
  • Spark03-RDD02-常用的Action算子
  • 在鸿蒙中实现深色/浅色模式切换:从原理到可运行 Demo
  • E2B是一个开源基础设施,允许您在云中安全隔离的沙盒中运行AI生成的代码和e2b.dev网站
  • Diamond基础2:开发流程之LedDemo
  • c_str()函数的详细解析
  • 简单的 VSCode 设置
  • (nice!!!)(LeetCode 每日一题) 837. 新 21 点 (动态规划、数学)
  • bash shell 入门
  • 云智智慧停充一体云-allnew全新体验-路内停车源码+路外停车源码+充电桩源码解决方案
  • Rust:DLL 输出对象的生命周期管理
  • API生命周期10阶段
  • 原子操作及基于原子操作的shared_ptr实现
  • Baumer高防护相机如何通过YoloV8深度学习模型实现工作设备状态的检测识别(C#代码UI界面版)
  • 【C++】Windows 下 TCP接口超详介绍,如何实现一个TCP服务端和客户端
  • Windows 10共享打印机操作指南