算法時間複雜度

做者: 李鵬
 

算法複雜度分爲時間複雜度和空間複雜度,一個好的算法應該具體執行時間短,所需空間少的特色。算法

     隨着計算機硬件和軟件的提高,一個算法的執行時間是算不太精確的。只能依據統計方法對算法進行估算。咱們拋開硬件和軟件的因素,算法的好壞直接影響程序的運行時間。
     咱們看一下小例子:
     int value = 0;                         // 執行了1次
     for (int i = 0; i < n; i++) {       // 執行了n次
          value += i;
     }
     這個算法執行了 1 + n 次,若是n無限大,咱們能夠把前邊的1忽略,也就是說這個算法執行了n次
     時間複雜度經常使用大O符號表示,這個算法的時間複雜度就是O(n).
     概念: 通常狀況下,算法的基本操做重複執行的次數是模塊n的某一函數f(n),所以,算法的時間複雜度記作 T(n) = O(f(n))。 隨着模塊n的增大,算法執行的時間增加率f(n)的增加率成正比,因此f(n)越小,算法 的時間複雜度越低,算法的效率越高。
      計算時間複雜度
     1.去掉運行時間中的全部加法常數。
     2.只保留最高階項。
     3.若是最高階項存在且不是1,去掉與這個最高階相乘的常數獲得時間複雜度
 
咱們看一個例子
     for (int i = 0; i < n; i++) {
          for (int j = i; j < n; j++) {
               // do .....
          }
     }
當 i = 0 時 裏面的fo循環執行了n次,當i等待1時裏面的for循環執行了n -  1次,當i 等於2裏裏面的fro執行了n - 2次........因此執行的次數是
根據咱們上邊的時間複雜度算法
     1.去掉運行時間中的全部加法常數: 沒有加法常數不用考慮
     2.只保留最高階項: 只保留 
     3. 去掉與這個最高階相乘的常數:  去掉   只剩下 
     最終這個算法的時間複雜度爲
 
再看一個線性的
      for ( int i = 0; i < n; i++) {
          // do .....
     }
     由於循環要執行n次因此時間複雜度爲O(n)
 
其它的我也就不一個一個算了,下面給出了經常使用的時間複雜度
 

排序法函數

最差時間分析 平均時間複雜度 穩定度 空間複雜度
冒泡排序 O(n2) O(n2) 穩定 O(1)
快速排序 O(n2) O(n*log2n) 不穩定 O(log2n)~O(n)
選擇排序 O(n2) O(n2) 穩定 O(1)
二叉樹排序 O(n2) O(n*log2n) 不一頂 O(n)

插入排序blog

O(n2) O(n2) 穩定 O(1)
堆排序 O(n*log2n) O(n*log2n) 不穩定 O(1)
希爾排序 O O 不穩定 O(1)
相關文章
相關標籤/搜索