空间复杂度

定义

        空间复杂度是对算法运行过程中临时占用空间大小的度量,一个算法所需的存储空间用 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

递归算法的时间复杂度明显高于动态规划算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值