举例说明时间复杂度:
1.常数阶O(1):
无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间
复杂度就都是O(1)
int i = 1;
int j = 2;
++i;
j++;
int m = i + j;
上述代码在执行的时候,它消耗的时候并不随着某个变量的增长而增长,
那么无论这类代码有多长,即使有几万几十万行,都可以用O(1)来
表示它的时间复杂度。
2.对数阶O(log2n)
int i = 1;
while (i<n) {
i = i * 2;
}
说明:在while循环里,每次都将i乘以2,乘完以后,i距离n越来越近。
假设循环X次后,i就大于n了,此时这个循环就退出了,也就是说2的
x次方等于n,那么x=log2n也就是说当循环log2n次以后,这个代码就
结束了。因此这个代码的时间复杂度为:O(log2n)
O(log2n)的这个2时间上是根据代码变化的。i = i * 3则是O(log3n)
如果N=a^x(a>0,a != 1),那么数x叫做以a为底N的对数,记作x=logaN。
其中a叫做对数的底数,N叫做真数,x叫做以a为底N的对数
3.线性阶O(n)
for (int i = 1; i <= n; ++i) {
j = i;
j++;
}
说明:这段代码,for循环里面的代码会执行n遍,因此它消耗的时间是
随着n的变化而变化的,因此这类代码都可以用O(n)树赖表示复杂度
4.线性对数阶O(nlogN)
for (m = 1; m < n; m++) {
i = 1;
while (i < n) {
i = i * 2;
}
}
说明:线性对数阶O(logN)其实非常容易理解,将时间复杂度O(logN)的代码
循环N遍的话,那么它的时间复杂度就是n*O(logN),也就是O(nlogN)
5.平方阶O(n^2)
for (x = 1; i <= n; x++) {
for (i = 1; i <= n; i++) {
j = i;
j++;
}
}
说明:平方阶O(n^2)更容易理解,即嵌套了两个时间复杂度为n的for循环。
如果一个循环n次,一个循环m次,那么复杂度就是O(m*n)
6.立方阶O(n^3)
就是嵌套3层for循环
平均时间复杂度和最坏时间复杂度:
1.平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,该算法
的运行时间
2.最坏情况下的时间复杂度称最坏时间复杂度。一般讨论的时间复杂度均是
最坏情况下的时间复杂度。这样做的原因是:最坏情况下的时间复杂度是
算法在任何输入实例上运行时间的界限,这就保证了算法的运行时间不会比
最坏情况更长
3.平均时间复杂度和最坏时间复杂度是否一致,和算法有关,如下图