时间复杂度(time complexity), 是以数学抽象的方式用于评价一个算法在时间维度上的消耗。通常使用 O 来表示
常见的时间复杂度有
- O(1)
- O(logn)
- O(n)
- O(nlogn)
- O(
$n^2$ ) - O(
$n^k$ ) - O(
$2^n$ )
常数阶
无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1),如:
int i = 1;
int j = 2;
++i;
j++;
int m = i + j;
线性阶
在一个 for 循环中执行 n 次
for(i=1; i<=n; ++i)
{
j = i;
j++;
}
对数阶
从下面代码可以看到,在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。我们试着求解一下,假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2^n 也就是说当循环 log2^n 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(logn)
int i = 1;
while(i<n)
{
i = i * 2;
}
例如 二分查找 就是一个 O(logn) 算法
线性对数阶
即将复杂度 O(logn) 的代码循环 n 遍
for(m=1; m<n; m++)
{
i = 1;
while(i<n)
{
i = i * 2;
}
}
平方阶
就是把 O(n) 的代码,循环 n 遍
for(x=1; i<=n; x++)
{
for(i=1; i<=n; i++)
{
j = i;
j++;
}
}
例如 冒泡排序、插入排序 都是 O(
K 次方阶
就是把 O(n) 的代码,循环
references