目录

本章目标

理解时间空间复杂度

计算时间复杂度

计算空间复杂度

计算练习

1.1常见时间复杂度计算举例

例1

例2

例3

例4

例5

1.2常见空间复杂度的计算

例1

例2

例3


本章目标

1.什么是时间复杂度和空间复杂度。

2.为什么要有时间复杂度和空间复杂度.

3.如何计算时间和空间复杂度。

4.常见复杂度计算练习

理解时间空间复杂度

时间复杂度:衡量算法运行速度的指标。

空间复杂度:衡量程序运行临时占用存储空间大小的指标。

为什么要有时间复杂度和空间复杂度?

时间复杂度和空间复杂度能给帮助我们衡量一个算法的优劣,在不同环境中我们对时间效率和空间效率要求不同,因此有了时间复杂度和空间复杂度能够指引程序员设计符合程序环境的代码。

计算时间复杂度

时间复杂度的计算并不要求我们计算准确的算法运行的时间,由于运行时间和执行次数成正比,我们用算法的执行次数当做时间复杂度计算。

另外有些算法的时间复杂度存在最好、平均和最坏情况,我们取最坏情况作为时间复杂度。

注:最坏情况代表的是改算法最多执行的次数,通常带有条件判断语句。

解释原因:平均情况=(最坏情况+最好情况)/2 =最坏情况/2+最好情况/2

根据大O的渐进表示法平均情况等于最坏情况。(类似于取极限)

计算空间复杂度

空间复杂度的计算算的是申请变量的个数。

计算练习

1.1常见时间复杂度计算举例

例1

void Func2(int N)
{int count = 0;for (int k = 0; k < 2 * N ; ++ k){++count;}int M = 10;while (M--){++count;}printf("%d\n", count);
}

例2

void Func3(int N, int M)
{int count = 0;for (int k = 0; k < M; ++ k){++count;}for (int k = 0; k < N ; ++ k){++count;}printf("%d\n", count);
}

例3

// 计算BinarySearch的时间复杂度?
int BinarySearch(int* a, int n, int x)
{assert(a);int begin = 0;int end = n;while (begin < end){int mid = begin + ((end-begin)>>1);if (a[mid] < x)begin = mid+1;else if (a[mid] > x)end = mid;elsereturn mid;}return -1;
}

例4

// 计算阶乘递归Factorial的时间复杂度?
long long Factorial(size_t N)
{return N < 2 ? N : Factorial(N-1)*N;
}

例5

// 计算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;}
}

实例答案及分析

1. 实例1基本操作执行了2N+10次,通过推导大O阶方法知道,时间复杂度为 O(N)

2. 实例2基本操作执行了M+N次,有两个未知数M和N,时间复杂度为 O(N+M)
3. 实例3基本操作执行最好1次,最坏O(logN)次,时间复杂度为 O(logN) ps:logN在算法分析
中表示是底数为2,对数为N。有些地方会写成lgN。

4.实例4通过计算分析发现基本操作递归了N次,时间复杂度为O(N)。

5.实例5基本操作执行最好N次,最坏执行了(N*(N+1)/2次,通过推导大O阶方法+时间复杂度
一般看最坏,时间复杂度为 O(N^2)

1.2常见空间复杂度的计算
例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;}
}

例2

// 计算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;fibArray[1] = 1;for (int i = 2; i <= n ; ++i){fibArray[i ] = fibArray[ i - 1] + fibArray [i - 2];}return fibArray ;
}

例3

// 计算阶乘递归Factorial的空间复杂度?
long long Factorial(size_t N)
{return N < 2 ? N : Factorial(N-1)*N;
}

实例答案及分析:
1. 实例1使用了常数个额外空间,所以空间复杂度为 O(1)
2. 实例2动态开辟了N个空间,空间复杂度为 O(N)
3. 实例3递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)

时间和空间复杂度计算相关推荐

  1. (二) 时间/空间复杂度计算

    时间/空间复杂度计算 时间复杂度是什么? O(1) O(n) O(1)+O(n)=O(n) O(n)*O(n)=O(n^2) O(logN) 空间复杂度是什么? O(1) O(n) O(n^2) 思考 ...

  2. 第2章 时间空间复杂度计算

    1时间复杂度计算 时间复杂度是什么? 一个函数,用大O表示,例如:O(1), O(N), O(logN). 定性描述算法的运行时间. 时间复杂度常见图: 案例: O(1) let i = 0 i += ...

  3. 尾递归对时间与空间复杂度的影响(上)

    以前我也在博客上简单谈过"尾递归"及其优化方式方面的话题.前几天有同学在写邮件向我提问,说是否所有的递归算法都能改写为尾递归,改写成尾递归之后,是否在时间和空间复杂度方面都能有所提 ...

  4. a*算法的时间复杂度_数据结构与算法系列——时间、空间复杂度

    数据结构和算法本质就是帮我们用最快的时间和最少的空间来执行我们的代码.所以,执行效率是衡量一个算法的非常重要的指标.那如何来计算你的算法代码的执行效率呢?这就需要时间.空间复杂度来分析了. 有人可能会 ...

  5. 一层循环时间复杂度_数据结构与算法系列——时间、空间复杂度

    数据结构和算法本质就是帮我们用最快的时间和最少的空间来执行我们的代码.所以,执行效率是衡量一个算法的非常重要的指标.那如何来计算你的算法代码的执行效率呢?这就需要时间.空间复杂度来分析了. 有人可能会 ...

  6. 递归算法的时间&空间复杂度!

    一.递归算法的时间复杂度 本篇通过一道面试题,一个面试场景,来好好分析一下如何求递归算法的时间复杂度. 同一道题目,同样使用递归算法,有的同学会写出了O(n)的代码,有的同学就写出了O(logn)的代 ...

  7. 【算法】时间和空间复杂度

    文章目录 前言 一.时间复杂度 二.空间复杂度 三.常见的案例和示例 1. 线性查找(Linear Search) 2. 快速排序(Quick Sort) 3.动态规划(Dynamic Program ...

  8. 如何判断程序的复杂程度:时间和空间复杂度

    文章目录 如何判断程序的复杂程度:时间和空间复杂度 1. 时间复杂度: 如何判断一段代码的时间复杂度 小练习1:求和计算1~n的和 小练习2:求斐波那契数列 主定理 常用算法中的应用 2. 空间复杂度 ...

  9. 「算法与数据结构」时间与空间复杂度

    写在前面 可能有些人会吐槽,学算法有什么用,顶多就是去面试大厂的时候能用上,大厂面试算法也只是强中筛强的一个敲门砖而已,我又不去面大厂,不用学它,真的是这样吗? 肯定不是,在计算机行业发展,不管是前端 ...

最新文章

  1. 亚洲首获奖!清华大学团队获ACM SIGCOMM 2021唯一最佳学生论文奖
  2. 机器人学的几何基础pdf
  3. Qomo OpenProject beta1 发布!
  4. stateflow错误:Error in port widths or dimensions.
  5. AndroidStudio导出aar文件给Unity使用
  6. 硬解析优化_72最近一次现场生产系统优化的成果与开发建议
  7. TED演讲:数据科学家最重要的技能是什么
  8. TCGA(三)--采用GDC API进行数据查询和获取
  9. (07)FPGA基本组成单元
  10. 疫情下的618:搜索热度已盖过双11,全民练习“直播带货”
  11. Java并发编程-synchronized锁优化
  12. Link节点类的改进——通过构建freelist自行管理内存
  13. 爪哇国新游记之二十六----迷宫寻路
  14. Python将矩阵格式数据在Console全部显示
  15. UVa 10129 - Play on Words (欧拉回路, DFS)
  16. 打造自己的Android源码学习环境之一:序
  17. 求救 关于ORA-01115的错误
  18. echarts 不刷新页面更新数据
  19. 中文版ASAM OpenSCENARIO与OpenDRIVE标准正式发布
  20. 7-2 地下迷宫探索

热门文章

  1. Word2021 中的图片保存后就变模糊了
  2. Kali linux网卡配置详解
  3. ceph nautilus(14.2.22) 通过ansible部署grafana无法启动
  4. 如何理解Logistic函数
  5. Vue Router 路由实现原理
  6. 山寨机java自动发短信_恶搞短信附带代码 山寨手机最容易中招黑屏
  7. 2017软考上半年(错题总结)
  8. (mysql8.0.22) 本地计算机上的Mysql服务启动后停止,某些服务再未有其它服务或程序使用时自动停止
  9. PMP微信群日常习题
  10. RNN基本原理及代码实战