計算時間複雜度--(簡單版)
步驟:
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
根據等差數列的求和公式:或者
求和易得: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)
最壞情況與平均情況:
平均執行時間是期望的執行時間。
最壞的執行時間是一種保證。我們提到的執行時間都是最壞的執行時間。
可以通過空間來換取時間。