@Testpublicvoidtest1(int n){int sum =0;//执行1次for(int i =0; i < n; i++){//int i=0执行1次,i<n执行了n+1次,i++执行了n次
sum += i;//执行了n次}}//语句频度:T(n)=3n+3//时间复杂度:T(n)=O(n)
推算过程:在下面代码中,假设该循环的执行次数为
X
X
X次(也就是
i
i
i的取值为
2
x
2^x
2x),就满足了循环的结束条件,即满足了
2
x
=
n
2^x=n
2x=n,通过数学公式转换后,即得到
x
=
l
o
g
2
n
x=log2n
x=log2n,也就是说最多循环
l
o
g
2
n
log2n
log2n次以后,这个代码就结束了,因此时间复杂度为
O
(
l
o
g
2
n
)
O(log2n)
O(log2n)。如果循环变量放大3倍,那么时间复杂度为
O
(
l
o
g
3
n
)
O(log3n)
O(log3n)。
@Testpublicvoidtest3(){int n =1024;for(int i =0; i < n; i *=2){
System.out.println(i);}}
3、线性阶:在下面的代码中,for循环会执行n次,因此它消耗的时间随着n变化而变化的,因此这类代码都可以用
O
(
n
)
O(n)
O(n)来表示时间复杂度。
@Testpublicvoidtest4(){int n =1024;for(int i =0; i < n; i ++){
System.out.println(i);}}
4、线性对数阶:将对数阶的代码循环n次后,那么它的时间复杂度就是
n
∗
O
(
l
o
g
2
n
)
n*O(log2n)
n∗O(log2n),也就是
O
(
n
l
o
g
2
n
)
O(nlog2n)
O(nlog2n)。
@Testpublicvoidtest5(){int n =1024;for(int i =1; i <= n; i++){for(int j =1; j <= n; j *=2){
System.out.println(j);}}}
5、平方阶:外层循环执行一次,内层循环就要执行n次,所以外层执行n次,那么总的需要执行n*n次,因此时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)。
@Testpublicvoidtest6(){int n =10;for(int i =1; i <= n; i++){for(int j =1; j <= n; j++){
System.out.println(j);}}}
6、指数阶
O
(
2
n
)
O(2^n)
O(2n):当n为9的时候,需要执行
2
9
2^9
29次。
2
n
+
3
n
l
o
g
2
n
+
19
2n+3nlog2^n+19
2n+3nlog2n+19
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
线性对数阶
6
n
3
+
2
n
2
+
3
n
+
4
6n^3+2n^2+3n+4
6n3+2n2+3n+4
O
(
n
3
)
O(n^3)
O(n3)
立方阶
2
n
2^n
2n
O
(
2
n
)
O(2^n)
O(2n)
指数阶
注意:经常将
l
o
g
2
n
log2^n
log2n(以 2 为底的对数)简写成
l
o
g
n
logn
logn
常见时间复杂度之间的关系:所消耗的时间从小到大
O
(
1
)
<
O
(
l
o
g
n
)
<
O
(
n
)
<
O
(
n
l
o
g
n
)
<
O
(
n
2
)
<
O
(
n
3
)
<
O
(
2
n
)
<
O
(
n
!
)
<
O
(
n
n
)
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)