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

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

例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)


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

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

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

🦖🐲谢谢你的阅读。🐯🦁


目录
相关文章
|
22天前
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
53 6
|
14天前
|
搜索推荐 算法
插入排序算法的平均时间复杂度解析
【10月更文挑战第12天】 插入排序是一种简单直观的排序算法,通过不断将未排序元素插入到已排序部分的合适位置来完成排序。其平均时间复杂度为$O(n^2)$,适用于小规模或部分有序的数据。尽管效率不高,但在特定场景下仍具优势。
|
20天前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
18 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
27天前
|
存储 算法
算法的时间复杂度和空间复杂度
本文详细讨论了算法的时间复杂度和空间复杂度,包括它们的概念、计算方法和常见复杂度的对比,并通过多个实例解释了如何计算算法的时间和空间复杂度。
33 0
算法的时间复杂度和空间复杂度
|
28天前
|
机器学习/深度学习 存储 算法
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
|
15天前
|
算法
[数据结构] -- 时间复杂度和空间复杂度
[数据结构] -- 时间复杂度和空间复杂度
12 0
|
27天前
|
算法 C语言
深入理解算法效率:时间复杂度与空间复杂度
深入理解算法效率:时间复杂度与空间复杂度
|
20天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
18 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
1天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
20天前
初步认识栈和队列
初步认识栈和队列
48 10