浅识数据结构之空间复杂度

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。

文章目录

  • [一. 前言](#一. 前言)
  • [二. 空间复杂度](#二. 空间复杂度)
    • [2.1 概念](#2.1 概念)
    • [2.2 常见的空间复杂度](#2.2 常见的空间复杂度)
    • [2.3 不常见的空间复杂度,并无实际应用意义。](#2.3 不常见的空间复杂度,并无实际应用意义。)
  • [三. 结语](#三. 结语)

一. 前言

了解 空间复杂度相对于了解 时间复杂度来说较为容易一些。
  因为 时间复杂度需要对程序内部或函数内部的基本语句执行次数进行判断,又时会牵扯到递归,迭代,循环等多重因素,所以计算起来相对复杂。
  而 空间复杂度只是代表着对一个算法在运行过程中 临时占用的储存空间大小的一个量度,并且这个临时的占用大多是指除了主体函数原有的变量之外,再实现算法时额外创建的变量,或是指在 递归等函数调用情况下的函数调用次数。
  下面进入正式内容。

二. 空间复杂度

2.1 概念

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。
   空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。
   空间复杂度计算规则基本跟实践复杂度类似,也使用 大O渐进表示法。
   注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
   大O渐进表示法:取影响量最大的项作为O( )的内容,且系数可以忽略。

2.2 常见的空间复杂度

O( 1 ) :常数值的空间复杂度,一般是指调用函数次数或额外创建变量次数可以通过计数的方式的到确切的值。
   O( N ):一般指递归次数为 N 或创建额外变量次数为 N 时的情形。
   O( N² ) :这种情形相对来说较为少见,但还是作为举例列明,常见的状况有创建了一个额外的二维数组,他们的额外占用空间为未知量一维数组的个数 N × 未知量一维数组中的个数 M,故空间复杂度为 N²,因 N 趋近于无穷时 N 与 M 的差值可以忽略不计 ,直接记为 N²。

2.3 不常见的空间复杂度,并无实际应用意义。

下面见一个经典的斐波那契数问题:

c 复制代码
// 计算斐波那契递归Fib的时间复杂度?
long long Fib(size_t N)
{
	if(N < 3)
	return 1;
	return Fib(N-1) + Fib(N-2);
}

当我们调用这个函数时,若所求值为第64个斐波那契数时还较为容易计算,不难看出在计算结果时,我们的函数调用了2 ^ ( 64 - 2 ) 次,故我们可以将此函数调用的空间复杂度记为O ( 2^N ) 当我们计算的数值序次偏大时,可能会消耗更多的时间,故这样的函数在实际生活中也并没有很大的应用意义。

但我们可以对其进行优化,将O ( 2^N ) 转化为 O( N )。

c 复制代码
// 时间复杂度:O(N)
unsigned long long Fib(size_t N)
{
	unsigned long long f1 = 1;
	unsigned long long f2 = 1;
	unsigned long long f3 = 0;
	for (size_t i = 3; i <= N; i++)
	{
		f3 = f1 + f2;
		f1 = f2;
		f2 = f3;
	}

	return f3;
}

此时即使计算1000位次的斐波那契数也毫无鸭梨!!

三. 结语

十分感谢您观看我的原创文章。
  本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
  如需引用,注明地址。

相关推荐
Tisfy11 小时前
LeetCode 3740.三个相等元素之间的最小距离 I:今日先暴力,“明日“再哈希
算法·leetcode·哈希算法·题解·模拟·遍历·暴力
汀、人工智能11 小时前
[特殊字符] 第77课:最长递增子序列
数据结构·算法·数据库架构·图论·bfs·最长递增子序列
网域小星球11 小时前
C语言从0入门(十)|二维数组详解与矩阵实战
c语言·算法·矩阵·二维数组·数组遍历
澈20711 小时前
堆排序:高效构建大顶堆实战
数据结构·算法·排序算法
chh56312 小时前
C++--内存管理
java·c语言·c++·windows·学习·面试
Yungoal12 小时前
C++ 标准模板库STL(Standard Template Library)
c++·哈希算法·散列表
我真不是小鱼12 小时前
cpp刷题打卡记录27——无重复字符的最长子串 & 找到字符串中所有字母的异位词
数据结构·c++·算法·leetcode
XuecWu312 小时前
原生多模态颠覆Scaling Law?解读语言“参数需求型”与视觉“数据需求型”核心差异
人工智能·深度学习·算法·计算机视觉·语言模型
We་ct12 小时前
LeetCode 69. x 的平方根:两种解法详解
前端·javascript·算法·leetcode·typescript·平方
一直不明飞行12 小时前
C++:string,写法s.find(‘@‘) != s.end()是否有问题
开发语言·c++·算法