递归和master公式 系统栈 + 计算时间复杂度

前置知识:无

1)从思想上理解递归:对于新手来说,递归去画调用图是非常重要的,有利于分析递归

2)从实际上理解递归:递归不是玄学,底层是利用系统栈来实现的

3)任何递归函数都一定可以改成非递归,不用系统帮你压栈(系统栈空间),自己压栈呗(内存空间)

4)递归改成非递归的必要性:

  • a.工程上几乎一定要改,除非确定数据量再大递归也一定不深,归并排序,快速排序,线段树,很多的平衡树等,后面都讲
  • b.算法笔试或者比赛中(能通过就不改)

5)master公式

  • a.所有子问题规模相同的递归才能用master公式 ,T(n) = a*T(\frac{n}{b}) + O(n^c)a、b、c 都是常数
  • b.如果{log_{b}}^{a}< c,复杂度为:O(n^c)
  • c.如果{log_{b}}^{a} > c,复杂度为:O(n^{​{log_{b}}^{a}})
  • d.如果{log_{b}}^{a} == c,复杂度为:O(n^{c} * logn)

6)一个补充

  • T(n) = 2*T(\frac{n}{2}) + O(n*logn),时间复杂度是 O(n * ((logn)的平方)),即O(n * (logn)^{2}),证明过程比较复杂,记住即可

举个栗子:求 arr={4,2,6,1} 的最大值 

求最大值
递:左,最大值
递:右,最大值
整合(非):左,右(获得最终最大值)

观察上图:(个人描述,如有不对,多多指正)发现最多使用的系统栈的空间个数和递归树的高度存在对应关系:\left \lceil {log_{2}}^{4} \right \rceil = 2 

#include <iostream>
using namespace std;

int f(int arr[], int left, int right) {
	if (left == right) return arr[left];
	int mid = (left + right) / 2;
	int lmax = f(arr, left, mid);
	int rmax = f(arr, mid + 1, right);
	return max(lmax, rmax);
}

int maxValue(int arr[],int n){
	return f(arr, 0, n - 1);
}

// T(N) = T(N/2) + T(N/2) + O(1) = 2 * T(N / 2) + O(1)
// a = 2,b = 2,c=0 
int main() {
	int arr[] = { 3,8,7,6,4,5,1,2,10 };
	int n = sizeof(arr) / sizeof(arr[0]);
	cout << maxValue(arr,n) << endl;
	system("pause");
	return 0;
}

分析上面代码的时间复杂度

  • T(N) = T(N/2) + T(N/2) + O(1) = 2 * T(N / 2) + O(1)
  • a = 2,b = 2,c=0 

{log_{b}}^{a} = {log_{2}}^{2} = 1 > c=0,所以时间复杂度为O(n^{​{log_{2}}^{2}}) = O(n)

假如a = 2,b = 2,c=2,{log_{b}}^{a} = {log_{2}}^{2} = 1 < c=2,所以时间复杂度为O(n^c)=O(n^2)

假如a = 2,b = 2,c=1,{log_{b}}^{a} = {log_{2}}^{2} = 1 == c,所以时间复杂度为O(n^{c} * logn) = O(n * logn)

参考和推荐视频:

算法讲解020【必备】递归和master公式-左程云-左程云-哔哩哔哩视频 (bilibili.com)icon-default.png?t=N7T8https://www.bilibili.com/list/8888480?sort_field=pubtime&spm_id_from=333.999.0.0&oid=404355895&bvid=BV1kV411G7wP

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rust语言入门:理解基础语法

大家好&#xff0c;我是[lincyang]。 今天&#xff0c;我们将深入了解Rust编程语言的基础语法&#xff0c;为你打下坚实的Rust编程基础。 Rust简介 Rust是一种系统编程语言&#xff0c;它注重内存安全、并发性和实用性。Rust的设计哲学是提供安全性&#xff0c;而不损失性能。它…

自动生成Form表单提交在苹果浏览器中的注意事项

以下是本人在公司旧系统中看到的该段代码 function Post(URL, PARAMTERS) {//创建form表单var temp_form document.createElement("form");temp_form.action URL;//如需打开新窗口&#xff0c;form的target属性要设置为_blanktemp_form.target "_blank"…

跟我一起从零开始学python(二)网络编程

前言 昨天讲解了关于从零入门python的第一遍&#xff0c;编程语法必修内容&#xff0c;比如python3基础入门&#xff0c;列表与元组&#xff0c;字符串&#xff0c;字典&#xff0c;条件丶循环和其他语句丶函数丶面向对象丶异常和文件处理 。 今天讲第二篇&#xff1a;python…

修改/etc/fstab文件导致Linux无法正常启动解决方法

如果把 /etc/fstab 文件修改错了&#xff0c;也重启了&#xff0c;系统崩溃启动不了了&#xff0c;那该怎么办&#xff1f;比如&#xff1a; [rootlocalhost ~]# vi /etc/fstab UUIDc2ca6f57-b15c-43ea-bca0-f239083d8bd2 ext4 defaults 1 1 UUID0b23d315-33a7-48a4-bd37-9248…

ceph-deploy bclinux aarch64 ceph 14.2.10【2】vdbench rbd 块设备rbd 测试失败

上篇 ceph-deploy bclinux aarch64 ceph 14.2.10-CSDN博客 安装vdbench 下载vdbench 下载页面 Vdbench Downloads (oracle.com) 包下载 需要账号登录&#xff0c;在弹出层点击同意才能继续下载 用户手册 https://download.oracle.com/otn/utilities_drivers/vdbench/vdb…

搜集的升压芯片资料

DC-DC升压芯片,输入电压0.65v/1.5v/1.8v/2v/2.5v/2.7v/3v/3.3v/3.6v/5v/12v/24v航誉微 HUB628是一款超小封装高效率、直流升压稳压电路。输入电压范围可由低2V伏特到24伏特&#xff0c;升压可达28V可调&#xff0c;且内部集成极低RDS内阻100豪欧金属氧化物半导体场效应晶体管的…

人物百科怎么创建?教你如何创建人物百度百科注意以下方式技巧!

百科就像互联网上的名片&#xff0c;不仅代表身份&#xff0c;而且拥有极高的可信度。因此&#xff0c;许多名人都希望利用百科提高自己的知名度。任何人都可以编辑人物百科词条&#xff0c;但为了成功上传&#xff0c;需要一些技巧。以下是小媒同学给大家带来的人物百科快速创…

成都瀚网科技有限公司抖音带货正规

随着互联网的蓬勃发展&#xff0c;越来越多的公司开始利用网络平台进行产品销售。其中&#xff0c;抖音作为一款广受欢迎的短视频平台&#xff0c;已经成为众多商家眼中的“香饽饽”。在这场电商狂欢中&#xff0c;成都瀚网科技有限公司&#xff08;以下简称“瀚网科技”&#…

AMEYA360:江苏润石再次重磅发布11颗通过AEC-Q100认证的车规级芯片

为进一步满足众多新能源汽车客户对车规级芯片的需求&#xff0c;江苏润石持续研发更多的车规级产品&#xff0c;再次重磅发布11颗通过AEC-Q100 Grade1 & MSL 1湿敏等级认证的车规级芯片;进一步展示了江苏润石在车规级芯片领域孜孜不倦的追求&#xff0c;以及深耕汽车电子市…

研究生做实验找不到数据集咋办?

做实验找不到数据集咋办?这是很多研究者和开发者都会遇到的问题。数据集是实验的基础,没有合适的数据集,就无法验证模型的性能和效果。那么,有没有什么方法可以快速地找到我们需要的数据集呢?本文将介绍4个常用的数据集搜索平台,希望能够帮助大家解决这个难题。下面以室内…

单极性非归零码(NRZ)、双极性非归零码(NRZ)、单极性归零码、双极性非归零码(NRZ)、差分码的编码规则与其功率谱

数字信号的基带传输的基本概念与传输码型 主要涉及一些数字基带传输的基本概念和数字基带传输的简单码型。码型包括&#xff1a;单极性非归零码&#xff08;NRZ&#xff09;、双极性非归零码&#xff08;NRZ&#xff09;、单极性归零码、双极性非归零码&#xff08;NRZ&#xf…

【第2章 Node.js基础】2.4 Node.js 全局对象(一)

什么是Node.js 全局对象 对于浏览器引擎来说&#xff0c;JavaScript 脚本中的 window 是全局对象&#xff0c;而Node.js程序中的全局对象是 global&#xff0c;所有全局变量(除global本身外)都是global 对象的属性。全局变量和全局对象是所有模块都可以调用的。Node.is 的全局…

零代码Prompt应用大赛正式开始!飞桨星河社区五周年活动第一站

五周年盛典将至&#xff01;抢发第一站&#xff01; 在大模型时代&#xff0c;飞桨星河社区致力于让人人都成为大模型开发者&#xff01;飞桨星河社区零代码应用开发工具链&#xff0c;帮助大家轻松实现灵感落地、场景化需求落地&#xff0c;助力每个人实现工作与生活的效能提…

Node-RED系列教程-29nodered与三菱PLC基于MC协议通信测试

安装mc通信节点: node-red-contrib-mcprotocol 包含2个节点,一个节点负责读,一个节点负责写。 本教程目前只演示读功能。由于没有硬件,首先利用hsl demo软件模拟出一个用于测试mc通信的服务端。 mc读过程如下: 输入节点开启定时即可。 MC读节点配置:

HarmonyOS开发(一):开发工具起步

1、DevEco Studio 工具下载地址&#xff1a;HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 DevEco Studio基础配置 Node.jsOhpm 这两个都可以在进入IDE时在工具上选择下载安装 2、HelloWorld工程 打开DevEco,那么会进入欢迎页&#xff0c;点击Create Project---…

Swift--字符、字符串与集合类型

系列文章目录 第一章&#xff1a;量值与基本数据类型 第二章&#xff1a;字符、字符串与集合类型 文章目录 系列文章目录字符串组合 三种集合数组集合字典类型 Swift是一种弱化指针的语言&#xff0c;它提供了String类型和Character类型来描述字符串与字符 //构造一个字符串 …

李开复:未来AI或助力中国成为科技“火车头”

原创 | 文 BFT机器人 6月22日&#xff0c;创新工场的董事长兼首席执行官李开复&#xff0c;受邀在一场峰会上发表演讲&#xff0c;主题为《AI的飞奔时代》。 中国真的能成为AI超级强国吗&#xff1f; 李开复在演讲上盘点过去&#xff0c;展望未来&#xff0c;分析了过去几年中…

Hologres常用语句

1、列转行 regexp_split_to_table(要分割的字段,分割关键字) select regexp_split_to_table(aa,bb, ,) 2、行转列 string_agg(要拼接的字段,拼接关键字) 进阶版--按字段名汇总转换 select A字段,string_agg(B字段,, order by 排序字段) from 表名 group by A字段

C语言基础篇4:变量与存储

1 局部变量和全局变量 在介绍局部变量和全局变量前&#xff0c;先了解一些关于作用域方面的内容。作用域的作用就是决定程序中的哪些语句是可用的&#xff0c;换句话说&#xff0c;就是程序中的可见性。作用域有局部作用域和全局作用域&#xff0c;那么局部变量就具有局部作用域…

火山引擎 DataLeap 计算治理自动化解决方案实践和思考

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 【导读】本文旨在探讨火山引擎 DataLeap 在处理计算治理过程中所面临的问题及其解决方案&#xff0c;并展示这些解决方案带来的实际收益。主要内容包括&#xff1a;…