【数据结构与算法】时间复杂度与空间复杂度(下)

简介: 【数据结构与算法】时间复杂度与空间复杂度(下)

例6.二分算法的时间复杂度

1. // 计算BinarySearch的时间复杂度?
2. int BinarySearch(int* a, int n, int x)
3. {
4. assert(a);
5. int begin = 0;
6. int end = n-1;
7. // [begin, end]:begin和end是左闭右闭区间,因此有=号
8. while (begin <= end)
9.     {
10. int mid = begin + ((end-begin)>>1);
11. if (a[mid] < x)
12.             begin = mid+1;
13. else if (a[mid] > x)
14.             end = mid-1;
15. else
16. return mid;
17.     }
18. return -1;
19. }

最好情况:

第一次就找到了,所以时间复杂度:O(1)

最坏情况:

找到就剩最后一个数才找到

设数组中有N个数,一共找了X次

所以

     N/(2*2*2*2.....*2)=1

    一共X个2,即:2^X=N  ->  X=logN(注意这是一个简写,真正的意思是以2为底的N的对数)

所以取最坏情况 ,时间复杂度:O(logN)


例7.阶乘递归Fac的时间复杂度

1. long long Fac(size_t N)
2. {
3. if(0 == N)
4. return 1;
5. return Fac(N-1)*N;
6. }

不难看出一共会递归N次,所以时间复杂度为:O(N)    


例8.斐波那契递归的时间复杂度

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

对于这种较复杂的时间复杂度的计算可以通过画图来观察;

 

三角形那一块是缺失的部分;

通过上图我们发现,一共会执行F(N)=2^N-X(这个X是一个常数)

所以时间复杂度:O(2^N)


四.常见时间复杂度对比

一般算法常见的复杂度如下:


五.空间复杂度

概念

1.空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度;

2.空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数;

3.空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法;

注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

例1

1. // 计算BubbleSort的空间复杂度?
2. void BubbleSort(int* a, int n)
3. {
4. assert(a);
5. for (size_t end = n; end > 0; --end)
6.     {
7. int exchange = 0;
8. for (size_t i = 1; i < end; ++i)
9.         {
10. if (a[i-1] > a[i])
11.             {
12. Swap(&a[i-1], &a[i]);
13.                 exchange = 1;
14.             }
15.         }
16. if (exchange == 0)
17. break;
18.     }
19. }

显然上面的代码带上形参共有5个变量,根据大O渐进法的规则,空间复杂度:O(1);

例2

1. // 计算Fibonacci的空间复杂度?
2. // 返回斐波那契数列的前n项
3. long long* Fibonacci(size_t n)
4. {
5. if(n==0)
6. return NULL;
7. long long * fibArray = (long long *)malloc((n+1) * sizeof(long long));
8.     fibArray[0] = 0;
9.     fibArray[1] = 1;
10. for (int i = 2; i <= n ; ++i)
11.     {
12.         fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
13.     }
14. return fibArray;
15. }

上述代码除了5个变量外,还有malloc函数开辟的n+1个空间,F(N)=n+6,

即空间复杂度:O(n)

例3

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

这是一个递归,每次进入递归时都会再次创建变量,建立栈帧,返回时销毁变量,上述代码啊一共会递归N次,所以会创建N个变量,

即空间复杂度:O(N)


😸😼到此本篇文章就结束了,这是数据结构的第一篇文章,往后也会继续更新的;🤖👻

🥰😍若本篇文章有错误或是有建议,欢迎小伙伴们提出哦;😄🤩

😃😁希望各位大佬们多多支持博主~🤩😍

🦖🐲谢谢你的阅读。🐯🦁


目录
相关文章
|
3月前
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
83 6
|
3月前
|
搜索推荐 算法
插入排序算法的平均时间复杂度解析
【10月更文挑战第12天】 插入排序是一种简单直观的排序算法,通过不断将未排序元素插入到已排序部分的合适位置来完成排序。其平均时间复杂度为$O(n^2)$,适用于小规模或部分有序的数据。尽管效率不高,但在特定场景下仍具优势。
|
3月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
50 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
3月前
|
存储 算法
算法的时间复杂度和空间复杂度
本文详细讨论了算法的时间复杂度和空间复杂度,包括它们的概念、计算方法和常见复杂度的对比,并通过多个实例解释了如何计算算法的时间和空间复杂度。
199 0
算法的时间复杂度和空间复杂度
|
3月前
|
机器学习/深度学习 存储 算法
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
|
3月前
|
算法
[数据结构] -- 时间复杂度和空间复杂度
[数据结构] -- 时间复杂度和空间复杂度
26 0
|
3月前
|
算法 C语言
深入理解算法效率:时间复杂度与空间复杂度
深入理解算法效率:时间复杂度与空间复杂度
|
7天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
133 80
|
3天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
4天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。