1. 程式人生 > >計算時間複雜度--(簡單版)

計算時間複雜度--(簡單版)

步驟:

1、找到執行次數最多的語句

2、語句執行語句的數量級

3、用O表示結果

計算時間複雜度的3個出發點,掌握這三個出發點,那麼一向搞不懂的時間複雜度就可以迎刃而解啦。

然後:

1、用常數1取代執行時間中的所有加法常數

2、在修改後的執行次數函式中,只保留最高階項

3、如果最高階項存在且不是1,那麼我們就去除於這個項相乘的常數。比如3n^2我們取n^2

最後就可以得到你們想要的結果了。

舉幾個例子:

我們來看一下這個例子,用的是java,內容就是列印8條語句,問這個程式的時間複雜度是多少?

public class TS {
	public static void main(String[] args) {
		System.out.println("111");
		System.out.println("111");
		System.out.println("111");
		System.out.println("111");
		System.out.println("111");
		System.out.println("111");
		System.out.println("111");
		System.out.println("111");
	}
}

O(8)? 當然不是!!!按照時間複雜度的概念“T(n)是關於問題規模為n的函式”,這裡跟問題規模有關係嗎?沒有關係,用我們的第一個方法,時間複雜度為O(1)。

第二個例子:(線性階)


public class TS {
	public static void main(String[] args) {
		int sum = 0;
		for(int i=1;i<=100;i++) {
			sum = sum + i;
		}
	}
}

時間複雜度為O(n)。

第三個例子:(平方階)


public class TS {
	public static void main(String[] args) {
		int sum = 0;
		for(int i=1;i<=100;i++) {
			for(int j=1;j<=100;j++)
				sum = sum + i;
		}
	}
}

 外層i的迴圈執行一次,內層j的迴圈就要執行100次,所以外層執行100次,那麼總的就需要執行100*100次,那麼n次呢?就是n的平方次了。所以時間複雜度為:O(n^2)。

平方階的另外一個例子:

public class TS {
	public static void main(String[] args) {
		int sum = 0;
		for(int i=1;i<=100;i++) {
			for(int j=i;j<=100;j++)
				sum = sum + i;
		}
	}
}

當i=1的時候執行n次,當n=2的時候執行(n-1)次,......

一直這樣子下去就可以構造出一個等差數列:n+(n-1)+(n-2)+......+2+1

根據等差數列的求和公式:formula或者formula

求和易得:n+n*(n-1)/2整理一下就是n*(n+1)/2然後我們將其展開可以得到n^2/2+n/2。

根據我們的步驟走,保留最高次項,去掉相乘的常數就可以得到時間複雜度為:O(n^2)

第四個例子:(對數階)

public class TS {
	public static void main(String[] args) {
		int i=1;
		int n= 100;
		while(i<n) {
			i = i*2;
		}	
}

2^x = n,所以時間複雜度為O(log2n)。

補充常用的時間複雜度所耗費的時間從小到大依次是:

O(1 )< O(logn) < O(n) < O(n*logn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

最壞情況與平均情況:

平均執行時間是期望的執行時間。

最壞的執行時間是一種保證。我們提到的執行時間都是最壞的執行時間。

可以通過空間來換取時間。