数据结构-复杂度计算经典案例(二)

简介: 数据结构-复杂度计算经典案例(二)

递归算法如何计算时间复杂度:

递归次数*每次递归调用的次数

例题7:阶乘递归

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


image.png

例题8:斐波那契数列

// 计算斐波那契递归Fib的时间复杂度?
long long Fib(size_t N)
{
  if (N < 3)
    return 1;
  return Fib(N - 1) + Fib(N - 2);
}
复制代码

image.png


虽然F(n-1)和F(n-2)都在F(N)的递归里面,但是他们不是同时调用的,是先调用完F(n-1)之后再调用F(n-2)


所以递归调用的次数为:1


空间复杂度经典例题分析


例题1:冒泡排序

// 计算BubbleSort的空间复杂度?
void BubbleSort(int* a, int n)
{
  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;
  }
}
复制代码


额外开辟常量个空间:i和exchange和end


每次进入内循环时,exchange变量和i变量创建空间,出了内循环后,空间销毁。然后不断循环n次。**再一次创建是在同一个地方创建,本质上相当于没有销毁。**只占了那一个空间,所以时间复杂度是O(1)而不是O(N),



例题2:斐波那契数列-循环版


// 计算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;
}
复制代码


额外开辟了n+1个空间的数组,空间复杂度为:0(N)

时间复杂度也是0(N),循环共执行了N-1次



例题3:求n的阶乘-递归


==递归中:栈帧的消耗看递归的深度==

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

image.png

==每次递归调用都开辟函数栈帧==,共开辟N个栈帧,每个栈帧使用了常数个空间。所以空间复杂度为:O(N)


经典名句:空间是可以重复利用的,但是时间是一去不复返的


例题4:斐波那契数列-递归版

// 计算斐波那契递归Fib的空间复杂度?
long long Fib(size_t N)
{
  if (N < 3)
    return 1;
  return Fib(N - 1) + Fib(N - 2);
}
复制代码

image.png


最多创建N个栈帧,后序开辟的都不会比N多


所以空间复杂度为:O(N)


==递归中:栈帧的消耗看递归的深度==



常见复杂度对比

image.png


时间复杂度和空间复杂度例题就讲解到这里啦,如果对你有所帮助的话,欢迎三连支持一下博主!欢迎各位大佬批评指正!


相关文章
|
1月前
|
机器学习/深度学习 存储 算法
【初阶数据结构篇】时间(空间)复杂度
复杂度是计算机科学中的一个基础概念,它帮助我们理解和评估算法的效率,对于算法设计和优化至关重要。
【初阶数据结构篇】时间(空间)复杂度
|
1月前
|
算法
【初阶数据结构】复杂度算法题篇
该方法基于如下的事实:当我们将数组的元素向右移动 k 次后,尾部 kmodn 个元素会移动至数组头部,其余元素向后移动 kmodn 个位置。
|
2月前
|
机器学习/深度学习 存储 算法
【数据结构】算法的复杂度
算法的时间复杂度和空间复杂度
50 1
【数据结构】算法的复杂度
|
1月前
|
存储 算法
【数据结构】复杂度(长期维护)
【数据结构】复杂度(长期维护)
|
3月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
3月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
3月前
|
存储 算法 测试技术
数据结构学习记录——树习题-Complete Binary Search Tree(题目描述、输入输出示例、数据结构的选择、核心算法、计算左子树的规模)
数据结构学习记录——树习题-Complete Binary Search Tree(题目描述、输入输出示例、数据结构的选择、核心算法、计算左子树的规模)
65 1
|
3月前
数据结构学习记录——平衡二叉树的调整(基本介绍、右单旋、左单旋、左右双旋、右左双旋、平衡因子的计算)
数据结构学习记录——平衡二叉树的调整(基本介绍、右单旋、左单旋、左右双旋、右左双旋、平衡因子的计算)
26 1
|
3月前
|
算法
数据结构和算法学习记录——时间复杂度的计算(嵌套循环、大O的渐进表示法、双重循环、常数循环、strchr、冒泡排序、二分查找、斐波那契数列递归)
数据结构和算法学习记录——时间复杂度的计算(嵌套循环、大O的渐进表示法、双重循环、常数循环、strchr、冒泡排序、二分查找、斐波那契数列递归)
207 1
|
4月前
|
存储 算法 C语言
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)(上)
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)
52 2