以例子来说 更好的理解
先了解一下大O表示法
int cal(int n) {
int sum = 0;
int i = 1;
for (; i <= n; ++i) {
sum = sum + i;
}
return sum;
}
读数据-运算-写数据。尽管每行代码对应的 CPU 执行的个数、执行的时间都不一样,但是,我们这里只是粗略估计,所以可以假设每行代码执行的时间都一样。所以上述为(2+2n)*time
2是因为2行3行,2n是因为for循环n次 里面执行一次外面执行一次
再看下一个
int cal(int n) {
int sum = 0;
int i = 1;
int j = 1;
for (; i <= n; ++i) {
j = 1;
for (; j <= n; ++j) {
sum = sum + i * j;
}
}
}
计算下来为(3+2n+2n^2)*time
规律:所有代码的执行时间 T(n) 与每行代码的执行次数 n 成正比。
时间复杂度分析
1.只关注循环次数最多的一段代码
我们在分析一个算法、一段代码的时间复杂度的时候,也只关注循环执行次数最多的那一段代码就可以了。
所以刚才第一个例子用大O表示法九尾O(n)
2.加法法则:总复杂度等于量级最大的那段代码的复杂度
可以分析一下下述的代码
int cal(int n) {
int sum_1 = 0;
int p = 1;
for (; p < 100; ++p) {
sum_1 = sum_1 + p;
}
int sum_2 = 0;
int q = 1;
for (; q < n; ++q) {
sum_2 = sum_2 + q;
}
int sum_3 = 0;
int i = 1;
int j = 1;
for (; i <= n; ++i) {
j = 1;
for (; j <= n; ++j) {
sum_3 = sum_3 + i * j;
}
}
return sum_1 + sum_2 + sum_3;
}
第一段和第二段为O(n)第三段为O(n^2)
总的时间复杂度就等于量级最大的那段代码的时间复杂度
所以时间复杂度为O(n^2)
3.乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积看一个例子
int cal(int n) {
int ret = 0;
int i = 1;
for (; i < n; ++i) {
ret = ret + f(i);
}
}
int f(int n) {
int sum = 0;
int i = 1;
for (; i < n; ++i) {
sum = sum + i;
}
return sum;
}
第一端的复杂度为O(n)第二段的为O(n)
嵌套 所以整体的复杂度为O(n^2)
理解上述的之后,了解一下多项式时间复杂度
1.O(1)
只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)。
2.O(logn)、O(nlogn)
下述例子,每次循环都是2的次方,时间复杂度为O(log以2为底的n)
i=1;
while (i <= n) {
i = i * 2;
}
**3. O(m+n)、O(m*n)O(m+n) **
代码的复杂度由两个数据的规模来决定
int cal(int m, int n) {
int sum_1 = 0;
int i = 1;
for (; i < m; ++i) {
sum_1 = sum_1 + i;
}
int sum_2 = 0;
int j = 1;
for (; j < n; ++j) {
sum_2 = sum_2 + j;
}
return sum_1 + sum_2;
}
m*n即为 两个未知,一个嵌套另一个