算法中的时间复杂度,空间复杂度

一、前言

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

衡量不同算法之间的优劣主要是通过时间空间两个维度去考量:

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

通常会遇到一种情况,时间和空间维度不能够兼顾,需要在两者之间取得一个平衡点是我们需要考虑的

一个算法通常存在最好、平均、最坏三种情况,我们一般关注的是最坏情况

最坏情况是算法运行时间的上界,对于某些算法来说,最坏情况出现的比较频繁,也意味着平均情况和最坏情况一样差

二、时间复杂度

时间复杂度是指执行这个算法所需要的计算工作量,其复杂度反映了程序执行时间「随输入规模增长而增长的量级」,在很大程度上能很好地反映出算法的优劣与否

一个算法花费的时间与算法中语句的「执行次数成正比」,执行次数越多,花费的时间就越多

算法的复杂度通常用大O符号表述,定义为T(n) = O(f(n)),常见的时间复杂度有:O(1)常数型、O(log n)对数型、O(n)线性型、O(nlogn)线性对数型、O(n^2)平方型、O(n^3)立方型、O(n^k)k次方型、O(2^n)指数型,如下图所示:

从上述可以看到,随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低,由小到大排序如下:

Ο(1)<Ο(log n)<Ο(n)<Ο(nlog n)<Ο(n2)<Ο(n3)<…<Ο(2^n)<Ο(n!)

注意的是,算法复杂度只是描述算法的增长趋势,并不能说一个算法一定比另外一个算法高效,如果常数项过大的时候也会导致算法的执行时间变长

关于如何计算时间复杂度,可以看看如下简单例子:

function process(n) {let a = 1let b = 2let sum = a + bfor(let i = 0; i < n; i++) {sum += i}return sum
}

该函数算法需要执行的运算次数用输入大小n的函数表示,即 T(n) = 2 + n + 1,那么时间复杂度为O(n + 3),又因为时间复杂度只关注最高数量级,且与之系数也没有关系,因此上述的时间复杂度为O(n)

又比如下面的例子:

function process(n) {let count = 0for(let i = 0; i < n; i++){for(let i = 0; i < n; i++){count += 1}}
}

循环里面嵌套循环,外面的循环执行一次,里面的循环执行n次,因此时间复杂度为 O(n*n*1 + 2) = O(n^2)

对于顺序执行的语句,总的时间复杂度等于其中最大的时间复杂度,如下:

function process(n) {let sum = 0for(let i = 0; i < n; i++) {sum += i}for(let i = 0; i < n; i++){for(let i = 0; i < n; i++){sum += 1}}return sum
}

上述第一部分复杂度为O(n),第二部分复杂度为O(n^2),总复杂度为max(O(n^2), O(n)) = O(n^2)

又如下一个例子:

function process(n) {let i = 1; // ①while (i <= n) {i = i * 2; // ②}
}

循环语句中以2的倍数来逼近n,每次都乘以2。如果用公式表示就是1 * 2 * 2 * 2 … * 2 <=n,也就是说2的x次方小于等于n时会执行循环体,记作2^x <= n,于是得出x<=logn

因此循环在执行logn次之后,便结束,因此时间复杂度为O(logn)

同理,如果一个O(n)循环里面嵌套O(logn)的循环,则时间复杂度为O(nlogn),像O(n^3)无非也就是嵌套了三层O(n)循环

三、空间复杂度

空间复杂度主要指执行算法所需内存的大小,用于对程序运行过程中所需要的临时存储空间的度量

除了需要存储空间、指令、常数、变量和输入数据外,还包括对数据进行操作的工作单元和存储计算所需信息的辅助空间

下面给出空间复杂度为O(1)的示例,如下

let a = 1
let b = 2
let c = 3

上述代码的临时空间不会随着n的变化而变化,因此空间复杂度为O(1)

let arr []
for(i=1; i<=n; ++i){arr.push(i)
}

上述可以看到,随着n的增加,数组的占用的内存空间越大

通常来说,只要算法不涉及到动态分配的空间,以及递归、栈所需的空间,空间复杂度通常为O(1),一个一维数组a[n],空间复杂度O(n),二维数组为O(n^2)

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

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

相关文章

两部手机数据传输后备忘录不见了怎么回事

想必很多人都遇到过&#xff0c;当两部手机进行备忘录数据传输后&#xff0c;突然发现备忘录不见了&#xff0c;这让人不禁着急上火&#xff0c;我也曾经遇到过这种事情导致很多重要的内容都丢失了。 一般出现这种情况可能是因为&#xff0c;两部手机使用的是不同的云服务&…

接口测试的总结文档

接口测试的总结文档   第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1a;主要介绍…

Springboot3+vue3从0到1开发实战项目(一)

一. 可以在本项目里面自由发挥拓展 二. 知识整合项目使用到的技术 后端开发 &#xff1a; Validation, Mybatis,Redis, Junit,SpringBoot3 &#xff0c;mysql&#xff0c;Swagger, JDK17 &#xff0c;JWT&#xff0c;项目部署 前端开发&#xff1a; Vue3&#xff0c;Vite&am…

Android 单元测试初体验(二)-断言

[TOC](Android 单元测试初体验(二)-断言) 前言 当初在学校学安卓的时候&#xff0c;老师敢教学进度&#xff0c;翻到单元测试这一章节的时候提了两句&#xff0c;没有把单元测试当重点讲&#xff0c;只是说我们工作中几乎不会用到&#xff0c;果真在之前的几年工作当中我真的没…

引迈-JNPF低代码项目技术栈介绍

从 2014 开始研发低代码前端渲染&#xff0c;到 2018 年开始研发后端低代码数据模型&#xff0c;发布了JNPF开发平台。 谨以此文针对 JNPF-JAVA-Cloud微服务 进行相关技术栈展示&#xff1a; 1. 项目前后端分离 前端采用Vue.js&#xff0c;这是一种流行的前端JavaScript框架&a…

C++模拟实现unordered_map和unordered_set

目录 1.了解哈希表 1.哈希表 1.他的实现原理就是&#xff1a; ​编辑 2.写单个数据的类型&#xff08;这边先模拟map的kv类型&#xff0c;后面会再一起改&#xff0c;这边先一步步的先简单实现他&#xff09; 3.封装整个类&#xff1a; 4.哈希表中存储string 2.哈…

Python网络爬虫练习

爬取历年中国大学排名(前20名)&#xff0c;并随机选取一所高校画图展示其历年总分变化,并计算平均分&#xff0c;在图上展示该平均分直线&#xff1a; 代码如下&#xff1a; import matplotlib.pyplot as plt import pandas as pd import requests import randomdef main(yea…

【c++j继承】

在编程领域中&#xff0c;面向对象是一种非常流行的程序设计方法。C 继承是面向对象编程中的一个重要概念&#xff0c;它允许我们创建一个新的类&#xff08;子类&#xff09;来继承已有的类&#xff08;父类&#xff09;的属性和方法。通过继承&#xff0c;我们可以实现代码的…

Banana Pi BPI-R3 Mini 开源路由器,也能拍出艺术美感

香蕉派BPI-R3 Mini路由器板开发板采用联发科MT7986A(Filogic 830)四核ARM A53芯片设计&#xff0c;板载2G DDR 内存&#xff0c;8G eMMC和128MB SPI NAND存储&#xff0c;是一款非常高性能的开源路由器开发板&#xff0c;支持Wi-Fi6 2.4G/5G&#xff08;MT7976C&#xff09;&am…

零基础学Python第三天||写一个简单的程序

通过对四则运算的学习&#xff0c;已经初步接触了Python中内容&#xff0c;如果看官是零基础的学习者&#xff0c;可能有点迷惑了。难道敲几个命令&#xff0c;然后看到结果&#xff0c;就算编程了&#xff1f;这也不是那些能够自动运行的程序呀&#xff1f; 的确。到目前为止…

仿美团外卖源码/在线外卖平台源码PHP/支持多商户+多样化配送费+本土外卖+支持第三方配送

源码简介&#xff1a; 进云仿美团外卖源码&#xff0c;作为外卖平台源码&#xff0c;它不仅支持多商户、多样化配送费、本土外卖&#xff0c;还支持第三方配送。 进云仿美团外卖源码是一个进云源生插件&#xff0c;支持多商户多样化配送费模式本土外卖平台支持第三方配送&…

【工业智能】Solutions

各类问题对应的解决方案 工艺参数推荐APC 排产调度智能算法强化学习 运筹优化空压机群控 预测 工艺参数推荐 APC 排产调度 智能算法 遗传算法 强化学习 DDQN 运筹优化 空压机群控 MIP混合整数规划 能耗优化 预测 电池容量预测 时序预测&#xff0c;回归预测 点击剩余…

亲子开衫外套 I 真的好温柔好有气质

分享适合宝宝和麻麻 一起穿的开衫外套 包芯纱拼貂毛 软糯亲肤不扎人 上身体验感非常不错 这种面料还不易起球 质感满满&#xff0c;单穿内搭都可&#xff01;

开源vs闭源,大模型的未来在哪一边?

开源和闭源&#xff0c;两种截然不同的开发模式&#xff0c;对于大模型的发展有着重要影响。开源让技术共享&#xff0c;吸引了众多人才加入&#xff0c;推动了大模的创新。而闭源则保护了商业利益和技术优势&#xff0c;为大模型的商业应用提供了更好的保障。 那么&#xff0c…

如何进行微服务测试?

微服务测试是一种特殊的测试类型&#xff0c;因为它涉及到多个独立的服务。以下是进行微服务测试的一般性步骤&#xff1a; 1. 确定系统架构 了解微服务架构对成功测试至关重要。确定每个微服务的职责、接口、依赖项和通信方式。了解这些信息可以帮助您更好地规划测试用例和测…

wvp如果确认音频udp端口开放成功

用到工具 在服务器上开启端口监听 选中udp server&#xff0c;点击创建按钮 设置服务器监听端口 在客户端连接服务器端口 选中udp客户端&#xff0c;点击创建 输入服务器地址 远程端口和本地端口&#xff0c;本地端口只要没被占用都可以使用 &#xff0c;点击确认 发送数据 …

redis运维(十三) hash哈希

一 哈希 ① 定义 hash&#xff1a; 散列说明&#xff1a;key对应是值是键值对[python中的字典],其中键在redis中叫field.形如&#xff1a;value[{field1,value1},...{fieldN,valueN}],值本身又是一种键值对结构 ② 优点和缺点 wzj_height 180wzj_age 18等价 -->…

论文阅读:Distributed Initialization for VVIRO with Position-Unknown UWB Network

前言 Distributed Initialization for Visual-Inertial-Ranging Odometry with Position-Unknown UWB Network这篇论文是发表在ICRA 2023上的一篇文章&#xff0c;本文提出了一种基于位置未知UWB网络的一致性视觉惯性紧耦合优化测距算法( DC-VIRO )的分布式初始化方法。 对于…

数据仓库模式之详解 Inmon 和 Kimball

目录 一、前言 二、企业信息工厂&#xff08;Inmon&#xff09; 2.1 概念 2.2 主要组件 2.3 流程 三、多维数据仓库&#xff08;Kimball&#xff09; 3.1 概念 3.2 核心组件 3.3 流程 四、异同及用途对比 4.1 异同对比 4.2 特征比较 一、前言 大部分关于数据仓库构建…

软件测试测试文档的编写和阅读

在软件测试中的流程中&#xff0c;测试文档也是一个重要的流程&#xff0c;所以测试人员也需要学习测试文档的编写和阅读。 一、定义&#xff1a; 测试文档&#xff08;Testing Documentation&#xff09;记录和描述了整个测试流程&#xff0c;它是整个测试活动中非常重要的文…