【时间复杂度和空间复杂度】(内含超多实例练习)
- 1. 算法效率
- 2. 时间复杂度
- 2.1 时间复杂度的概念
- 2.2 实例练习
- 2.2.1 数组中搜索数据
- 2.2.2 冒泡排序
- 2.2.3 二分查找
- 2.2.4 阶乘递归
- 2.2.5 斐波那契递归
- 3. 空间复杂度
- 3.1 空间复杂度的概念
- 3.2 实例练习
- 3.2.1 冒泡排序
- 3.2.2 阶乘递归
1. 算法效率
在编程过程中衡量一个算法的好坏看的是算法效率。
算法效率分为两种:
- 时间效率被称为时间复杂度,主要衡量一个算法的运行速度。
- 空间效率被称为空间复杂度,主要衡量一个算法所需的额外空间。
2. 时间复杂度
2.1 时间复杂度的概念
算法的时间复杂度是一个数学函数,一个算法所花费的时间与其中的语句的执行次数成正比。
算法中的基本操作的执行次数,为算法的时间复杂度。
2.2 实例练习
在练习之前我先举例一些常见的复杂度:
- O(1) O(log N) O(N) O(N*log N) O(N^2)
算法的时间复杂度存在最好、平均、最坏的情况:
- 最好情况:任意输入规模的最小运行次数(下界)
- 平均情况:任意运行规模的期望运行次数
- 最坏情况:任意输入规模的最大运行次数(上界)
下面是一些关于时间复杂度的练习题。
2.2.1 数组中搜索数据
对 find 的时间复杂度进行分析:
- 最好情况: 1次找到
- 最坏情况: N次找到
- 平均情况: N/2次找到
在实际中一般情况关注的是最坏情况,所以 find 的时间复杂度为O(N)。
2.2.2 冒泡排序
bubbleSort的时间复杂度为O(N^2)
2.2.3 二分查找
2.2.4 阶乘递归
大多数递归的时间复杂度=递归次数*每次递归执行的次数
所以factorial 的时间复杂度为 O(N)
2.2.5 斐波那契递归
因此,fib 的时间复杂度为O(2^N)
3. 空间复杂度
3.1 空间复杂度的概念
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,空间复杂度算的是变量的个数。
3.2 实例练习
3.2.1 冒泡排序
bubbleSort使用常数个额外空间,所以空间复杂度为 O(1)
3.2.2 阶乘递归
- 递归调用了N次,开辟了N个栈帧,每个栈帧使用常数个空间,空间复杂度为O(N)
- 大多数递归的空间复杂度=递归的次数*每次递归变量的个数