时间复杂度与空间复杂度

T(n) = O(f(n))
什么是时间复杂度;
一句话就是程序一行一行执行完所需要的时间(书上解释是程序基本执行次数的统计)
设T(n)为程序基本操作执行次数的函数(也可以认为是程序的相对执行时间函数),n为输入的规模。
对于for循环,你需要看什么,看两个东西吧,一个是输出的量,一个是遍历的次数

def eat1(n):
    for i in range(n):
        print("等待1min")
        print("等待1min")
        print("吃1cm面包")

'''
什么是时间复杂度
一句话就是程序一行一行执行完所需要的时间(书上解释是程序基本执行次数的统计)
设T(n)为程序基本操作执行次数的函数(也可以认为是程序的相对执行时间函数),n为输入的规模。
对于for循环,你需要看什么,看两个东西吧,一个是输出的量,一个是遍历的次数
'''
def eat2(n): # T(n)=5logn
    '''
    每5分钟吃掉面包的一半
    '''
    while n > 1:
        print("等待1min")
        print("等待1min")
        print("等待1min")
        print("等待1min")
        print("吃一半面包")
        n /= 2


def eat3(n): # T(n) = 2
    print("等待1min")
    print("吃一个鸡腿")


def eat4(n):
    '''
    吃掉第一个1厘米要1分钟,吃掉第二个1厘米比前面多一分钟
    若是10cm,那么就是1+2+3+4+5+6+7+8+9+10=55
    若是n里面,那么就是 (1+n)*n/2=0.5n*2+0.5n
    
    '''
    for i in range(n):# T(n) = 0.5n*2 + 0.5n
        for j in range(i):
            print("等待1min")
        print("吃1cm面包")


eat4(16)



空间复杂度;S(n)=O(f(n))
空间复杂度是对一个运算在运行过程中临时占用存储空间大小的量度 使用大O表示法;S(n)=O(f(n)),其中n为问题的规模,f(n)为算法所占存储空间的函数
def fun1(n):
    '''
    当算法的存储空间大小固定,和输入规模没有直接的关系时(输入规模是这里的n吧)
    空间复杂度记作O(1)
    '''
    i = 3
    # do something


def fun2(n):
    '''
    这些前人命名真的挺有趣的
    当算法分配的空间是一个线性的集合(如列表)
    并且集合大小和输入规模n成正比时
    空间复杂度记作O(n)
    '''
    array = [0] * n
    return array
    # do something


def fun3(n):
    '''
    当算法分配的空间是一个二维列表集合
    并且集合的长度和宽度都与输入规模n成正比时
    空间复杂度记为O(n*2)
    '''
    matrix = [[0] * n] * n
    # do something


def fun4(n):
    '''
    递归空间:虽然递归代码中并没有显式地声明变量或集合
    但是计算机在执行程序时,会专门分配一块内存,用来存储"函数调用栈"
    函数调用栈包括进栈和出栈两个行为
    当进入一个新函数时,执行入栈操作,把调用地函数和参数信息压入栈中
    当函数返回时,执行出栈操作,把调用的函数和参数信息从栈中弹出
    递归算法的空间复杂度与递归的深度有关,如果递归的深度是n,那么空间复杂度就是O(n)
    '''
    if n > 0:
        fun4(n-1)
    # do something


a = fun2(10)
print('0的列表长啥样',a)


对空间复杂度的补充:

一个算法在运行过程中临时占用存储空间大小的量度。

包括

算法本身所占用的存储空间(代码量的多少了)
算法的输入输出数据所占用的存储空间(由传进去的参数所决定)
算法在运行过程中临时占用的存储空间这3方面。(就地进行的,节省存储,创建存储空间,扩大了存储)

算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。

存储算法本身所占用的存储空间与算法书写的长短比成正比,要想压缩这方面的存储空间,就必须编写较短的算法

算法在运行过程中临时占用的存储空间因算法而异。这句话说的。有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,称这种算法是"就地"进行的,是节省存储的算法。

posted @ 2021-09-09 14:46  索匣  阅读(64)  评论(0编辑  收藏  举报