数据结构之时间复杂度与空间复杂度

1.算法效率

1.1 如何衡量一个算法的好坏?

比方说我们非常熟悉的斐波拉契数列:

long long Fib(int N)
{if(N < 3)return 1;return Fib(N-1) + Fib(N-2);
}

递归实现方式非常简洁,但一定好吗?如何衡量其好与坏?

1.2算法的复杂度

定义:

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此 衡量一个算法的好坏,一般
是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。
时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算
机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计
算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

1.3复杂度对于校招的重要性

a50562e16d9d47a7b0e853a2800b38ad.png2.时间复杂度

定义:

在计算机科学中, 算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一
个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个 分析方式。一个算法所花费的时间与其中语句的执行次数成正比例, 算法中的基本操作的执行次数,为算法的时间复杂度。
就是找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度
2.大O的渐进表示法规则

时间复杂度和空间复杂度一般都使用大O的渐进表示法进行表示,大O的渐进表示法规则如下:

1、所有常数都用常数1表示。
2、只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项的系数,得到的结果就是大O阶。

我们就以开头所提及的递归得到斐波拉契数列的代码为例子,如果我们传递了一个参数n,即我们要求f(n)的值,那么应该运行多少次?,如f(n)=f(n-1)+f(n-2),而f(n-1)=f(n-2)+f(n-3) ,f(n-2)=f(n-3)+f(n-4)...
635bb5209010402586f03fb9adbb7937.png因为右下角的递归函数会提前结束,所以图中三角形必定有一块是没有数据的,但是当N趋于无穷时,那缺省的一小块便可以忽略不计,这时总共调用斐波那契函数的次数为:
20210406181445207.png再有等比数列求和,得出2N - 1。
那么用大O渐进表示法表示该函数的时间复杂度为:O(2N) 。
注意: 递归算法的时间复杂度 = 递归的次数 * 每次递归函数中的次数。
再举一个列子:
//计算Func1的时间复杂度
void Func1(int N)
{int count = 0;for (int i = 0; i < 2 * N; i++){for (int j = 0; j < 2 * N; j++){count++;}}for (int k = 0; k < 2 * N; k++){count++;}
}

该函数执行了一个嵌套循环共执行了4 * pow(n,2)次,又单执行一个for循环共执行2*N次

那么时间复杂度为4*pow(n,2)+2*n 次用大O渐进表示法:O(pow(n,2);

例2:

//计算Func2的时间复杂度
void Func2(int N)
{int count = 0;for (int k = 0; k < 100; k++){++count;}printf("%d\n", count);
}

该函数内部执行了一个for循环共100次,Func2函数内语句的执行次数不会随着传入的变量N的改变而改变,即执行的次数为常数次。Func2函数的时间复杂度为T(N) = 100 。

由大O渐进表示法,所有的常数都用1来表示,即O(1);

空间复杂度:

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。空间复杂度不是程序占用了多少字节的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法。

例1:

//计算冒泡排序函数的空间复杂度
void BubbleSort(int* a, int N)
{assert(a);for (int i = 0; i < N; i++){int exchange = 0;for (int j = 0; j < N - 1 - i; j++){if (a[j]>a[j + 1]){int tmp = a[j];a[j] = a[j + 1];a[j + 1] = tmp;exchange = 1;}}if (exchange == 0)break;}
}

例2:

//计算阶乘递归函数的空间复杂度
long long Factorial(int N)
{return N < 2 ? N : Factorial(N - 1)*N;
}

阶乘递归函数会依次调用Factorial(N),Factorial(N-1),…,Factorial(2),Factorial(1),开辟了N个空间,所以空间复杂度为O(N) 。同理我们开头所提到的斐波拉契函数也是O(N)。

注:递归算法的空间复杂度通常是递归的深度(即递归多少层)。

感谢你的阅读,下次再见。

 

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

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

相关文章

一文打尽相机单目标定(远心,沙姆镜头)

文章目录 普通镜头标定远心镜头标定沙姆镜头标定远心沙姆镜头标定实战 普通镜头标定 远心镜头标定 沙姆镜头标定 远心沙姆镜头标定 实战

JVM——垃圾回收器(Serial,SerialOld,ParNew,CMS,Parallel Scavenge,Parallel Old)

目录 1.垃圾回收器的组合关系1.年轻代-Serial垃圾回收器2.老年代-SerialOld垃圾回收器3.年轻代-ParNew垃圾回收器4.老年代- CMS(Concurrent Mark Sweep)垃圾回收器CMS执行步骤&#xff1a;CMS垃圾回收器存在的问题缺点&#xff1a;CMS垃圾回收器存在的问题 – 线程资源争抢问题…

Android 应用中Deep Link 和 App Link的区别

Android 应用中Deep Link 和 App Link的区别以及使用场景如下表格&#xff0c;希望给大家讲清楚了&#xff1a; 方式安全性跳转过程适配情况备注使用DeepLink接收无需校验&#xff0c;支持任意scheme需要浏览器中转支持所有Android版本由于支持所有版本的系统&#xff0c;可以…

目录 / 学习笔记快速链接

1.c语言 c语言 / 指针错误的几种情况-CSDN博客 c语言 / typedef和define之间的区别-CSDN博客 c语言 / 存储类型-CSDN博客 C语言 / 自定义函数实现strcat-CSDN博客 C语言 / 冒泡排序法-CSDN博客 C语言 / 指针相关内容总结-CSDN博客 C语言 / 自定义strcmp函数实现字符串排…

机器学习——支持向量机(SVM)

1.线性支持向量机 1.1数学模型 机器学习最终都是求解目标函数的最优问题&#xff1b; 一般都是讲问题转化为最小值来求解。 数学模型获得是一个不等式约束的最小化问题&#xff0c;求解时可通过构建拉格朗日函数求解。 1.2 拉格朗日函数及对偶问题求解 1.3 SMO算法求解 SMO算…

鸿蒙应用开发-初见:ArkTS

作者&#xff1a;HarderCoder ArkTS ArkTS围绕应用开发在 TypeScript &#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集 ArkTS在TS的基础上扩展了struct和很多的装饰器以达到描述UI和状态管理的目的 基本语法 …

python 常用内置模块之 json

介绍 当处理 JSON 数据时&#xff0c;Python 中的 json 模块提供了四个主要的函数&#xff1a;dump、dumps、load 和 loads。这些函数提供了在 JSON 数据和 Python 对象之间进行转换和序列化的功能。 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数…

ROS 功能包

ROS 功能包是 ROS 的核心组成部分之一&#xff0c;它是一个包含了源代码、配置文件、脚本等元素的一个单独的目录结构&#xff0c;用来实现特定功能。每个 ROS 功能包都有一些共同的文件&#xff0c;如 package.xml 文件&#xff0c;CMakeLists.txt 文件等&#xff0c;用于描述…

Redis Lua沙盒绕过 命令执行(CVE-2022-0543)漏洞复现

Redis Lua沙盒绕过 命令执行(CVE-2022-0543)漏洞复现 Redis如果在没有开启认证的情况下&#xff0c;可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。–那么这也就是redis未授权访问了 Redis的默认端口是6379 可以用空间测绘搜索&#xff…

【青蛙跳台阶问题 —— (三种算法)】

青蛙跳台阶问题 —— (三种算法&#xff09; 一.题目介绍1.1.题目1.2.图示 二.解题思路三.题解及其相关算法3.1.递归分治法3.2.动态规划算法&#xff08;Dynamic Programming&#xff09;3.3.斐波那契数列法 四.注意细节 一.题目介绍 1.1.题目 一只青蛙一次可以跳上1级台阶&am…

GWAS 分析模型 | FaST-LMM

GWAS 分析模型 | FaST-LMM FaST-LMM (Factored Spectrally Transformed Linear Mixed Models) 是一个用于进行全基因组关联分析&#xff08;GWAS&#xff09;的模型。与标准混合线性模型相比&#xff0c;FaST-LMM 通过对遗传相似性矩阵进行单次谱分解来减少计算资源消耗并提升运…

超全超实用行业解决方案合集,覆盖十大行业数据应用需求

现代企业面对复杂的业务需求&#xff0c;对数据分析的需求日益增加。 从实时销售到市场趋势&#xff0c;从客户行为到产品优化&#xff0c;每个环节都依赖于数据支持。然而&#xff0c;传统的数据分析平台常分散在不同系统和团队中&#xff0c;形成数据孤岛&#xff0c;降低了…

企业如何保障跨境金融业务中的数据安全传输?

随着全球化的不断深入&#xff0c;跨境金融业务日益频繁&#xff0c;然而在这些业务中&#xff0c;数据的安全传输一直是企业面临的重大挑战。跨境业务数据传输可能会遇到多种困难&#xff0c;如网络攻击、数据泄露、通信故障等。因此&#xff0c;企业需要采取有效的措施来确保…

C#,《小白学程序》第二十二课:大数的乘法(BigInteger Multiply)

1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary> /// 大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算 /// 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法 /// </summary> p…

漏洞复现--致远 M3 反序列化 mobile_portal RCE

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

JS根据颜色值和透明度获取带透明度的背景

在设置背景的时候&#xff0c;有时需要先选颜色值&#xff0c;然后再调整透明度&#xff0c;但却又不能影响文字透明度(功能类似简单封面EasyCover (jiandan.link))&#xff0c;此时可以将颜色值&#xff08;线性颜色或者十六进制颜色&#xff09;和透明度作为参数&#xff0c;…

数据结构 / 结构体位域

结构体位域充分利用把结构体字节&#xff0c;以bite为单位。例如:存储性别&#xff0c;可以使用二进制0或1表示 1. 格式 struct 结构体位域名 { 数据类型 位域名:位域大小; ...... }; 结构体位域名:满足命名规范数据类型&#xff1a;不可…

AIGC系列之:DDPM原理解读(简单易懂版)

目录 DDPM基本原理 DDPM中的Unet模块 Unet模块介绍 Unet流程示意图 DownBlock和UpBlock MiddleBlock 文生图模型的一般公式 总结 本文部分内容参考文章&#xff1a;https://juejin.cn/post/7251391372394053691&#xff0c;https://zhuanlan.zhihu.com/p/563661713&…

03 项目运行

前面两篇文章对项目架构+源码架构做了分析,这篇文章先将服务部署一下,能够让大家有个直观的感受。 组件资源 项目运行的各种组件已经为你准备好了,有需要的直接百度云盘下载: 链接:https://pan.baidu.com/s/1hN6qf20gamMHPmA_qXwsLg提取码:o4k9MySQL数据库创建 找到的…

2023年最新Dev-C++下载安装以及C语言环境搭建教程(C语言入门)

文章目录 写在前面C语言简介Dev-C简介Dev-C下载安装Dev-C使用教程 写在后面 写在前面 2023年最新Dev-C下载安装以及C语言环境搭建教程&#xff0c;快来看看吧&#xff01; C语言简介 C语言是一种通用的高级程序设计语言&#xff0c;由美国计算机科学家Dennis Ritchie于20世纪…