当前位置: 首页 > 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.lryc.cn/news/623969.html

相关文章:

  • 人脸AI半球梯控/门禁读头的功能参数与技术实现方案
  • MySQL的事务基础概念:
  • 力扣刷题904——水果成篮
  • 黑马商城day08-Elasticsearch作业(个人记录、仅供参考、详细图解)
  • MLArena:一款不错的AutoML工具介绍
  • 【Linux】IO多路复用
  • SpringCloud 07 微服务网关
  • linux-高级IO(上)
  • 【撸靶笔记】第五关:GET - Double Injection - Single Quotes - String
  • Linux目录介绍
  • 002.Redis 配置及数据类型
  • 第三十八天(Node.JS)
  • AUTOSAR ARXML介绍
  • gin结合minio来做文件存储
  • Oracle Undo Tablespace 使用率暴涨案例分析
  • UE5多人MOBA+GAS 49、创建大厅
  • java设计模式之迪米特法则使用场景分析
  • ​​Vue 3 开发速成手册
  • PHP现代化全栈开发:测试驱动开发与持续交付实践
  • MCP原理与开发及与大模型交互流程
  • 最小路径和
  • 【JAVASE】-9- 接口语法基础
  • Android中切换语言的方法
  • DNS总结
  • 【Linux内核】Linux信号机制
  • linux 常用代码
  • nodejs 错误处理
  • Collections.synchronizedList是如何将List变为线程安全的
  • vs studio 2017项目不支持studio vs2022
  • 【k8s】Kubernetes核心概念与架构详解