- 概念
- 算法中,基本语句重复执行的次数是问题规模n的某个函数f(n);记作:
- T(n) = O(f(n))
- 随着问题规模n的增加,算法执行时间的增长率和f(n)的增长率相同,称为时间复杂度 - Time Complexity,使用大O表示
- 焦点
- . 问题规模n
- . 语句频度
- 基本步骤
- 1. 找出执行次数最多的语句,通常是最内层循环的循环体
- 2. 计算该语句的执行次数和问题规模n的数量级关系
- 3. 保留Keep最高次幂[关键操作次数的数量级]
- 4. 舍弃Disregard最高次幂系数
- 5. 舍弃Disregard低次幂和常数项
- 6. 当问题规模n达到一定数量级时,其系数和所有低次幂及常数项的影响忽略不计
- 基本原则
- 加法:T(n) = T1(n) + T2(n) = O( max(f1(x),f2(x)) )
- 乘法:T(n) = T1(n) * T2(n) = O( f1(x) * f2(x) )
- 常见时间复杂度O()
- 常数阶O(1) < 对数阶O(log2n) < 线性阶O(n) < 线性对数阶O(nlog2n) <
平方阶O(n2) < 立方阶O(n3)
- O(n)
- 执行次数:n+1;数量级:n;使用等差数列推导
-
void fn(int n)
{
int i;
for (i = 0; i <= n; i++)
{
i++;
}
}
int fn(int n)
{
if (!n)
return 1;
else
return n * fn(n - 1);
}
- O(n2)
- 关键语句:x++;执行次数:n*n;数量级:n*n
-
void fn(int n)
{
int i, j, x = 0;
for (i = 1; i < n; i++)
{
for (j = i + 1; j <= n; j++)
{
x++;
}
}
}
s = 0;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
s += B[i][j];
sum = s;
- O(n3)
- 关键语句:s++;执行次数:n*n*n;数量级:n*n*n
-
void fn(int n)
{
int i, j, k, s;
for (i = 0; i <= n; i++)
{
for (j = 0; j <= i; j++)
{
for (k = 0; k < j; k++)
{
s++;
}
}
}
}
- O(log2n)
- 执行次数没有达到n,而是n的对数阶
-
void fn(int n)
{
int i = 0;
while (i < n)
{
i += 2;
}
}
void fn(int n)
{
int i = 1;
while (i <= n)
{
i *= 2;//引入中间变量k,令i=2k
}
}
- O(n1/2)
-
void fn(int n)
{
int i = 0, sum = 0;
while (sum <= n)
{
sum += ++i;
}
}