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基本格式函数