// 计算阶乘递归Factorial的时间复杂度?
long long Fac(size_t N)
{
if (0 == N) // 递归算法:递归次数N * 每次递归调用的次数(常数次,记为1)
return 1;
// 递归N次,时间复杂度 O(N)
return Fac(N - 1) * N;
//}
斐波那契数列的时间复杂度?
long long Fib(size_t N)
{
if (N < 3)
return 1;
// O(N)
return Fib(N - 1) + Fib(N - 2);
}
int main()
{
printf("%lld", Fib(10));
printf("%lld", Fib(20));
printf("%lld", Fib(30));
printf("%lld", Fib(40));
printf("%lld", Fib(50));
return 0;
}
主函数调用一下Fib,40之前速度还可以,到50开始就很慢了
所以实际中无用,效率太低
**
二 、 空间复杂度
**
空间复杂度是对一个算法在运行过程中临时占用额外存储空间大小的量度,不是程序占用了多少bytes的空间
所以空间复杂度算的是 变量 的个数。
空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法。
// 计算BubbleSort的空间复杂度?
void BubbleSort(int* a, int n)
{
assert(a); // 计算 **额外** 变量的个数
for (size_t end = n; end > 0; --end) //此处end是1个
{
int exchange = 0;
for (size_t i = 1; i < end; ++i) //i是1个
{ //每次进入for循环,i生成,退出销毁,再进入生成用的是和上一次同一块空间
if (a[i - 1] > a[i])
{
Swap(&a[i - 1], &a[i]);
exchange = 1; // exchange是1个
}
}
if (exchange == 0)
break;
}
}
end + i + exchange共3个,空间复杂度O(1) - 3是常数个,也就是O(1)
// 计算Fibonacci的空间复杂度?
long long* Fibonacci(size_t n)
{
if (n == 0)
return NULL;
long long* fibArray = (long long*)malloc((n + 1) * sizeof(long long));
fibArray[0] = 0; // 从0和1可以得到2
fibArray[1] = 1; // 从1和2可以得到3
for (int i = 2; i <= n; ++i)
{ // 从n-1和n-2得到n,最后返回数组地址
fibArray[i] = fibArray[i - 1] + fibArray[i - 2];
}
return fibArray;
}
空间复杂度O(N),实际是N+1+i等,后面常数,只剩N
时间复杂度O(N),相比于只有递归O(2^N),优化很多
// 计算阶乘递归Factorial的空间复杂度?
long long Fac(size_t N)
{
if (0 == N)
return 1;
return Fac(N - 1) * N;
}
//计算斐波那契递归Fibonacci的空间复杂度?
long long Fib(size_t N)
{
if (N < 3)
return 1;
return Fib(N - 1) + Fib(N - 2);
}
空间复杂度 - 求递归深度
空间可以重复利用,不累计
时间一去不返,不可累计