一、什么是时间复杂度
时间复杂度:又称时间效率,指的是程序执行的次数,用“大O渐进表示法”表示(注意不是运行程序所花的时间!)
大O渐进表示法:O(),()内放程序执行的次数,常见表示有:O(1),O(N),O(N+M),O(N^2),O(logN)
推导大O阶方法:
- 用常数1代表执行了常数次(ps:常数指的是有具体法阿拉伯数字)
- 当执行次数有表达式时,只保留最高阶项
- 如果最高阶存在且不是1,则去除与这个最高阶项相乘的常数,得到的结果就是大O阶。
二、如何计算常见的时间复杂度?
//大O的渐进表示法
//请计算一下Func1基本操作执行了多少次?
void Func1(int N)
{
int count = 0;
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
count++;
}
for(int k=0;k<2N;++k)
count++;
int M = 10;
while (M--)
{
count++;
}
}
解:第一个for中内嵌了一个for,所以这里的基本操作++count被执行了N*N次;第三个for中的基本操作++count被执行了2N次;最后一个while循环中,由于M=10,当M--不等于0时执行count++,所以这里的基本操作执行了10次。所以一共执行次数是N^2+2N+10次。
Func1执行的基本操作次数:
F(N)=N^2+2N+10
F(10)=130
F(100)=10210
F(1000)=1002010
由此我们可以看到,随着N的增大,这个表达是中,N^2对结果的影响是最大的,因此Func1的时间复杂度是O(N^2)
注意!时间复杂度是个估值!是去看表达式中影响最大的那一项
//计算Func2的时间复杂度
void Func2(int N) {
int count = 0;
for (int k = 0; k < 2*N; ++k)
count++;
int M = 10;
while (M--)
{
count++;
}
}
解:由上一条解析可知,该函数基本操作的执行次数表达式为2*N+10,最高次项为2*N,去除系数,得该函数时间复杂度为O(N)。
//计算Func3的时间复杂度
void Func3(int M,int N)
{
int count = 0;
for (int i = 0; i < M; i++)
count++;
for (int j = 0; j < N; j++)
count++;
printf("%d\n", count);
}
解:由于不知道M和N的具体大小,无法判断哪一项对空间复杂度的影响更大,因此时间复杂度为O(N+M)。若题目说N远大于M,则为O(N);若题目说N和M接近,则表达式M+N可以写成2*N或2*M,因此时间复杂度为O(M)或O(N)。
//计算Func4的空间复杂度
void Func4(int N)
{
int count = 0;
for (int j = 0; j < 100; j++)
count++;
printf("%d\n", count);
}
解:由于该函数的基本操作count++执行了100次(具体的阿拉伯数字or常数次)因此时间复杂度为O(1)