算法的时间复杂度和空间复杂度(2)

news/2024/5/17 2:41:28/文章来源:https://blog.csdn.net/weixin_74795859/article/details/130272191
计算斐波那契递归Fib的时间复杂度?
long long Fib(size_t N)
{
if(N < 3)
return 1;
return Fib(N-1) + Fib(N-2);
}

 

因为递归先递推后回归,看起来规律像等比数列,也可以用错位相减法,因为斐波那契数列到第二项就不会再计算了,因为前面两项都是1,灰色部分可以忽略不计,影响不大。

所以斐波那契数列时间杂度为O(2^N)

空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度
空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。
空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
 

计算BubbleSort的空间复杂度?
void BubbleSort(int* a, int n)
{
assert(a);
for (size_t end = n; end > 0; --end)
{
int exchange = 0;
for (size_t i = 1; i < end; ++i)
{
if (a[i-1] > a[i])
{
Swap(&a[i-1], &a[i]);
exchange = 1;
}
}
if (exchange == 0)
break;
}
}

空间复杂度是O(1)。 

大家可能会认为是O(N),实际上不是,因为空间复杂度计算的是一个算法在运行过程中临时占用存储空间大小的量度 ,int*a指向的数组,在建立冒泡函数之前就已经创建好了,所以只看函数内部即可,end是常数,所以是空间复杂度是O(1)。

计算Fibonacci的空间复杂度?
返回斐波那契数列的前n项
long long* Fibonacci(size_t n)
{
if(n==0)
return NULL;
long long * fibArray = (long long *)malloc((n+1) * sizeof(long long));
fibArray[0] = 0;
fibArray[1] = 1;
for (int i = 2; i <= n ; ++i)
{
fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
}
return fibArray;
}

空间复杂度是O(N),因为malloc开辟了n+1空间。

计算阶乘递归Fac的空间复杂度?
long long Fac(size_t N)
{
if(N == 0)
return 1;
return Fac(N-1)*N;
}

空间复杂度为O(N)

 

因为函数的建立会创建栈帧,然后会覆盖栈帧 。递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。

计算斐波那契递归Fib的空间复杂度?
long long Fib(size_t N)
{
if(N < 3)
return 1;
return Fib(N-1) + Fib(N-2);
}

空间复杂度是O(N),因为在斐波那契数列在函数递归的时候 ,会有很多重复项,而函数栈帧在建立的时候,它会先选定一个空间,而空间是可以重复利用的,不累计计算,在一块栈帧用完后会销毁,在按照语句去选定下一个空间。

 

#include<stdio.h>
long long Fib(size_t N)
{if (N < 3)return 1;return Fib(N - 1) + Fib(N - 2);
}
int main()
{printf("%d\n", Fib(10));return 0;
}

 

 

 

 调试可以看见在递归的时候,10会先去调用9,9去调用8,依此类推,到尽头就销毁栈帧,然后再开始计算Fib(N-2).....我们可以调试发现两边的N是共用同一块空间的。

我们通过下面的代码运行可以发现就是共用同一块空间的。

#include<stdio.h>
void FUB1()
{int a = 0;printf("%p\n", &a);
}
void FUB2()
{int b = 0;printf("%p\n", &b);
}
int main()
{FUB1();FUB2();return 0;
}

 

 

在main()调用完FUB1()空间会销毁,销毁不是真的销毁了这块空间,而是相当于人搬走了,地方还在,FUB2()还会在刚才的空间继续创建栈帧。 

 

 栈是向上生长的,下面是低地址,上面是高地址。

#include<stdio.h>
void FUB1()
{int a = 0;printf("%p\n", &a);
}
void FUB2()
{int b = 0;printf("%p\n", &b);
}
int main()
{int a = 0;printf("%p\n", &a);FUB1();FUB2();return 0;
}

常见复杂度对比
一般算法常见的复杂度如下:
 

52013140(1)常数阶
3n+40(N)线性阶
3n^2+4n+50(n^2)平方阶
3log(2)n+40(logn)对数阶
2n+3log(2)n+140(nlogn)nlogn阶
n^3+2n^2+4n+60(n^3)立方阶
2^n0(2^n)指数阶

 这个表仅供参考。

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

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

相关文章

【Spring Boot】SpringBoot设计了哪些可拓展的机制?

文章目录 前言SpringBoot核心源码拓展Initializer拓展监听器ApplicationListenerBeanFactory的后置处理器 & Bean的后置处理器AOP其他的拓展点 前言 当我们引入注册中心的依赖&#xff0c;比如nacos的时候&#xff0c;当我们启动springboot&#xff0c;这个服务就会根据配置…

2023/4/20总结

项目 网上关于listview的资料太少了&#xff0c;在网上的那些资料里面&#xff0c;了解到以下这些。 如果希望listview后期能更改或者更新&#xff0c;那么需要使用到 ObservableList 它可以观察到&#xff0c;listview的改动。 需要特别注意一点的是&#xff1a;写俩者的…

第 三 章 UML 类图

文章目录 前言一、依赖关系&#xff08;虚线箭头&#xff09;二、泛化关系&#xff1a;继承&#xff08;实线空心箭头&#xff09;三、实现关系&#xff08;虚线空心箭头&#xff09;四、关联关系&#xff08;一对一为实线箭头&#xff0c;一对多为实线&#xff09;五、聚合关系…

java贸易企业工作信息管理与利润返现系统sxA5进销存程序

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1 课题背景 1 1.2 研究现状 1 本章小结 1 第2章 可行性分析 2 2.1 经济可行性 2 2.2 技术可行性 2 2.3 操作可行性 2 2.4 业务流程分析 3 本章小结 3 第3章 需求分析 4 3.1 需求分析 4 …

Nuxt.js - 超详细实现路由 “伪静态“,将浏览器网页路径 URL 链接后面加上 .html 后缀名称(可以自定义任何结尾后缀名称)详细示例教程

前言 正常的项目,路由都是 /index | /user/add 这种,但有一个办法可以让其后面带上 .html,比如:/index.html。 本文 在 Nuxt.js 项目中,描述了如何实现伪静态详细教程,让页面路由后面都跟上一段自定义后缀名,比如 .html / .asp, 你可以按照本文的教程,最终得到伪静态…

react中如何系统化的处理时间操作?

在 Web 开发中&#xff0c;我们经常需要处理日期和时间的格式化。 在 React 中&#xff0c;这个过程变得更加容易和直观&#xff0c;因为我们可以使用一个叫做 moment 的 npm 包来帮助我们完成这个任务。 什么是 Moment? Moment.js是一个JavaScript库&#xff0c;用于处理日…

Vue2组件通信专题

组件通信专题 一、vue2中常用的6中组件通信方式 1. props 适用于的场景&#xff1a;父子组件通信 注意事项&#xff1a; 如果父组件给子组件传递数据&#xff08;函数&#xff09;&#xff1a;本质其实是子组件给父组件传递数据。 如果父组件给子组件传递数据&#xff08…

水质站房式在线监测系统集方案要点

水质在线自动监测系统是一套高度集成的一体化水质自动监测系统&#xff0c;其中包含水样采集处理、水质自动分析、数据采集传输、远程操作监控于一体的在线全自动监控系统。 本次方案整体系统采用一体化集成方式&#xff0c;辅助设备工艺制作精细&#xff0c;同时系统工艺流程…

使用计算机视觉实战项目精通 OpenCV:6~8

原文&#xff1a;Mastering OpenCV with Practical Computer Vision Projects 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线…

Android开发—入门Kotlin编程语言

一、Kotlin简介 为什么Kotlin能代替Java此为Android官方第一支持的开发语言&#xff1f; 1&#xff09;Kotlin的语法更加简洁&#xff0c;对于同样的功能&#xff0c;使用Ktolin开发的代码量可能会比使用Java开发减少50%甚至更多&#xff1b; 2&#xff09;Kotlin语法更加高…

串口UART介绍

【记录所学】 1. 串口的硬件介绍 UART的全称是Universal Asynchronous Receiver and Transmitter&#xff0c;即异步发送和接收。串口在嵌入式中用途非常的广泛&#xff0c;主要的用途有&#xff1a; 打印调试信息&#xff1b;外接各种模块&#xff1a;GPS、蓝牙&#xff1b…

DHCP故障定位

1.请分析可能的原因,定位并排除故障。 (1)存在仿冒DHCP服务器攻击 导致部分有线终端获取到错误的IP地址、网关等信息,进而导致无法访问网关。 解决办法:为了防止DHCP Server仿冒者攻击,将与合法DHCP服务器直接或间接连接的接口设置为信任接口,其他接口设置为非信信任接…

java版工程项目管理系统源代码-功能清单 图文解析

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和佳能EF变焦镜头实现相机的自动变焦(C++)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和佳能EF变焦镜头实现相机的自动变焦&#xff08;C&#xff09; Baumer工业相机Baumer工业相机BGAPISDK中控制变焦镜头的技术背景代码案例分享第一步&#xff1a;开启相机自动调焦功能模块第二步&#xff1a;控制自动变焦镜头电机的…

进制数转换知识点总结

二进制和十六进制 用0和1表示各种信息 计算机的电路由逻辑门电路组成。一个逻辑门电路可以看成一个开关&#xff0c;每个开关的状态是“开"&#xff08;高电位&#xff09;或“关”&#xff08;低电位&#xff09;&#xff0c;即对应于1或0 课程推荐 【【计算机科学速成…

c++学习之类与对象3

目录 成员变量和函数的存储 this指针 this指针的工作原理 this指针的应用 const修饰的成员函数 友元 友元的语法 1.普通全局函数成为类的友元 2.类的某个成员函数作为另一个类的友元 整个类作为另一个类的友元 运算符重载 1 运算符重载的基本概念 2 重载加号运算符…

[架构之路-169]-《软考-系统分析师》-4-据通信与计算机网络-0-Ad hoc网络(分组无线网络)

目录 什么是Ad hoc网络 adhoc无线网络的历史 ad hoc特点 独立性 结构 通信带宽 主机能源 分布式特性 生存周期 物理安全 adhoc无线网络的结构 adhoc无线网络的应用 什么是Ad hoc网络 Ad hoc是一种多跳的、无中心的、自组织无线网络&#xff0c;又称为多跳网&#xff08;M…

详解C语言string.h中常见的13个库函数(上)

我计划讲解C语言string.h这个头文件中&#xff0c;最常见的13个库函数。为了让大家更加深入的理解这些函数&#xff0c;部分函数我会模拟实现。篇幅所限&#xff0c;如果文章太长了&#xff0c;可能会较难坚持读完&#xff0c;所以我会分几篇博客来讲述。本篇博客主要讲解的函数…

《数据结构》---术语篇

目录 前言: 一.术语 1.1数据 1.2数据结构 1.3逻辑结构和物理结构 二.数据类型和抽象数据类型 ​​​​​​​ ❤博主CSDN&#xff1a;啊苏要学习 ▶专栏分类&#xff1a;数据结构◀ 学习数据结构是一件有趣的事情&#xff0c;希望读者能在我的博文切实感受到&#xff0c…

Spring原理学习(六):Spring实现动态代理时对jdk和cglib的选择

目录 〇、前言 一、AOP中的一些基本概念 二、两个切面的概念 三、advisor的使用 3.1 前置知识 3.2 使用步骤 四、spring对jdk和cglib的统一 〇、前言 对jdk和cglib 实现动态代理的原理不清楚的兄弟们&#xff0c;可以参考前文&#xff1a;Spring原理学习&#xff08;…