1、什么是算法的时间复杂度
描述算法在编写可执行程序后,运行时所需要耗费的时间资源的一个函数,通常用O()来表示。
2、算法中时间复杂度的计算
(1) 常数函数时间复杂度O(1)
下面代码for语句中count++执行的次数与N无关而且是一个有限的次数(这个数也不能太大比如说40亿以上),那么一般把该算法的时间复杂度当作一个常数函数记作O(1)。
void Function(int N) {
int count = 0;
for (int i = 0; i < 1000000; i++) {
count++;
}
}
(2)循环中复杂度的计算
下面代码for语句中count++执行的次数与N有关,随着N趋近于无穷,那么count++执行的次数也趋近于无穷,则这个算法的时间复杂度为O(N);
void Function1(int N){
int count = 0;
for (int i = 0; i < N; i++) {
count++;
}
}
下面这段代码中一眼可看出时间复杂度为2N,但是时间复杂度计算的规则是当最高阶项存在,且前面系数为常数,则将这个系数当作1看待,即这段代码中时间复杂度应该记作O(N)。
void Function2(int N) {
int count = 0;
for (int i = 0; i < N; i++) {
count++;
}
for (int i = 0; i < N; i++) {
count++;
}
}
下面这段代码中时间复杂度可表示为,其中含N的最高次项为,即在函数式中这一项分量最重,其他项可以忽略,记作O()。
void Function3(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 < N; k++) {
count++;
}
for (int l = 0; l < 100; l++) {
count++;
}
}
(3)二分查找算法中的时间复杂度
二分查找算法中是通过类似于折纸的原理,算法中while执行的次数就是在数组a中寻找x的次数,每寻找一次,搜寻的范围都会变为原来的二分之一,因此搜寻范围大小的变化就是N/2/2/2.....,直到只有一项,假设这个过程计算n次,则2^n=N,即。时间复杂度记作O()。
int Function4(int *a, int N, int x) {
int begin = 0;
int end = N- 1;
while (begin <= end) {
int midd = (begin + end) / 2;
if (x < a[midd]) {
end = midd - 1;
}
else if (x > a[midd]) {
begin = midd + 1;
}
else {
return midd;
}
}
return -1;
}
(3) 函数递归中的复杂度计算
下面算法中要计算Function5(int N)函数所执行的次数,首先可推理:F(N) = F(N-1)*N,F(N-1) = F(N-2)*(N-1).......F(2) = F(1)*2,F(1) = F(0)*1。由推理式可知F(N)只与他得下一项有关,因此这个计算过程中每一项只需要计算一次,因此总计算次数为N+1,即时间复杂度记作O(N)。
long long Function5(int N) {
if (0 == N) {
return 1;
}
else
return Function5(N-1)*N;
}
下面算法中要计算斐波拉契函数得时间复杂度,首先可推理:F(N)=F(N-1)+F(N-2),F(N-1)=F(N-2)+F(N-3).......F(4)=F(3)+F(2),F(3)=F(2)+F(1)。由推理式子可知F(N)与他后面两项相关,从下面推理图中的计算,可推出要求得F(N),则应计算2^(N-2)次,即时间复杂度记作O(2^N)。
long long Fib(int N) {
if (N < 3) {
return 1;
}
else {
return Fib(N - 1) + Fib(N - 2);
}
}