定义
空间复杂度是对算法运行过程中临时占用空间大小的度量,一个算法所需的存储空间用 f (n) 表 示,可得出 S(n) = O(f(n)) ,其中 n 为问题的规模, S(n) 表示空间复杂度。通常用 S(n) 来定义。
常见空间复杂度介绍
- 常数阶 O(1) : 常量空间,用于算法使用的存储空间大小固定,和输入规模没有直接关系的场景
- 线性阶 O(n):线性空间,用于算法使用的存储空间是线性集合(比如列表)的情况,线性集合的大小和输入规模n成正比。另外,一般的递归操作相关的空间复杂度也大多跟递归深度n之间的复杂度为线性阶O(n)
- 平方阶 O(n^2):而为空间,用于算法使用的存储空间是而为列表集合的情况,二维列表的两个纬度的大小都与输入规模n成正比。
时间空间相互转换
对于一个算法来说,它的时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能需要消耗更多的储存空间。 反之,如果追求较好的空间复杂度,算法执行的时间可能就会变长。
例如,动态规划算法,动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其他的算法。
动态规划算法 用空间换时间
# -*- coding:utf-8 -*-
import time
def fib(n):
if n == 0 or n == 1:
return 1
else:
return (fib(n - 1) + fib(n - 2))
def fibdp(n,memn):
if memn[n]!=-1:
#print(memn[n-1])
return memn[n]
else:
memn[n]=fibdp(n - 1,memn) + fibdp(n - 2,memn)
#print(memn[n])
return memn[n]
n=int(input("请输入一个n值:"))#输入字符串,需转换为整型数据
memn = [-1] * (n + 1)
memn[0] = 1
memn[1] = 1
start_time = time.time()
result = fibdp(n, memn)
t = time.time() - start_time
print("fibdpresult=", result, "time=", t)
start_time = time.time()
result = fib (n)
t = time.time() - start_time
print("fibresult=",result,"time=",t)
结果
分析很明显 动态时间几乎为零,递归的用的时间已经很大了,为了对比明显 一些,再运行一些动态输入数据为444的,这样对比会更加明显
![]()
不难发现444的动态规划时间大致为0.001,21的递归为0.005
递归算法的时间复杂度明显高于动态规划算法。