复杂度的简易求法(时间复杂度,空间复杂度)

本文详细介绍了如何计算算法的时间复杂度和空间复杂度,通过Fibonacci数的三种求法为例,阐述了时间复杂度以最坏情况运行次数最多来衡量,而空间复杂度关注程序额外创建的临时空间。总结指出,时间复杂度计算取影响最大的运行次数,空间复杂度关注临时空间占用,且常数级空间复杂度为O(1)。

算法复杂度

前言:

算法复杂度包括时间复杂度和空间复杂度,它是用来衡量一个程序效率的,本文主要讲解简易计算程序复杂度的方法。


1.时间复杂度

时间复杂度,大家可能看到时间就会以为,时间复杂度的计算是计算程序运行时间。其实不然,一个程序的运行时间取决于很多因素,包括计算机的优劣等,同一个程序在不同的计算机上所用时间是不同的,那么想要计算时间复杂度肯定不能通过运行所需时间来判断了。

**时间复杂度:**一般将算法基本运算的执行次数作为时间复杂度的度量标准。

给出一个问题,我们会有多种算法去解决问题,不同算法的时间复杂度不同,时间复杂度越低,程序执行效率越高。

用一个求Fibonacci数的例子来说明:

size_t Fibonacci1(size_t n)//第一种求法
{
    if(n<=2)
        return 1;
    else 
        return Fibonacci1(n-1)+Fibonacci1(n-2);
}
size_t Fibonacci2(size_t n)//第二种求法
{
    size_t arr[n+1];//创建一个数组
    arr[1]=1;
    arr[2]=1;
    for(int i=3;i<=n;i++)
    {
        arr[i]=arr[i-1]+arr[i-2];
    }
    return arr[n];
}
size_t Fibonacci3(size_t n)//第三种求法
{
    if(n<=2)
    return 1;
    else
    {
        int s1=1;int s2=1;
        for(i=3;i<n;i++)
        {
            s2=s1+s2;//给s2赋新值(两项和)
            s1=s2-s1;//记录前一项
        }
    }
   return s2;
}

上面给出了三种求法:

复杂度的求法:一般依最差情况来求,就是算那个程序运行可能最多次数的情况。

(1)第一种求法用了递归的思想,大家可以算一算其时间复杂度,答案是2n, 也就是O(2n),这个运算量是相当大的,也就是指数爆炸。程序员应该避免这种算法。

具体求法
在这里插入图片描述

这是大致求的和,不是完整的公比为2的等比数列求和,但是我们可以知道结果包含2n,当n趋近于无穷,其它的变量式可以忽略不记,只看影响最大的变量式。

(2)第二种是以空间换取时间的一种求法,建立一个了数组来求。那么它的时间复杂度是多少呢?答案是O(n)。

具体求法:

可以看到这个程序里,运行次数最多的是for循环,所以只看for循环即可,共运行n-2次,当n趋近于无穷,2的影响忒小,所以忽略。答案为O(n)。

(3)第三种和第二种一样,时间复杂度也为O(n),求法一样。大家自行计算。

通过上面的三个例子,相信大家对时间复杂的求解有了一定的了解,下面做个小小的总结。

总结:

时间复杂度的计算,主要依据最坏情况(运行次数最多)来考虑,计算出的运行次数取其中影响最大的式子作为时间复杂度。比如2n+1,取结果为O(n),2n+2n+2,取结果为O(2n),如果是常数次,取结果为O(1)。

2.空间复杂度

空间复杂度,主要看程序所创建的临时空间(辅助空间)。一个程序所占的空间包括程序自身所占空间;输入,输出所占空间;额外所需的临时空间(辅助空间)。

程序自身所占空间和输入,输出所占空间是必须的,它的存在不作为考量空间复杂度的因素,主要是看那些额外创建的空间大小。

还是那上面的三个程序做例子

程序(1)空间复杂度是多少呢?

也许有人脱口而出,O(2n),其实不然,函数递归创建函数是在栈区,栈区其实并不大,如果空间复杂度为O(2n),是不是早就栈溢出了呢?

答案是O(n),这还是最坏情况,再进行函数递归时,会创建n-1个函数,就是Fibonacci(1)到Fibonacci(n-1),对吧?在栈区上创建了这些函数,只有在递归结束时才会释放,所以它不会调用一个完了,就立马销毁。并不是代码跑一次,就创建两个函数,是可以往复利用的。所以讲到这,大家应该就明白了程序(1)为什么空间复杂的是O(n)。

程序(2)

空间复杂度也是O(n),因为它在程序里额外创建了一个数组,数组的大小是n+1,所以空间复杂度为O(n)。

程序(3)空间复杂度是多少?

怕大家说是O(n)啊,空间复杂度是O(1)。因为就创建了临时两个变量,常数次所以空间复杂度是O(1)。

总结

空间复杂度主要取决于程序创建的临时空间,同样取影响最大的表达式,这点和时间复杂度一样。


以上就是本文所有内容。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VnKXBgkc-1634880325352)(C:\Users\Q\AppData\Roaming\Typora\typora-user-images\image-20211022132424935.png)]
空间复杂度主要取决于程序创建的临时空间,同样取影响最大的表达式,这点和时间复杂度一样。


以上就是本文所有内容。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

动名词

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值