算法的时间与空间复杂度

算法是指用来操作数据、解决程序问题的一种方法。对于同一问题,使用不同的算法,也许最终结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。

那我们该如何去衡量不同算法之间的优劣呢?主要还是从算法所占用的【时间】和【空间】两个维度去考量。

  • 时间维度:是指执行当前算法所消耗的时间,我们通常用【时间复杂度】来描述;
  • 空间维度:是指执行当前算法所需要占用多少内存空间,我们通常用【空间复杂度】来描述。

因此,评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。然而,有的时候时间和空间却又是鱼和熊掌不可兼得,那我们就需要从从中去取一个平衡点。

下面我来分别介绍一下【时间复杂度】和【空间复杂度】的计算方式。

一、时间复杂度

我们想要知道一个算法的【时间复杂度】,很多人首先想到的方法就是把这个算法程序运行一遍,那么它所消耗的时间就自然而然知道了。

这种方式可以吗?当然可以,不过它有很多弊端。

这种方式很容易受运行环境影响,在性能高的机器上跑出来的结果与性能低的机器上跑出来的结果相差会很大。而且对测试时使用的数据规模也有很大关系。再者,我们在写算法的时候,还没有办法完整的去运行呢。

因此,另一种更为通用的方法就出来了:【大O符号表示法】,即T(n)=O(f(n))。

我们先来看个例子:

for (i=1; i <=n; i++)
{j = i;j++;
}

通过【大O表示法】,这段代码的时间复杂度为O(n),为什么呢?

在大O表示法中,时间复杂度的公式是:T(n)=O(f(n)),其中f(n)表示每行代码执行次数之和,而O表示正比例关系,这个公式的全程是:算法的渐进时间复杂度

我们继续看上面的例子,假设每行执行时间都是一样的,我们用1颗粒时间来表示,那么这个例子的第一行好事是1个颗粒时间,第三行的执行时间是n个颗粒时间,第四行的执行时间也是n个颗粒时间(第二行和第五行是符号,暂时忽略),那么总时间就是T(n)=(1+2n)*颗粒时间,从这个结果可以看出,这个算法的耗时是随着n的变化而变化,因此,我们可以简化这个算法的时间复杂度表示为:T(n)=O(n)。

为什么可以去简化呢,因为大O表示法并不是 用于来真实代表算法的执行时间的,它是哟弄个来表示代码执行时间的增长变化趋势的。

所以上面的例子中,如果n无限大的时候,T(n)=time(1+2n)中的常量1就没有意义了,倍数2也意义不大。因此直接简化为T(n)=O(n)就可以了。

常见的时间复杂度量级有:

  • 常熟阶O(1)
  • 对数阶O(logN)
  • 线性阶O(n)
  • 线性对数阶O(nlogN)
  • 平方阶O(n^{2})
  • 立方阶O(n^{3})
  • k次方阶O(n^{k}n^{k})
  • 指数阶O(2^{n})

从上至下依次的时间复杂度越来越大,执行效率越来越低。

下面选取一些较为常用的来讲解游戏啊(没有严格按照顺序):

1. 常数阶O(1)

无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1),如:

int i = 1;
int j = 2;
i++;
j++;
int m = i + j;

上述代码在执行的时候,它消耗的时间并不随着某个变量的增长而增长,那么无论这个代码有多长,即使几万几十万行,都可以用O(1)来表示它的时间复杂度。

2. 线性阶O(n)

这个在最开始的代码示例中就讲解过了,如:

for (i = 1; i <= n; i++)
{j = i;j++;
}

这段代码,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化为变化的,因此这类代码都可以用O(n)来表示它的时间复杂度。

3. 对数阶O(logN)

还是先来看代码:

int i = 1;
while(i < n)
{i = i * 2;
}

从上面代码可以看到,在while循环里面,每次都将i乘以2,乘完以后i距离n就越来越近了。我们试着求解一下,假设x次之后,i就大于n了,此时这个循环就退出了,也就是说2^{x}=n,那么x=\log_{2}n,也就是说循环\log_{2}n次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(\log n)

4. 线性对数阶O(nlogN)

线性对数阶O(nlogN)其实非常容易理解,将时间复杂度O(log(N))的代码循环n遍的话,那么它的时间复杂度就是nO(logN),也就是O(nlogN)。

就拿上面的代码加一点修改来举例:

for(m = 1; m <= n; m++)
{i = 1;while(i < n){i = i * 2;    }
}

5. 平方阶O(n^{2})

平方阶就更容易理解了,如果把O(n)的代码再嵌套循环一遍,它的时间复杂度就是O(n^{2})了。

举例:

for (x=1; x<=n; x++)
{for (i=1; i<=n; i++) {j = i;j++;    }
}

这段代码其实就是嵌套了两层n循环,它的时间复杂度就是O(n*n),即O(n^{2})

如果将其中一层循环的n改成m,即:

for (x=1; x<=m; x++)
{for (i=1; i<=n; i++) {j = i;j++;    }
}

那么它的时间复杂度就变成了O(m*n)

6. 立方阶O(n^{3})、k次方阶O(n^{k})

参考上面的O(n^{2})去理解就好了,O(n^{3})相当云三层n循环,其它的类似。

除此之外,其实还有平均时间复杂度、均摊时间复杂度、最坏时间复杂度、最好时间复杂度的分析方法,有点复杂,这里就不展开了。

二、空间复杂度

既然时间复杂度不是用来计算程序具体耗时的,那么我也应该明白,空间复杂度也不是用来计算程序实际所占用的空间的。

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用S(n)来定义。

空间复杂度比较常用的有:O(1)O(n)O(n^{2}),下面我们来看看:

1. 空间复杂度O(1)

如果算法执行所需要的临时空间不随着某个变量n的大小变化,即此算法空间复杂度为一个常量,可表示为O(1)

举例:

int i = 1;
int j = 2;
i++;
j++;
int m = i + j;

代码中i、j、m所分配的空间都不随着处理数据量变化,因此它的空间复杂度S(n)=O(1)。

2. 空间复杂度O(n)

我们先看一个代码:

int[] m = new int[n]
for (i=1; i<=n; i++)
{j = i;j++;
}

这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,这个代码的2~6行虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即S(n)=O(n)。

以上,就是对算法的时间复杂度和空间复杂度基础的分析,欢迎大家一起交流。

算法的时间与空间复杂度(一看就懂)

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

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

相关文章

5.26机器人基础-空间描述和变换-总结

非目录 方便我找 重点 逆解 位姿矩阵的几何意义 实际坐标需要除以比例因子才能得到 比例因子的好处&#xff1a;在计算机的储存更加简单方便&#xff0c;例如x,y,x原先很大时&#xff0c;等比例改变 位姿坐标的齐次变换&#xff1a;左乘齐次坐标 从端点到末端&#xff0c…

集合竞价选股策略实战测试

2.3.2版本发布的集合竞价选股策略是网友吴PSYP提供的&#xff0c;团队按照策略实现的选股算法&#xff0c;最近半个月对策略进行的实战测试&#xff0c;从集合竞价选股开始&#xff0c;到股票收盘&#xff0c;收盘价格大于集合竞价价格&#xff0c;算作盈利&#xff0c;测试结果…

Vision Mamba论文阅读(主干网络)

这几天被Mamba刷屏了&#xff0c;又由于本人是做视觉方面任务的&#xff0c;固来看看mamba在视觉上的应用。 今天分享的是Vision Mamba: Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 论文网址&#xff1a;https://arxiv.or…

火山引擎“奇袭”阿里云

图片&#xff5c;电影《美国队长3》剧照 ©自象限原创 作者丨程心 编辑丨罗辑 大模型价格战&#xff0c;已经不是什么新闻。 从OpenAI发布GPT-4o&#xff0c;将API价格下调50%&#xff0c;并宣布面向普通用户免费开始&#xff0c;就标志着大模型的竞争从性能进入到了成本…

【机器学习】期望最大化(EM)算法

文章目录 一、极大似然估计1.1 基本原理1.2 举例说明 二、Jensen不等式三、EM算法3.1 隐变量 与 观测变量3.2 为什么要用EM3.3 引入Jensen不等式3.4 EM算法步骤3.5 EM算法总结 参考资料 EM是一种解决 存在隐含变量优化问题 的有效方法。EM的意思是“期望最大化&#xff08;Exp…

Aloha机械臂的mujoco仿真问题记录

今天在测试ACT代码时&#xff0c;遇到了仿真中的机械臂无法摆放正确的姿势来抓去红色方块。 后来经过测试&#xff0c;发现应该是python包的版本问题有误&#xff0c;下面记录下正确的包版本&#xff1a; 官方给出的包&#xff1a; conda create -n aloha python3.8.10 conda…

vue3 ts问题 找不到模块“@/views/home/index.vue”或其相应的类型声明。

1. 找不到模块“/views/HomeView.vue”或其相应的类型声明 今天帮同事看了一个问题&#xff0c;他尝试用vitevue3tspinia创建项目&#xff0c;结果刚上来就遇到这么一个问题 2. 解决办法 出现这个问题的原因就是&#xff1a;ts只支持导出导入模块&#xff0c;但是vue不是模块…

leetcode 1631. 最小体力消耗路径 二分+BFS、并查集、Dijkstra算法

最小体力消耗路径 题目与水位上升的泳池中游泳类似 二分查找BFS 首先&#xff0c;采用二分查找&#xff0c;确定一个体力值&#xff0c;再从左上角&#xff0c;进行BFS&#xff0c;查看能否到达右下角&#xff0c;如果不行&#xff0c;二分查找就往大的数字进行查找&#xff…

web及网络基础图文详解

目录 1.1TCP/IP 协议族 1.2TCP/IP 的分层管理 1.3TCP/IP通信传输流 1.4 与 HTTP 关系密切的协议 : IP、TCP 和 DNS &#xff08;1&#xff09;负责传输的 IP协议&#xff08;网络层&#xff09; &#xff08;2&#xff09;确保可靠的 TCP协议&#xff08;传输层&#xff…

一行代码实现UI拖拽的效果

演示 先来看效果吧&#xff01; 实现方式 1.首先创建一个你想拖动的UI图片 2.创建一个C#的脚本 3.编写控制脚本&#xff08;代码按我的敲就行&#xff09; 付上代码片段 public void OnDrag(PointerEventData eventData){transform.position eventData.position;} 4.添加脚…

产品经理-需求分析(三)

1. 需求分析 从业务的需要出发&#xff0c;确定业务目的和目标&#xff0c;将业务需求转为产品需求 1.1 业务需求 业务需求 业务动机 业务目标 就是最根本的动机和目标成果&#xff0c;通过这个需求解决特定的问题 1.2 产品需求 产品需求 解决方案 产品结构 产品流程…

等了10年,终于迎来RTX5/RTX4全家桶开源,开源,开源! 且免费商用

我们的V4, V5, V6 ,V7开发板都配套了大量的RTX4, RTX5教程和案例&#xff0c;从2015年发布首版RTX4内核教程以来&#xff0c;已经整整10年了。 1、制作这个RTX教程和案例&#xff0c;其实也承受了很大的压力&#xff0c;因为只有RTX内核是免费商用的&#xff0c;中间件并不免费…

AUTOMATIC1111/stable-diffusion-webui/stable-diffusion-webui-v1.9.3

配置环境介绍 目前平台集成了 Stable Diffusion WebUI 的官方镜像&#xff0c;该镜像中整合如下资源&#xff1a; GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Stable Diffusion WebUI版本&#xff1a;v1.9.3 Python版本&#xff1a;3.10.…

数据结构(四)串

2024年5月26日一稿(王道P127) 定义和实现

【计算机毕业设计】基于SSM+Vue的新能源汽车在线租赁管理系统【源码+lw+部署文档】

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;新能源汽车在线租赁当然也不能排除在外。新能源汽车在线租赁是以实际运用为开发背景&#xff0c;运用软件工程开发方法&…

ChatGPT-4o 实战 如何快速分析混淆加密和webpack打包的源码

ChatGPT-4o 几个特点 一个对话拥有长时间的记忆&#xff0c;可以连续上传文件&#xff0c;让其分析&#xff0c;最大一个代码文件只能3M&#xff0c;超出3M的文件&#xff0c;可以通过split-file可以进行拆分 其次ChatGPT-4o可以生成文件的下载链接&#xff0c;这有利于大文件的…

Vue3实战笔记(37)—粒子特效登录页面

文章目录 前言一、粒子特效登录页总结 前言 上头了&#xff0c;再来一个粒子特效登录页面。 一、粒子特效登录页 登录页&#xff1a; <template><div><vue-particles id"tsparticles" particles-loaded"particlesLoaded" :options"…

2024年5月大语言模型论文推荐:模型优化、缩放到推理、基准测试和增强性能

前一篇文章总结了关于计算机视觉方面的论文&#xff0c;这篇文章将要总结了2024年5月发表的一些最重要的大语言模型的论文。这些论文涵盖了塑造下一代语言模型的各种主题&#xff0c;从模型优化和缩放到推理、基准测试和增强性能。 大型语言模型(llm)发展迅速&#xff0c;跟上…

【idea插件】查询maven小工具——maven-search

1、简介 该插件提供一个查询工具方便在IDE中快速查找maven依赖&#xff0c;定制模糊查找算法。支持查找全网类。注&#xff1a;该功能需要连接网络。所有数据来源于源码阅读网 2、使用方法 开启菜单&#xff1a;Tools / Maven Search 快捷键 &#xff1a;Shift Control M 或…

3款简洁个人网站引导页(附带源码)

3款个人网站引导页 效果图及部分源码1.个人页2.引导页3.导航页 领取源码下期更新预报 效果图及部分源码 1.个人页 部分源码 * {margin: 0;padding: 0; }body {background-image: linear-gradient(to left, rgba(255, 0, 149, 0.2), rgba(0, 247, 255, 0.2)), url(../img/bg.j…