1.2咱們主要看重的是漸進複雜度,又稱爲階次。例如:在t(n)=15n²+45n中,當n逐漸變大時,一次項幾乎不計。故階次爲n²
java
// 例題一 for (int count = 0 ; count < n ; count++) { //複雜度爲O(1)的步驟系列 } //答案:循環體複雜度*循環運行次數=O(1)*O(n)=O(n)
//例題二:嵌套循環的複雜度分析 for (int count = 0 ; count < n;count++) { for ( int count2 = 0 ; count2<n ; count2++) { /*複雜度爲0(1)的步驟系列* } } //答案:外層循環次數*內層循環次數*循環體=O(n)*O(n)*O(1)=O(n²) //要點:分析嵌套循環的複雜度時,必須將內層循環和外層循環都考慮進來。
//例題三 for ( int count = 0 ; count < n ; count++) { for ( int count2 = count ; count2 < n ;count2++) { //複雜度爲O(1)的步驟系列 } //此段代碼需注意:外層複雜度爲O(n),而內層運行次數分別是n , n-1 , n-2 , ... , 1.而咱們又必須知道:咱們只對主項感興趣,即只關心最大的。因此答案是O(n²) }
for ( int count = 0 ; count < n ;count++ ) { printsum(n); }//此處只知道外層循環次數,不知道內層方法。不能知道此程序的複雜度。
public void sample ( int n ) { printsum(n); /*該方法的複雜度爲O(1)*/ for ( int count = 0 ; count < n ; count++) printsum(count); for (inr count = 0 ; count < n ; count++) for ( int count2 = 0 ;count2 < n ;count2 ++) System.out.println(count,count2); }
咱們能夠這樣想:算法
public void sample ( int n ) { printsum(n); //O(1) for ( int count = 0 ; count < n ; count++) printsum(count);// O(n) for (inr count = 0 ; count < n ; count++) for ( int count2 = 0 ;count2 < n ;count2 ++) System.out.println(count,count2); //O(n²) }//用數學來思考即: O(1)+O(n)+O(n²) 由於咱們只關注主項,因此階次爲O(n²)
以爲這張圖能很好解決這個問題:markdown
count = 1; while (count < n ) { count *= 2; }
此程序的階爲何是O(log2 N)而不是O(log2 n/count)?數據結構
1.markdown基本格式函數