‘壹’ 1到100的阶乘之和 编出C语言程序后, 请问其时间复杂度怎么求
时间复杂度:T(n) = O(f(n));
f(n)表示算法中基本操作重复执行的次数,算法执行时间的增长率和f(n)增长率相同
阶乘核心算法:
for(i=1;i<=100;i++)
{
for(j=2;j<=i;j++)
{
temp=temp*j;
}
sum+=temp;
temp=1;
}
循环的次数为:0+1+2+3+。。+99
时间复杂度为:O(4950)
‘贰’ 算法的时间复杂度是什么
算法的时间复杂度,是一个用于度量一个算法的运算时间的一个描述,本质是一个函数。
根据这个函数能在不用具体的测试数据来测试的情况下,粗略地估计算法的执行效率,换句话讲时间复杂度表示的只是代码执行时间随数据规模增长的变化趋势。
常用大O来表述,这个函数描述了算法执行所要时间的增长速度,记作f(n)。算法需要执行的运算次数(用函数表示)记作T(n)。存在常数 c 和函数 f(n),使得当 n >= c 时 T(n) <= f(n),记作 T(n) = O(f(n)),其中,n代表数据规模也就是输入的数据。
时间复杂度如何计算
1、常量阶:只要代码的执行时间不随 n 的增大而增长,这样代码的时间复杂度都记作 O(1)。或者说,一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)。
2、线性阶、n方阶:一般情况下,如果循环体内循环控制变量为线性增长,那么包含该循环的算法的时间复杂度为O(n),线性阶嵌套线性阶的算法时间复杂度为O(nⁿ),涉及下文乘法法则。
3、线性对数阶:当一个线性阶代码段法嵌套一个对数阶代码段,该算法的时间复杂度为O(nlogn)。
4、指数阶和阶乘阶:根据函数,随着n的增加,运行时间会无限急剧增加,因此效率非常低下。
‘叁’ 由递归方式求的N的阶乘(即N,),时间复杂度是多少
每次递归内部计算时间是常数,故O(n)。
用递归方法计算阶乘,函数表达式为f(n)=1 若n=0 f(n)=n*f(n-1),若n>0,如果n=0,就调用1次阶乘函数,如果n=1,就调用2次阶乘函数,如果n=2,就调用3次阶乘函数,如果n=3,就调用4次阶乘函数。
(3)n的阶乘算法的复杂度扩展阅读:
注意事项:
利用递归树方法求算法复杂度,其实是提供了一个好的猜测,简单而直观。在递归树中每一个结点表示一个单一问题的代价,子问题对应某次递归函数调用,将树中每层中的代价求和,得到每层代价,然后将所有层的代价求和,得到所有层次的递归调用总代价。
递归树最适合用来生成好的猜测,然后可用代入法来验证猜测是否正确。当使用递归树来生成好的猜测时,常常要忍受一点儿不精确,因为关注的是如何寻找解的一个上界。
‘肆’ 算法时间复杂度
O(N!)、O(2 N)、O(N 2)、O(NlogN)、O(N)、O(logN)、O(1)...
代表: 最坏情况的用时
一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。
N 的 N 次方,^ 是上标的意思
如果 aˣ = N(a>0,且a≠1),那么数 x 叫做以 a 为底 N 的对数,记作 x=logaN,读作以 a 为底 N 的对数,其中 a 叫做对数的底数,N 叫做真数。
其中 x 是自变量,函数的定义域是(0,+∞),即 x>0。它实际上就是指数函数的反函数,可表示为 x= aʸ 。因此指数函数里对于 a 的规定,同样适用于对数函数。
描述算法复杂度时,常用o(1), o(n), o(logn), o(nlogn)表示对应算法的时间复杂度,是算法的时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。
O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。
时间复杂度为O(n),就代表数据量增大几倍,耗时也增大几倍,线性增长,比如常见的:
时间复杂度O(n^2),就代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。比如:
O(nlogn)同理,就是n乘以logn,当数据增大256倍时,耗时增大256*8=2048倍。这个复杂度高于线性低于平方。比如:
当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。比如:
O(1)就是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 比如:
代入 N 以后的数值,和耗时的关系, 10 ^ 8 => 秒级 ,最大的 N 分别是:
‘伍’ 求整数n(n>=0)阶乘的算法如下,其时间复杂度:
#include<stdio.h>
int main(void)
{
int i,s=1;
printf("Please input a intdata:");
scanf("%d",&i);
for(;i>1;i--)
s*=i;
printf("%d ",s);
return 0;
}
这是一个递归程,可以看出每递归一次n的规模小一,所是结果是线性的。