递归时间复杂度分析 && master公式

2023-11-09

递归时间复杂度分析 && master公式

我们先来看一道递归的例子:

我们要寻找一个数组的最大值,要求用递归的方法求出

代码如下:

/**
 * @author `dongxu.kwb`
 * @date `2022/8/30`
 */
public class SumMax {
    public static void main(String[] args) {
        int[] arr = {79,3213,3,5,45,65};
        System.out.println(sumMax(arr, 0, arr.length - 1));
    }

    /**
     * 求数组arr再[left, right]上的最大值
     * @param arr 传入的数组
     * @param left 数组最左面的值
     * @param right 数组最右面的值
     * @return
     */
    public static int sumMax(int[] arr, int left, int right) {
        if (left == right) return arr[left]; //递归中止条件,当分到只剩一个数时
        int mid = left + ((right - left) >> 1); //取中点
        int leftMax = sumMax(arr, left, mid);
        int rightMax = sumMax(arr, mid + 1, right);
        return Math.max(leftMax, rightMax);
    }
}

如何求上面的算法的时间复杂度呢?

这就要使用master公式了。

master公式:

​ T(n) = a * T(n/b) + O( n d n^{d} nd)

首先使用这个公式的条件是 :该递归函数中若存在多个递归调用,那么这些递归调用的机会必须是相等的。

比如上面这个,包含两个递归,且两个递归的机会都是相等的各占1/2。而b代表调用的机会,n/b就为1/2。

        int leftMax = sumMax(arr, left, mid);
        int rightMax = sumMax(arr, mid + 1, right);

a就是函数中使用了几次递归函数,a = 2。

O( n d n^{d} nd) 代表的是除去递归函数中的递归部分,其余的时间复杂度为多少,很明显是O(1),此时 d = 0。

上面的例子用master表达式表示就是:

​ T(n) = 2 * T(n/2) + O(1)

此时我们用一套规律来计算它的时间复杂度:

对于T(n) = a * T(n/b) + O( n d n^{d} nd),

  • l o g b a log_{b}^{a} logba < d,时间复杂度为 O( n d n ^ {d} nd)
  • l o g b a log_{b}^{a} logba > d, 时间复杂度为 O( n l o g b a n ^ {log_{b}^{a}} nlogba)
  • l o g b a log_{b}^{a} logba == d, 时间复杂度为 O( n d n ^ {d} nd * l o g 2 n log_{2}^{n} log2n)

所以,例子中的递归时间复杂度是:O(n)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归时间复杂度分析 && master公式 的相关文章

  • Mockito 在调用参数数量可变的方法时使用参数匹配器

    我试图在对具有可变数量参数的方法的调用中使用参数匹配器 Java 中的东西 没有成功 我的代码如下 我还将列出我尝试用来完成此工作的所有行 import static org mockito Mockito public class Met
  • JDK 文档是语言规范的一部分吗?

    只有一名官员Java语言规范 https docs oracle com javase specs jls se8 html index html所有 Java 实现都必须遵守它 API文档怎么样 所有Java实现都需要遵守吗这个版本 ht
  • createImage(int width, int height) 的问题

    我有以下代码 作为游戏的一部分每 10 毫秒运行一次 private void gameRender if dbImage null createImage returns null if GraphicsEnvironment isHea
  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • “java.net.MalformedURLException:未找到协议”读取到 html 文件

    我收到一个错误 java net MalformedURLException Protocol not found 我想读取网络上的 HTML 文件 mainfest uses permission android name android
  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • 如何在 Spring 属性中进行算术运算?

  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • 泛型、数组和 ClassCastException

    我想这里一定发生了一些我不知道的微妙事情 考虑以下 public class Foo

随机推荐

  • 卡方分布

    以上讲了一种称为服从正态分布的概率密度函数 今天 讲一讲服从 卡方分布 的概率密度函数 首先给出该函数的定义 自由度 是公式中一个重要参数 自由度不同 图形的形状也完全不同 众所周知 直线方程中的参数k是斜率 它控制着直线的倾斜角度 它不同
  • java中trim()方法

    string类型 指定要删除首部和尾部空格的字符串返回值String 函数执行成功时返回删除了string字符串首部和尾部空格的字符串 发生错误时返回空字符串 如果参数值为null时 会抛出空 指针异常 主要是为了防止复制过来首尾出现字符串
  • Day 15 - 面向对象2习题

    建立一个汽车类Auto 包括轮胎个数 汽车颜色 车身重量 速度等属性 并通过不同的构造方法创建实例 至少要求 汽车能够加速 减速 停车 再定义一个小汽车类CarAuto 继承Auto 并添加空调 CD属性 并且重新实现方法覆盖加速 减速的方
  • C++二叉树遍历总结\100. Same Tree

    理论学习 概念介绍 遍历图解 遍历算法 代码实践 实现模板 Same Tree 题目描述 代码实现 转载请注明出处 http blog csdn net c602273091 article details 55195284 理论学习 概念
  • ajp协议服务器端如何配置,详解Tomcat HTTP协议与AJP协议

    IT168评论 Tomcat最主要的功能是提供Servlet JSP容器 尽管它也可以作为独立的Java Web服务器 它在对静态资源 如HTML文件或图像文件 的处理速度 以及提供的Web服务器管理功能方面都不如其他专业的HTTP服务器
  • count()用啥好?

    按照效率排序的话 count 字段
  • template模板中的if判断语句

    if 0 value task state 22 else 33 if
  • 程序员,都去写一写前端代码吧

    转至 http www raychase net 1162 你可以认为我是一个极端的人 就像有许多人专注于自己的领域而不屑于其它 肤浅 的工作范畴一样 比如我见过不少认为做portal没有技术含量的判定 做工程都是充满苦逼行为的言论 最近则
  • Quant 实习申请总结[转自丁丁笑笑生]

    我是University of Michigan博士第四年的学生 专业是高能理论物理 弦论 从北大元培毕业来到美国之后 我对科研的兴趣 信心和成就感与日俱减 加之对于未来组建家庭的考虑 决定放弃科研理想和道路 寻找一份工作 养家糊口 积累一
  • C++ 中的 POD 类型

    C 内存管理系列文章汇总 C 中数据类型和变量总结 C 中内存分区总结 C 中三种内存对象特点总结 C 中栈对象的使用总结 C 中 static 静态对象的使用总结 C 中堆对象的使用总结 C 中普通类的对象布局 C 中字节对齐总结 C 继
  • Linux终端信息

    获取终端能显示的行数和列数 student myhost tput cols 140 student myhost tput lines 35 获取终端名 student myhost tput longname xterm with 25
  • 软工导论知识框架(八)面向对象设计风格

    一 面向对象实现 把面向对象设计结果翻译成面向对象程序 测试并调试面向对象的程序 二 程序设计语言 所有语言都可完成面向对象实现 但效果不同 使用非面向对象语言编写面向对象程序 则必须由程序员自己把面向对象概念映射到目标程序中 1 将来能够
  • 怎么用css画一个心形_如何用CSS创建心形

    CSS3增强了我们仅使用HTML和CSS就能在网站上构建内容的可行性 您可以找到我们以前精选的出色示例 但是 不要让自己过分领先 复杂的设计将需要可能使您头疼的代码 取而代之的是 我们将创建一些简单的内容 以帮助您先了解CSS的形状和位置
  • Integral nonlinearity (INL) and differential nonlinearity (DNL) of data converters

    Syntax s inldnl analog digital range type s inldnl Name Value Description example s inldnl analog digital range type cal
  • 与中断有关的MCS-51特殊功能寄存器

    MCS 51系列特殊功能寄存器 与中断有关的 一 中断允许寄存器IE 字节地址0A8H 位地址AFH A8H 1 EA CPU中断总允许位 EA 0时 屏蔽所有中断请求 EA 1时 CPU开放中断 2 ES 串行口中断允许位 ES 0时 串
  • 2021年开发Python图形用户界面(GUI)的6种最佳Python GUI框架

    几个知名的编程语言排行榜索引已证明了Python在全球开发人员中的崛起 但是 以开发人员为中心的英国分析家SlashData现在已经对使用该语言的开发人员的实际人数进行了估算 根据SlashData在2019年的统计 目前全球有820万使用
  • 小程序适老化设计指南

    小程序适老化设计指南 小程序适老化设计指南
  • IDEA 单元测试报错 java.lang.ClassNotFoundException: junit.framework.ComparisonFailure

    项目场景 单元测试时报错 java lang ClassNotFoundException junit framework ComparisonFailure 原因分析 提示 这里填写问题的分析 例如 Handler 发送消息有两种方式 分
  • 从零开始利用JPA与SHARDING-JDBC动态划分月表

    开始 从零开始利用spring data jpa与sharding jdbc进行动态月表 直接上手 需求说明 数据量按照分片键 入库时间 进入对应的月表 查询时根据分片键的值查询指定表 但是每次查询都必须带上分片键 这就不是很友好 所以另外
  • 递归时间复杂度分析 && master公式

    递归时间复杂度分析 master公式 我们先来看一道递归的例子 我们要寻找一个数组的最大值 要求用递归的方法求出 代码如下 author dongxu kwb date 2022 8 30 public class SumMax publi