时间的复杂度其实主要看最深层循环循环了几次:
举例1:
public static void love(int n){
for (int i = 1; i <=n; i++) {
System.out.println("I Love You!");
}
}
最里面执行n次,时间复杂度为O(n)
举例2:
public static void love(int n){
for (int i = 1; i < n; i++) {
System.out.println("I Love You!");
for (int j = 0; j < n; j++) {
System.out.println("Love You!");
}
}
}
最里面执行n*n次,时间复杂度为O(n2)
举例3:
public static void love(int n){
for (int i = 1; i < n; ) {
i*=2;
System.out.println("I Love You!");
}
}
设最里面执行k次,2k>n停止
故最里面执行log2n次,时间复杂度为O(log2n)
举例4:
public static void love(int n,int []m){
for (int i = 1; i < n; i++) {
System.out.println(i);
if (m[i]==n){
System.out.println("I Love You!");
break;
}
}
}
情况 | 时间复杂度 |
---|---|
元素n在第一个位置 | T(n)=O(1) |
元素n在最后一个位置 | T(n)=O(n) |
假设元素n在任意一个位置的概率相同 | T(n)=O(n) |
举例5:
public static void love(int n){
int sum = 0;
for ( int i = 0; sum < n; i++) {
sum += i;
System.out.println(i);
}
}
i=0时,sum=0
i=1时,sum=0+1
i=2时,sum=0+1+2
sum=0+1+2+……+k=(1+k)*k/2<n,
时间复杂度为O(n1/2)
举例6:
public static void love(int n){
int sum = 0;
for ( int i = 0; i < n; i*=2) {
for (int j = 0; j < i; j++) {
sum++;
}
}
}
外层执行k次,2k-1<n<2k
内层执行T=1+2+4+8+……+2k-1=2k-1次,故n<T<2n,时间复杂度为O(n)