数据结构与算法——5.空间复杂度分析

news2024/11/23 23:03:07

这篇文章让我们来讨论一下空间复杂度

目录

1.概述

2.java中常见内存占用

2.1基本数据类型内存占用情况

2.2计算机访问内存的方式

2.3引用大小

2.4对象大小

2.5一般内存占用

2.6数组占用地址大小

3.算法的空间复杂度

4.小结


1.概述

计算机的软硬件都经历了一个比较漫长的演变史,作为为运算提供环境的内存,更是如此,从早些时候的512k,经历了1M,2M,4M...等,发展到现套的8G,甚至16G和32G,所以早期,算法在运行过程中对内存的占用情况也是一个经常需要考虑的问题。我么可以用算法的空间复杂度来描述算法对内存的占用。

2.java中常见内存占用

2.1基本数据类型内存占用情况

2.2计算机访问内存的方式

 计算机访问内存是一字节一字节的,即一次访问一字节:

2.3引用大小

一个引用(机器地址)需要8个字节表示

例如:Date date = new Date(); 则这个date变量就需要用8个字节来表示

2.4对象大小

创建一个对象,比如new Date(),除了Date对象内部存储的数据(例如年月日等信息)占用的内存,该对象本身也有内存开销,每个对象的自身开销是16个字节,用来保存对象的头信息。

2.5一般内存占用

一般内存的使用,如果不够8个字节,都会被自动补充为8字节:

例:public class A{

                public int a = 1;

        }

分析:

通过new A()创建一个对象的内存占用如下:

  1. 整型成员变量占用4个字节;
  2. 对象本身占用16个字节

那么创建这个对象总共需要20个字节,但由于不是8的整数倍,所以自动填充至24个字节(实质是int a 时就直接占用8个字节了)

2.6数组占用地址大小

java中数组被被限定为对象,他们一般都会因为记录长度而需要额外的内存,一个原始数据类型的数组一般需要24字节的头信息(16个自己的对象开销,4字节用于保存长度以及4个填充字节)再加上保存值所需的内存


3.算法的空间复杂度

了解了java的内存最基本的机制,就能够有效帮助我们估计大量程序的内存使用情况。

算法的空间复杂度计算公式记作:S(n)=O(f(n));其中n为输入规模,f(n)为语句关于n所占存储空间的函数。

案例:对指定的数组元素进行反转,并返回反转的内容。

解法一:

public static int[] reverse1(int[] arr){
        int n = arr.length;//申请4个字节
        int temp;申请4个字节
        for (int start = 0,end=n-1; start <= end; start++,end--) {
            temp=arr[start];
            arr[start]=arr[end];
            arr[end]=temp;
        }
        return arr;
    }

解法二:

public static int[] reverse2(int[] arr){
        int n = arr.length;//申请4个字节
        int[] temp = new int[n];//申请4*n个字节+数组自身头信息开销24个字节
        for (int i = n-1; i >=0 ; i--) {
            temp[n-1-i]=arr[i];
        }
        return temp;
    }

忽略判断条件占用的内存,我们得出的内存占用情况如下:

算法一:

        不管传入的数组大小为多少,始终额外申请4+4=8个字节

算法二:

        4+4n+24=4n+28

根据大O推导法则,算法一的空间复杂度为O(1),算法二的空间复杂度为O(n),所以从空间占用的角度讲,算法一要优于算法二。由于java中有内存垃圾回收机制,并且jvm对程序的内存占用也有优化(例如即时编译),我们无法精确的评估一个java程序的内存占用情况,但是了解了java的基本内存占用,使我们可以对java程序的内存占用情况进行估算。
由于现在的计算机设备内存一般都比较大,基本上个人计算机都是4G起步,大的可以达到32G,所以内存占用一般情况下并不是我们算法的瓶颈,普通情况下直接说复杂度,默认为算法的时间复杂度。
但是,如果你做的程序是嵌入式开发,尤其是一些传感器设备上的内置程序,由于这些设备的内存很小,一般为几kb,这个时候对算法的空间复杂度就有要求了,但是一般做java开发的,基本上都是服务器开发,一般不存在这样的问题。

4.小结

这篇文章就简要的讲述了一下算法的空间复杂度,其实不是很重要,一些小知识点知道就行,重要的还是时间复杂度。

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

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

相关文章

大数据面试题集锦-Hadoop面试题(四)-YARN

你准备好面试了吗?这里有一些面试中可能会问到的问题以及相对应的答案。如果你需要更多的面试经验和面试题&#xff0c;关注一下"张飞的猪大数据分享"吧&#xff0c;公众号会不定时的分享相关的知识和资料。 文章目录1、为什么会产生 yarn,它解决了什么问题&#xf…

Linux系统常用的2种切换用户命令

文章目录一、su命令二、sudo命令总结一、su命令 1、语法&#xff1a;&#xff08;英文全拼&#xff1a;switch user&#xff09; su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]2、参数说明&#xff1a; -f或--fast&#xff1a;不必读启动档&…

值得收藏!适合小微企业的万元数字化攻略!

编者按&#xff1a;小微企业数字化之路困难重重&#xff1f;看看这款全新的全面数字化方案&#xff0c;低成本、部署效率、免安装、免维护、数据安全&#xff0c;小微企业的数字化福音&#xff01;关键词&#xff1a;低成本&#xff0c;开箱即用&#xff0c;免安装免维护&#…

数据结构——树(一):二叉树

前言 在这篇文章中&#xff0c;荔枝会整理一下自己学习二叉树的学习笔记。主要内容包括树与二叉树的基本定义以及基础概念、二叉树的存储结构、二叉树的四种遍历方法以及二叉查找树的基本内容。 文章目录 前言 一、树形存储结构 二、二叉树 2.1 二叉树的基本定义 2.2 二叉…

【项目笔记】尚硅谷《云原生实战》

尚硅谷《云原生实战》1、云服务器nginx测试2、子网3、Docker4、Redis尚硅谷云原生项目 官方笔记 1、云服务器nginx测试 在云服务器供应商购买云服务器&#xff0c;配置弹性公网ip&#xff1a;121.37.230.200。外部访问使用公网ip&#xff0c;弹性公网每次会变&#xff1b;服务…

Docker中安装并配置单机版redis

1、使用docker安装redis 搜索Reis镜像&#xff0c;这里展示的是官方最新的镜像docker search redis 使用官方dockerhub搜索redis 2、选用常用的redis5.0作为安装的版本docker pull redis:5.0 3、运行redis容器的两种方式 3.1 不映射外部配置文件直接运行redis5.0镜像docker …

【C#基础】C# 正则表达式

序号系列文章7【C#基础】C# 常用数据结构8【C#基础】C# 面向对象编程9【C# 基础】C# 异常处理操作文章目录前言1&#xff0c;Regex 的概念2&#xff0c;Regex 的创建3&#xff0c;Regex 常用操作4&#xff0c;Regex 类的使用5&#xff0c;学习资源推荐结语前言 &#x1f33c; h…

软件测试之【性能测试】

性能测试的定义 性能测试的定义&#xff1a;通过自动化测试工具或者代码手段&#xff0c;来模拟正常、峰值负载访问被测系统&#xff0c;来观测系统各项性能指标是否合格的过程。 性能测试的分类 基于代码的性能测试&#xff08;关注点是函数或方法执行的效率&#xff09; 基于…

acwing1562 微博转发(宽搜)

微博被称为中文版的 Twitter。 微博上的用户既可能有很多关注者&#xff0c;也可能关注很多其他用户。 因此&#xff0c;形成了一种基于这些关注关系的社交网络。 当用户在微博上发布帖子时&#xff0c;他/她的所有关注者都可以查看并转发他/她的帖子&#xff0c;然后这些人…

铰链、弹簧,特殊的物理关节

title: 铰链、弹簧&#xff0c;特殊的物理关节 date: 2023-02-28T13:32:57Z lastmod: 2023-02-28T14:24:06Z 铰链关节&#xff08;Hinge Join&#xff09;组件 组件-Physics-Hinge Join Anchor 当物体挂载铰链组件以后&#xff0c;组件下Anchor等同于边长为1的立方体。当这…

机器学习笔记之流形模型——标准流模型基本介绍

机器学习笔记之流形模型——标准流模型基本介绍引言回顾&#xff1a;隐变量模型的缺陷标准流(Normalizing Flow\text{Normalizing Flow}Normalizing Flow)思想分布变换的推导过程引言 本节将介绍概率生成模型——标准流模型(Normalizing Flow\text{Normalizing Flow}Normalizi…

第九节 常用API(String/ArrayList)

常用API(String/ArrayList) java写好的程序&#xff0c;我们可以直接调用。 String类定义的变量可以用于存储字符串&#xff0c;同时String类提供了很多操作字符串的功能&#xff0c;我们可以直接使用。 ArrayList简单介绍 1.ArrayList代表的是集合类&#xff0c;集合是一种容…

《C++ Primer Plus》(第6版)第6章编程练习

《C Primer Plus》&#xff08;第6版&#xff09;第6章编程练习《C Primer Plus》&#xff08;第6版&#xff09;第6章编程练习1. 大小写转换2. 平均值3. 菜单4. 成员5. 收入所得税6. 捐款7. 统计单词8. 统计文件字符数9. 重写编程练习6《C Primer Plus》&#xff08;第6版&…

taobao.top.secret.appkey.bill.detail( 服务商解密账单查询 )

&#xffe5;免费不需用户授权 服务商解密账单查询,分页返回所有店铺的账单&#xff0c;每个店铺每天仅包含两条数据&#xff0c;当天产生的号租费 和 当天产生的通话费&#xff0c;仅对90天内的账单提供SLA保障。查询账单详情请使用taobao.top.secret.bill.detail接口。 公共参…

计算机的发展

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。个人爱好: 编程&#xff0c;打篮球&#xff0c;计算机知识个人名言&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石…

云打包苹果证书生成、上架和应用截屏攻略

在使用apicloud或hbuilderx这些跨端的开发工具开发移动应用的时候&#xff0c;假如是打包ios应用&#xff0c;是需要生成苹果证书、证书profile文件&#xff0c;和对应用上架的。首先要普及一个概念&#xff0c;苹果的应用是无法像安卓那样挂在自己的服务器上下载直接安装就可以…

C++ STL:迭代器 Iterator

文章目录1、迭代器的类型2、traitsiterator_traitstype_traits泛化的指针&#xff0c;容器与算法的桥梁。提供一种方法&#xff0c;按照一定顺序访问一个聚合对象中各个元素&#xff0c;而又不暴露该对象的内部表示。既能对容器进行遍历&#xff0c;又可以对外隐藏容器的底层实…

谷歌邮箱账号不会注册?注册失败?这份完美注册教程请收好

谷歌邮箱相信大家都不陌生吧&#xff0c;无论是用于发送和接收邮件&#xff0c;还是用于在国外网站注册&#xff0c;很多人都离不开谷歌邮箱。甚至&#xff0c;一些网站直接提供谷歌邮箱登录选项。这就是为什么很多跨境人想要注册谷歌邮箱的原因。 但是&#xff0c;大部分网友都…

Java学习之路002——面向对象编程

【说明】部分内容来源于网络&#xff0c;如有冲突&#xff0c;请联系作者删除。 一、面向对象编程(OOP) 2.1 对象和类的关系 2.2 面向对象的特征 2.2.1 封装 2.2.2 继承 2.2.3 多态 3、抽象 使用abstract关键字修饰的类或者方法 定义抽象类(使用abstract) // 1、定义抽象方法…

计数排序.

1.动图演示&#xff1a; 2.代码示例&#xff1a; package test1;import java.util.Arrays;public class Test3 {public static void main(String[] args) {int[] nums new int[]{1, 2, 1, 4, 52, 1, 4};int[] arr count_sort(nums, getMax(nums));for (int i : arr) {System…