复杂度
-
算法的优劣取决于两点 1:执行时间 2:占用内存大小
一:时间复杂度
-
时间复杂度,说的不是算法执行的时间,而是算法执行的次数
1:常数阶
-
T(n) =O(1)
method(){
int i=1;
int j=1;
i++;
j++;
.....
i++
j++;
}
上述方法,从上到下只执行一次,可以这么表示时间复杂度 T(n) =O(1)
2: 线性阶
-
T(n) =O(n)
for(i=0;i++;i<n){
j=i;
j++;
}
上述循环,执行次数取决于n的大小,可以这么表示时间复杂度T(n) =O(n)
3: 对数阶
-
T(n) =O(log2n)
int i=1;
while(i<n){
i=i*2;
}
上述while循环,执行次数,取决于n,但是明显不是执行了n次,执行次数是,log2n,
假如n=16,循环次数是4次,这种情况的时间复杂度可以这么表示 T(n) =O(log2n)
4: 线性对数阶
-
T(n) =O(nlog2n)
for(i=1;i<n;i++){
while(j<n){
j=j*2
}
}
while循环里面执行,次数是log2n次,for循环执行n次,总次数是nlog2n
时间复杂度可以这么表示 T(n) =O(nlogN)
5: 平方阶
T(n) =O(n*n)
for(i=1;i<n;i++){
for(i=1;i<n;i++){
j=i;
}
}
上述执行次数是,n*n
时间复杂度可以这么表示 T(n) =O(n²)
或者T(n) =O(n*n)
6:立方阶O(n³)
7:K次方阶O(n^k)
二:空间复杂度
-
占用的内存空间的大小
1: 空间复杂度 O(1)
int i=1;
int j=1;
i++;
j++;
m= i+j;
i,j,m的内存不会随数据变化而变化
故空间复杂度可以表示为
S(n)=O(1)
2: 空间复杂度 O(n)
int[] m=new int[n]
for(i=1;i<n;i++){
j=j*2
}
分配的内存空间的大小是 m数据决定的
故时间复杂度可以表示为
S(n) = O(n)
3: 空间复杂度 O(n²)
for(i=1;i<n;i++){
new int[n]
}
根据n的大小,决定创建数组的次数,
故时间复杂度可以这么表示
S(n) =O( n*n)
浙公网安备 33010602011771号