1复杂度分析

复杂度分析是整个算法学习的精髓
 
为什么需要复杂度分析?
 
算法执行效率评估:
事后统计法:
1.测试结果非常依赖测试环境
2.测试结果受数据规模影响很大
因此需要一个不用哭啼的测试数据来测试,就可以粗略估算算法执行效率的方法
 
大O复杂度表示法
 
每行代码>cpu>读数据-运算-写数据   :unit_time
所有代码的执行时间T(n)与每行代码的执行次数称正比
 
1 int cal(int n) {
2    int sum = 0;
3    int i = 1;
4    for (; i <= n; ++i) {
5      sum = sum + i;
6    }
7    return sum;
8 }
 
 
T(n) = O(2n+2)
 
 1 int cal(int n) {
 2    int sum = 0;
 3    int i = 1;
 4    int j = 1;
 5    for (; i <= n; ++i) {
 6      j = 1;
 7      for (; j <= n; ++j) {
 8        sum = sum +  i * j;
 9      }
10    }
11 }
12  
T(n) = O(2n**2+2n+3)
 
O(n),O(n**2)即为时间复杂度:表示一个算法执行效率与数据规模增长的变化趋势。
 
时间复杂度分析:
1.只关注循环执行次数最多的那一段代码
2.加法法则:总复杂度等于量级最大的那段代码的复杂度
3.乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
 
 
非多项式量级:O(2**n)和O(n!)
 
多项式量级:
1.O(1)
一般情况下,只要算法中不存在循环语句、递归语句,即使代码再多,时间复杂度也是O(1)
2.O(logn),O(nlogn)
1 i=1;
2 while (i <= n)  {
3    i = i * 2;
4 }
 
3.O(m+n),O(m*n)
 
 1 void print(int n) {
 2   int i = 0;
 3   int[] a = new int[n];
 4   for (i; i <n; ++i) {
 5     a[i] = i * i;
 6   }
 7  
 8   for (i = n-1; i >= 0; --i) {
 9     print out a[i]
10   }
11 }

 
空间复杂度分析:表示算的存储空间与数据规模之间的关系
 
 1 void print(int n) {
 2   int i = 0;
 3   int[] a = new int[n];
 4   for (i; i <n; ++i) {
 5     a[i] = i * i;
 6   }
 7  
 8   for (i = n-1; i >= 0; --i) {
 9     print out a[i]
10   }
11 }

O(n)

 
 

猜你喜欢

转载自www.cnblogs.com/huangguoming/p/10458912.html