『数据结构与算法』—— 复杂度
    
  
        
           
    
      
        
          字数统计: 
        841 字
      
    
    
        |  
      
        
          阅读时长: 
        3 分
      
    
    
        
            |    本文总阅读量:  次
        
    
        
      
      
      
      
    
    
      
          
        重要性
复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半。
测试结果非常依赖测试环境
 
测试结果受数据规模的影响很大
 
我们需要一个不用具体的测试数据来测试,就可以粗略地估计算法的执行效率的方法。
大 O 复杂度表示法
1 2 3 4 5 6 7 8
   | int cal(int n) {   int sum = 0;   int i = 1;   for (; i <= n; ++i) {     sum = sum + i;   }   return sum; }
  | 
 
第 2、3 行代码分别需要 1 个 unit_time 的执行时间,第 4、5 行都运行了 n 遍,所以需要 2nunit_time 的执行时间,所以这段代码总的执行时间就是 (2n+2)unit_time。可以看出来,所有代码的执行时间 T(n) 与每行代码的执行次数成正比。
所有代码的执行时间 T(n) 与每行代码的执行次数 n 成正比。
$T(n) = O(f(n))$
这就是大 O 时间复杂度表示法,大 O 时间复杂度实际上并不具体代表代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以也叫做 渐进时间复杂度,简称 时间复杂度。
分析时间复杂度
只关注循环执行次数最多的一点代码
我们在分析一个算法、一段代码的时间复杂度的时候,也只关注循环执行次数最多的那一段代码就可以了。
 
加法法则:总复杂度等于量级最大的那段代码的复杂度
 
乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
 
时间复杂度实例分析

空间复杂度分析
时间复杂度的全称是 渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。类比一下,空间复杂度全称就是渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系。
复杂度种类
最好情况时间复杂度
最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度。
 
最坏情况时间复杂度
最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。
 
平均情况时间复杂度
 
均摊时间复杂度
 
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
   |  int array[] = new int[10];  int len = 10; int i = 0;
 
  void add(int element) {    if (i >= len) {             int new_array[] = new int[len*2];            for (int j = 0; j < len; ++j) {        new_array[j] = array[j];      }            array = new_array;      len = 2 * len;    }        array[i] = element;    ++i; }
 
  | 
 
最好 $O(1)$,最坏 $O(n)$,平均 $O(n)$,均摊 $O(1)$
参考自极客时间
      
     
    
   
  
    
    
    
  
  
    #rewardButton {
    background-color: #ea6f5a;
}
.btn-pay {
    margin-bottom: 20px;
    padding: 8px 25px;
    font-size: 16px;
    color: #fff;
    background-color: #ea6f5a;
}
.btn {
    display: inline-block;
    margin-bottom: 0;
    font-weight: 400;
    text-align: center;
    vertical-align: middle;
    touch-action: manipulation;
    cursor: pointer;
    background-image: none;
    border: 1px solid transparent;
    white-space: nowrap;
    padding: 6px 12px;
    font-size: 14px;
    line-height: 1.42857;
    border-radius: 4px;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}
#QR img{
    height: 200px;
    height: 200px;
    margin: 20px;
}