何为算法之空间复杂度

news2024/11/26 19:56:20

前言

不知前面所讲的算法的十大特征你是否记住了呢?其实除了这十大特征之外,算法还有两个衡量标准。
不同的问题需要使用不同的算法作为策略,不同的算法也可能占用不同的时间和空间来完成相同的任务,这时候,对算法的选择显得至关重要。一个算法的质量优劣将直接影响整个程序的运行效率。
算法分析的目的是选择合适的算法,并对算法进行改进。如何衡量一个算法的优劣呢?其标准是空间复杂度(Space Complexity)与时间复杂度(Time Complexity)。

什么是空间复杂度

一个算法所占用的存储空间包括三个方面:算法本身所占用的空间、输入/输出数据所占用的空间,以及算法运行所占用的空间。

1.算法本身所占用的空间

算法本身所占用的空间即程序代码区,用于存放算法程序的二进制代码,与程序的代码行数和各行长度相关。例如以下两段代码,它们实现的功能是一样的,但代码1所占用的空间明显比代码2要多一些。

代码1
#输出1~10中3的倍数
#定义test函数:输入任何列表,返回列表中3的所有倍数

def test(x):
    list1 = []
    for i in x:
        if i % 3 == 0: # %是取余运算
            list1.append(i)
    return list1

#调用test函数计算1~10中3的倍数
print(test(list(range(1,10))))

在这里插入图片描述

输出结果

在这里插入图片描述

代码2
#使用lambda函数
print(list(filter(lambda x: x % 3 == 0 ,range(1,10))))

在这里插入图片描述

输出结果

在这里插入图片描述

注意

由于算法本身所占用的空间很小,所以我们一般不做深究。

2. 输入/输出数据所占用的空间

输入/输出数据所占用的空间主要是指问题所调用的数据所占用的空间,跟算法没有关系。

3. 算法运行所占用的空间

算法运行所占用的空间就反映算法的空间复杂度,它是算法运行时所消耗的内存空间的量度,记作:
S ( n ) = O ( f ( n ) ) S(n)=O(f (n)) S(n)=O(f(n))
常见的空间复杂度有 O(1)、0(n)和 O ( n 2 ) O(n^2) On2等。
它们分别代表什么意思呢?很简单,当算法运行时占用的临时空间不随某一变量n的改变而改变时,即空间复杂度为常量,表示为 O(1)。同理,当算法运行时占用的临时空间随n的改变而改变时,空间复杂度即O(n);当算法运行时占用的临时空间随n^2的改变而改变时,空间复杂度则为 O ( n 2 ) O(n^2) On2以此类推。

用代码来表示空间复杂度,这对于 Python 来说简直太容易了。

注意

空间复杂度是算法运行时所占用空间的一个量度,而不是计算具体的占用空间。

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

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

相关文章

强化学习的数学原理学习笔记 - RL基础知识

文章目录 Roadmap🟡基础概念贝尔曼方程(Bellman Equation)基本形式矩阵-向量形式迭代求解状态值 vs. 动作值 🟡贝尔曼最优方程(Bellman Optimality Equation,BOE)基本形式迭代求解 本系列文章介…

alibabacloud学习笔记02(小滴课堂)

什么是注册中心和常见的注册中心有哪些 介绍什么是Nacos和搭建实战 启动Nacos 使用前要先安装jdk。 linux学习专栏笔记中有,大家可以去看。 关闭nacos: 这样我们就登录了nacos。 项目集成Nacos实现服务直接的调用 每个子模块都去添加。 给每个子模块配置nacos配…

ReentrantLock底层原理学习二

以 ReentrantLock 作为切入点,来看看在这个场景中是如何使用 AQS 来实现线程的同步的 ReentrantLock 的时序图 调用 ReentrantLock 中的 lock()方法,源码的调用过程我使用了时序图来展现。ReentrantLock.lock() 这个是 reentrantLock 获取锁的入口 pu…

小H靶场笔记:DC-4

DC-4 January 4, 2024 2:37 PM Tags: teehee提权 Owner:只惠摸鱼 信息收集 探测靶机ip,发现应该是192.168.199.134 扫一下开放端口(22、80)、服务、版本、漏洞 根据扫描结果,在80端口可能有CSRF漏洞,…

好书推荐丨人工智能B2B落地实战:基于云和Python的商用解决方案(清华社)

文章目录 写在前面人工智能推荐图书图书简介简明目录 推荐理由粉丝福利写在后面 写在前面 本期博主给大家推荐一本全新正版的好书:《人工智能B2B落地实战:基于云和Python的商用解决方案》!这本书来自清华大学出版社,是今年刚刚出…

十八:爬虫-JS逆向(下)

一:AES与DES DES对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者。和信息的接收者在进行信息的传输与处理时,必须共同持有该密钥(称为对称密码),是一种对称加密算法。一般来说加密用的是encrypt()函…

Linux服务器安装操作Nginx

1.下载nginx压缩包 //进入/usr/local目录创建一个文件夹 cd /usr/local mkdir nginx cd nginx //下载tar包 wget http://nginx.org/download/nginx-1.20.1.tar.gz 2.配置nginx安装所需的环境 1. 安装gcc 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gc…

Linux查找命令@which、find

目录 which概念语法作用 find概念语法按文件名查找按文件大小查找 作用演示一演示二演示三 通配符 总结 which 概念 which 是一个常用的 Linux/Unix 命令,用于查找并显示指定命令的绝对路径。 语法 which 要查找的命令 》无参数。 》 which后面,跟要查…

Android studio Progress Bar 进度条应用设计

一、水平进度条: 1)、xml布局文件: 2)、java文件: progressBar1 = findViewById(R.id.progressBar); progressBar2 = findViewById(R.id.progressBar2); public class AlarmTask extends TimerTask {@Overridepublic void run() {progressValue++;if (progressVa…

计网知识点回归

概述 计算机网络的定义: 不同地理位置的计算机通过通信电路实现资源共享 计算机网络的组成: 资源子网——提供共享的软硬件资源 通信子网——提供信息交换的网络接点和通信线路 计算机网络分类: 按拓扑分:星形 树形 总线型 环形…

清华大学生物信息学课件资料分享

清华大学鲁志老师实验室在网上分享了他们的生信课程学习资料,有电子书,PPT和视频,真是生信学习者的福音。 实验室网址是: https://www.ncrnalab.org/courses/#bioinfo2 可以看到,课程有针对本科生的,也有针…

shp文件与数据库(创建表)

前言 第三方库准备 shp文件是什么?笔者就不多做解释。后面将使用python的一些第三方库 1、sqlalchemy 2、pyshp 3、geoalchemy2 4、geopandas 这四个是主要的库,具体怎么使用可以参考相关教程,当然还有其他库,后面在介绍。…

uniapp 微信小程序跳转外部链接

一、背景: 开发小程序时,跳转到内部路径通常会使用:uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab等方法,可以跳转到pages.json中已经注册的页面 uni.navigateTo(OBJECT) | uni-…

【KingbaseES】DataGrip配置链接KingbaseES V8R6数据库

新建驱动 填写内容如下: defaultjdbc:kingbase8://{host::localhost}:[{port::54321}]/[{:database::test}] 点击OK保存 测试链接 出现上图证明已经能链接了,保存链接看看数据库是否有我们的数据 发现好像什么都没有 再尝试,发现现在可以…

前端发开的性能优化 请求级:请求前(资源预加载和预读取)

预加载 预加载:是优化网页性能的重要技术,其目的就是在页面加载过程中先提前请求和获取相关的资源信息,减少用户的等待时间,提高用户的体验性。预加载的操作可以尝试去解决一些类似于减少首次内容渲染的时间,提升关键资…

ArkTS - 数据持久化

一、概述 应用数据持久化,是指应用将内存中的数据通过文件或数据库的形式保存到设备上。内存中的数据形态通常是任意的数据结构或数据对象,存储介质上的数据形态可能是文本、数据库、二进制文件等。 持久(Persistence)&#xff0…

如何查看崩溃日志

​ 目录 描述 思路 查看ipa包崩溃日志 简单查看手机崩溃信息几种方式 方式1:手机设置查看崩溃日志 方式2: Xocde工具 方式3: 第三方软件克魔助手 环境配置 实时日志 奔溃日志分析 方式四:控制台资源库 线上崩溃日志 线上监听crash的几种方式 方式1: 三…

GEC6818科大讯飞离线语音识别

GEC6818科大讯飞离线语音识别 文章目录 GEC6818科大讯飞离线语音识别一、 下载科大讯飞离线语音SDK二、 解压文件夹后三、与GEC6818开发板一起使用3.1 使用科大讯飞的离线语音在ubantu中运行,作为服务端进行关键字的识别3.2 call.bnf-->hehe.bnf3.3 asr_offine_s…

JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式)

JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式) 文章目录 JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件…

什么是软件安全性测试?如何进行安全测试?

一、什么是软件安全性测试? 软件安全性测试是指对软件系统中的安全漏洞进行检测和评估的过程。其目的是为了确保软件系统在面对各种安全威胁时能够保持其功能的完整性、可用性和机密性。 二、软件安全性测试可以通过以下几个步骤来进行: 1. 需求分析&a…