时间和空间复杂度
简介
使用不同的算法,得到的结果可能是一致的,但是其消耗的时间和空间可能大不相同,如何去衡量不同算法的优劣呢?
- 时间复杂度:是指执行当前算法所消耗的时间
- 空间复杂度:是指执行当前算法需要占用多少内存空间
时间复杂度
一般我们去测试程序算法的优劣,在同一台机器上跑一次就可以了,但是不同的机器配置得到的结果是不一样的,而且受限于程序环境的影响,有没有通用的方法呢:算法的渐进时间复杂度
T
(
n
)
=
O
(
f
(
n
)
)
T(n)=O(f(n))
T(n)=O(f(n))
常见的时间复杂度有
- 常数阶O(1)
- 对数阶O(logN)
- 线性阶O(n)
- 线性对数阶O(nlogN)
- 平方阶O(n²)
- 立方阶O(n³)
- K次方阶O(nk)
- 指数阶O(2n)
常数阶O(1)
int i = 1;
int j = 2;
++i;
j++;
int m = i + j;
无论代码有多少行,,只要是顺序执行,没有循环等复杂结构,那复杂度为O(1)
他消耗的时间不会随着系数变化而变化
线性阶O(n)
for(i=1; i<=n; ++i)
{
j = i;
j++;
}
假定每行代码执行时间一致为1, 那么执行上述代码一次时间为1+2, 执行n次为 1+2n, 当n趋于无穷,
有
T
(
n
)
=
O
(
1
+
2
n
)
当
n
−
>
∞
得
T
(
n
)
=
O
(
n
)
有\quad T(n) = O(1+2n) \\ 当 \quad n->\infty \\ 得\quad T(n) = O(n)
有T(n)=O(1+2n)当n−>∞得T(n)=O(n)
对数阶O(logN)
int i = 1;
while(i<n)
{
i = i * 2;
}
根据定义, 假设循环了x次, 就有2x = n , 有x = log2n 得出
T
(
n
)
=
O
(
l
o
g
n
)
T(n) = O(logn)
T(n)=O(logn)
线性对数阶O(nlogN)
for(m=1; m<n; m++)
{
i = 1;
while(i<n)
{
i = i * 2;
}
}
显而易见将 O(logn)循环了n遍, 所以时间复杂度为:
T
(
n
)
=
O
(
n
l
o
g
n
)
T(n) = O(nlogn)
T(n)=O(nlogn)
平方阶O(n²)
for(x=1; i<=n; x++)
{
for(i=1; i<=n; i++)
{
j = i;
j++;
}
}
O(n)的代码循环了n遍, 时间复杂度为:
T
(
n
)
=
O
(
n
2
)
T(n) = O(n^2)
T(n)=O(n2)
空间复杂度
int[] m = new int[n]
for(i=1; i<=n; ++i)
{
j = i;
j++;
}
代码中只有第一行申请空间,其他代码没有, 因此空间复杂度只需要看第一行代码就行,其时间复杂度为:
T
(
n
)
=
O
(
n
)
T(n) = O(n)
T(n)=O(n)