1. 算法的时间复杂度分析
1.1 事前分析估算
研究算法的目的在于如何花更少的时间、占用更少的内存去完成相同的需求,度量算法的执行时间,虽然可以通过计时的方法进行事后测试,但往往会花费大量时间和精力;事前分析估算是指在程序编写前,依据统计方法对算法进行估算。
程序在计算机上运行所消耗的时间取决于以下因素:
-
算法采用的策略和方案
-
编译产生的代码质量
-
问题的输入规模(输入量的多少)
算法随着输入规模的增长量: 1. 算法函数中的常数可以忽略 2. 算法函数中最高次幂的常数因子可以忽略 3. 算法函数中最高次幂越小,算法效率越高
-
机器执行指令的速度
1.2 常见的时间复杂度
描述 | 增长的数量级 | 说明 | 举例 |
---|---|---|---|
常数级别 | 1 | 普通语句 | 将两个数相加 |
对数级别 | l o g N logN logN | 二分策略 | 二分查找 |
线性级别 | N N N | 循环 | 找出最大元素 |
线型对数级别 | N l o g N NlogN NlogN | 分治思想 | 归并排序 |
平方级别 | N 2 N^2 N2 | 双层循环 | 检查所有元素对 |
立方级别 | N 3 N^3 N3 | 三层循环 | 检查所有三元组 |
指数级别 | 2 N 2^N 2N | 穷举查找 | 检查所有子集 |
复杂程度从低到高依次为:
O
(
1
)
<
O
(
l
o
g
n
)
<
O
(
n
)
<
O
(
n
l
o
g
n
)
<
O
(
n
2
)
<
O
(
n
3
)
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)
我们的算法应尽可能的追求
O
(
1
)
O(1)
O(1),
O
(
l
o
g
n
)
O(logn)
O(logn),
O
(
n
)
O(n)
O(n),
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)这几种时间复杂度。除非特别指定,我们提到的运行时间都指的是最坏情况下的运行时间。
2. 算法的空间复杂度分析
基本数据类型内存占用情况
数据类型 | 内存占用字节数 |
---|---|
byte | 1 |
short | 2 |
int | 4 |
long | 8 |
float | 4 |
double | 8 |
boolean | 1 |
char | 2 |
算法空间复杂度计算公式:
S
(
n
)
=
O
[
f
(
n
)
]
S(n)=O[f(n)]
S(n)=O[f(n)],其中
n
n
n为问题的规模,
f
(
n
)
f(n)
f(n)为语句关于
n
n
n所占存储空间的函数。
由于现在的计算机设备内存一般都比较大,所以内存占用一般情况下并不是算法的瓶颈,普通情况下直接说复杂度,默认为算法的时间复杂度。