一、空间复杂度定义

空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。
一个算法在计算机存储器上所占用的存储空间,包括程序代码所占用的空间输入数据所占用的空间辅助变量所占用的空间这三个方面。

二、影响空间复杂度的因素


注意:
一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小,它包括为参数表中形参变 量分配的存储空间和为在函数体中定义的局部变量分配的存储空间两个部分。若一个算法为递归算法,其空间复杂度为递归所使用的堆栈空间的大小。它等于一次调用所分配的临时存储空间的大小乘以被调用的次数(即为递归调用的次数加1,这个1表示开始进行的一次非递归调用)
递归的空间复杂度: 每次递归所开空间*深度。

算法在运行过程中临时占用的存储空间讲解:
1、有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们称这种算法是“就地”进行的,是节省存储的算法,下面会介绍。

2、有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如快速排序和归并排序算法就属于这种情况。

三、计算方法
①忽略常数,用O(1)表示
②递归算法的空间复杂度=递归深度n*每次递归所要的辅助空间
③对于单线程来说,递归有运行时堆栈,求的是递归最深的那一次压栈所耗费的空间的个数,因为递归最深的那一次所耗费的空间足以容纳它所有递归过程。

四、例子

1、空间算法的常数阶

如上图,这里有三个局部变量分配了存储空间,所以f(n) = 1 + 1 + 1 = 3,根据上面的法则该函数不受n的影响且为常数项,所以空间复杂度记作O(1)。这种与问题的大小无关(n的多少),执行时间恒定的算法,我们称之为具有O(1)的空间复杂度,又叫常数阶。

2.空间算法的线性阶(递归算法)

如上图,这是一个递归算法(计算从n + (n-1) + (n-2) + … + 2 + 1的和)
每当执行一次该函数就会为tmp分配一个临时存储空间,所以f(n) = 1*(n-1+1) = n,函数是受n影响的所以空间复杂度记为O(n)。

3、二分查找分析

方法一(迭代法):

/// <summary>
/// 二分查找
/// </summary>
/// <param name="arr">查找数组</param>
/// <param name="len">数组长度</param>
/// <param name="num">查找项</param>
/// <returns></returns>
int BinarySearch(int[] arr,int len,int num)
{int left = 0;int right = len - 1;int mid;while (left <= right){mid = (left + right) / 2;if (arr[mid] > num)right = mid - 1;else if (arr[mid] < num)left = mid + 1;elsereturn mid;}return -1;
}

时间复杂度:
left、right、mid运算次数
f(n1) = 1 + 1 + 1 = 3
我们将While循环中的运算作为一个整体看待,每次都是折半运算次数
f(n2) = log2^n
总运行次数
f(all) = f(n1)+f(n2) = 3 + log2 ^ n
时间复杂度记为:O(log2^n)


空间复杂度:
算法中left、right、mid只创建的次数
s(n) = 1 + 1 + 1 = 3
空间复杂度记为:O(1)


方法二(递归法):

 /// <summary>
/// 二分查找(递归法)
/// </summary>
/// <param name="arr"></param>
/// <param name="left"></param>
/// <param name="right"></param>
/// <param name="num"></param>
/// <returns></returns>
int BinarySearchRecursion(int[] arr,int left,int right,int num)
{int mid = (left + right) / 2;if (left <= right){if (arr[mid] > num) {right = mid - 1;return BinarySearchRecursion(arr,left,right,num);}else if (arr[mid] < num){left = mid + 1;return BinarySearchRecursion(arr,left,right,num);}elsereturn mid;}else{return -1;}
}

时间复杂度:
运行次数 f(n) = log2 ^ n
时间复杂度记为:O(log2^n)


空间复杂度:
因为整个算法中mid只创建的次数
s(n) = log2 ^ n
空间复杂度记为:O(log2 ^ n)


4、斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……
这个数列从第3项开始,每一项都等于前两项之和。

如果设F(n)为该数列的第n项(n∈N*),那么这句话可以写成如下形式::F(n)=F(n-1)+F(n-2)

显然这是一个线性的递推数列。
通项公式 :

上面就是斐波那契数列的递推公式,这样一个完全是自然数的数列,通项公式却是用无理数来表达的。而且当n趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618

递推是公式是求解斐波那契数列的一个方法,我们当然也可以用计算机编写程序来求解。

方法一(迭代法):

/// <summary>
/// 斐波那契(迭代法)
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
int Fibonacci(int n)
{if (n <= 0)return -1;if (n == 1 || n == 2)return 1;else{int num = 0;int a = 1;int b = 1;while (n - 2 > 0){num = a + b;a = b;b = num;n--;}return num;}}

时间复杂度:
while以外的算法语句都忽略不计(不随n的变化而变化)
while算法语句所有语句
f(n) = 4 *(n - 2) = 4n - 8
时间复杂度记为:O(n)


空间复杂度:
算法中num、a、b只创建1次
s(n) = 1 + 1 + 1 = 3
空间复杂度记为:O(1)


方法二(递归法):

/// <summary>
/// 斐波那契(递归法)
/// </summary>
/// <param name="n"></param>
/// <returns></returns>
int FibonacciRecursion(int n)
{if (n <= 0)return -1;if (n == 1 || n == 2)return 1;return FibonacciRecursion(n - 1) + FibonacciRecursion(n - 2);
}

时间复杂度:
递归调用的形参有两个n - 1 和 n - 2
时间复杂度记为:O(2^n)


空间复杂度:
递归的空间复杂度 =(n + 1)* 调用的深度
空间复杂度记为:O(n)(这里可以简单的根据二叉树的层来进行计算)


算法时间空间复杂度计算—空间复杂度相关推荐

  1. 算法-时间频度 时间复杂度 空间复杂度

    Temporal Frequency& Time Complexity& Space Complexity 计算算法执行时间 时间复杂度(Time Complexity) 常数阶O(1 ...

  2. 第2章 时间空间复杂度计算

    1时间复杂度计算 时间复杂度是什么? 一个函数,用大O表示,例如:O(1), O(N), O(logN). 定性描述算法的运行时间. 时间复杂度常见图: 案例: O(1) let i = 0 i += ...

  3. 时间复杂度和空间复杂度计算(数据结构C语言实现1)

    写在前面 数据结构C语言系列,和博主一起学习简单的数据结构和算法,都是利用C语言实现,很基础,相信大家都能够学会,都有所收获.记得点赞,收获. 目录 写在前面 本节目标 基本概念 **常见算法的时间复 ...

  4. (二) 时间/空间复杂度计算

    时间/空间复杂度计算 时间复杂度是什么? O(1) O(n) O(1)+O(n)=O(n) O(n)*O(n)=O(n^2) O(logN) 空间复杂度是什么? O(1) O(n) O(n^2) 思考 ...

  5. java中怎么计算算法的时间复杂度_算法的时间复杂度和空间复杂度计算

    一.算法的时间复杂度定义 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级.算法的时间复杂度,也就是算法的时间量度.记作:T(n) ...

  6. 排序--Bubble的优化和性能(算法时间、空间复杂度、稳定性)分析

    一.算法基本思想 (1)基本思想 冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分:下一次继续 ...

  7. 数据结构与算法 1.算法与数据结构的关系,以及算法时间、空间复杂度的概 念及其度量方法

    文章目录 前言 一. 数据结构 1.1 概念: 1.2 数据结构分类(逻辑结构和物理结构两大类) 1.2.1 逻辑结构 1.2.2 物理结构 二. 算法 2.1 概念 2.2 算法初体验 2.3 算法 ...

  8. 计算算法的时间复杂度和空间复杂度

    算法的时间复杂度和空间复杂度-总结 通常,对于一个给定的算法,我们要做 两项分析.第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式.数学归纳法等.而在证明算法 ...

  9. 时间和空间复杂度计算

    目录 本章目标 理解时间空间复杂度 计算时间复杂度 计算空间复杂度 计算练习 1.1常见时间复杂度计算举例 例1 例2 例3 例4 例5 1.2常见空间复杂度的计算 例1 例2 例3 本章目标 1.什 ...

最新文章

  1. MYSQL_使用外键约束(constraint)或触发器(trigger)来进行级联更新、删除
  2. suse 11 oracle 10g,suse11+oracle10g安装
  3. html移动端怎么做城市选择,移动端页面单位的选择(px, em, rem, vw)
  4. 群晖能从linux备份数据吗,通过rsync将Linux服务器数据备份到群晖
  5. [ubuntu] duplicated values in $PATH
  6. 一个产品从立项到上线流程总结
  7. 关于FeedSky话题广告
  8. ConcurrentHashMap的使用场景
  9. 怎么使用pyd 文件
  10. ASP.NET_母版页嵌套母版页
  11. 二叉树的父子节点位置关系
  12. php mysql抽奖转盘_PHP微信转盘抽奖前后台 数据库完整示例
  13. Bounding box regression RCNN我的理解
  14. C语言农历天干地支,农历一百年算法(1921~2021)【C语言代码】
  15. [转帖]国产闪存颗粒终于熬出头 紫光存储S100固态硬盘评测
  16. Towards Robust Vision Transformer论文学习(CVPR2022)
  17. html怎么让图片自动动起来,使用css让图片动起来
  18. 垃圾收集器调优相关参数
  19. 借助 Material Design,帮助您打造更好的无障碍应用 (中篇)
  20. Whoosh:Python 的轻量级搜索工具

热门文章

  1. 欧洲首个开放RAN天线测试中心于2023年3月启用
  2. gedit命令和vim异常退出处理
  3. 10款冬季主题颜色分级预设(lut预设)
  4. python基于io流的tkinter管理系统
  5. Jira Windows 安装教程(2022.12)
  6. 手机软件开发入门 - 中国象棋(1)090308
  7. C语言:任意从键盘输入一个三位整数,要求正确分离它的个位,十位和百位数,并分别在屏幕上输出。
  8. html电气自动化专业学吗,电气工程及其自动化难学吗 适合哪些人学
  9. 用python语言实现喇叭发声原理_用Python实现喇叭天线设计小工具(三)
  10. android ---- 多渠道、多模块下自动化发布maven