1.2 数据结构 算法空间复杂度

文章目录

  • 2.空间复杂度
    • 举例

2.空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。
空间复杂度算的是变量个数
空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

举例

 assert(a);
 for (size_t end = n; end > 0; --end)
 {
 int exchange = 0;
 for (size_t i = 1; i < end; ++i)
 {
 if (a[i-1] > a[i])
 {
 Swap(&a[i-1], &a[i]);
 exchange = 1;
 }
 }
 if (exchange == 0)
 break;
 }
}

O(1)
有开辟额外空间:end,i;但其都是常数个,所以是O(1)

// 计算Fibonacci的空间复杂度?
// 返回斐波那契数列的前n项
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;
 fibArray[1] = 1;
 for (int i = 2; i <= n ; ++i)
 {
 fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
 }
 return fibArray;
}

O(N)
有开辟额外空间:n+1;忽略掉1,所以是O(n)

// 计算阶乘递归Fac的空间复杂度?
long long Fac(size_t N)
{
 if(N == 0)
 return 1;
 
 return Fac(N-1)*N;
}

1.2 数据结构 算法空间复杂度_第1张图片
最好的情况:O(1) K=N*x(x>=1) k%N == 0 K是N的倍数时,不需要旋转
最坏的情况:O(N^2) K%N==N-1时,N是数组长度

怎么样时间复杂度和空间复杂度是O(N)呢?
方法:空间换时间
1.2 数据结构 算法空间复杂度_第2张图片
4.
计算阶乘递归Fac的空间复杂度

long long Fac(size_t N)
{
 if(N == 0)
 return 1;
 
 return Fac(N-1)*N;
}

O(N)
递归调用N次,使用N个栈帧,每个栈帧都使用了常数个空间,所以空间复杂度是O(N)
5.
计算斐波那契递归Fib的时间复杂度

long long Fib(size_t N)
{
if(N<3)
  return 1;

return Fib(N-1)+Fib(N-2);
}

O(N)
1.2 数据结构 算法空间复杂度_第3张图片

你可能感兴趣的:(数据结构,数据结构,算法)