算法复杂度
前言:
算法复杂度包括时间复杂度和空间复杂度,它是用来衡量一个程序效率的,本文主要讲解简易计算程序复杂度的方法。
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)]
空间复杂度主要取决于程序创建的临时空间,同样取影响最大的表达式,这点和时间复杂度一样。
以上就是本文所有内容。

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

&spm=1001.2101.3001.5002&articleId=120903999&d=1&t=3&u=1a47d82841b9410f918e2345bdfb65db)
7235

被折叠的 条评论
为什么被折叠?



