演算法--複雜度

GeorgeIT發表於2018-08-25

演算法複雜度:

  1. 時間複雜度:執行一個演算法程式,所需要的時間

  2. 空間複雜度:執行一個演算法程式,所消耗計算機記憶體大小

時間複雜度

o(1):

  1. 常數階,指的無論資料量如何遞增,時間複雜度保持不變,典型的演算法就是hash演算法

  2. n的值不管如何的變動,其演算法執行次數都是3次,故這種時間恆定的就是常數階

  <?php
        $sum = 0; $n = 3;
        $sum = ($n-1)*$n;
        echo $sum;

o(n)

  1. 線性階,指的是時間的複雜度會隨著n的而線性增長。

  2. 下面的程式碼的時間複雜度是o(n),因為程式碼的執行次數會執行n次,公式 times = n;比例為1;

    <?php
        for($i = 0; $i < $n; $i++) {
        }

o(logn)

  1. 對數階,如n=256,則算出為o(8),演算法執行的次數為8次。

  2. 如下所示,2^x= n,推出 x = log2^n,所以當n設定為256的時候,while迴圈執行程式需要8次。

    $count = 1;
    while ($count < $n) {
        $count *= 2;
    }

o(n^2)

  1. 平方階,通常指的都是雙重迴圈

  2. 如下,時間複雜度就是o(n*n)

    for ($i = 0; $i < $n; $i++) {
        for($j = 0; $j < $n; $j++) {
        }
    }
  1. 如下 時間的複雜度為o(m*n)
    for ($i = 0; $i < $m; $i++) {
        for($j = 0; $j < $n; $j++) {
        }
    }
  1. 如下,涉及到等差數列的計算,演算法執行的總次數 = n + (n-1)+ (n-2)+ .. +1 = n(n+1)/2 = n^2/2+1/2*n。我們在推導o階函式的時候:第一沒有常數不考慮;第二保持最高階的項,故保持n^2/2;第三去除係數;所以最終演算法的複雜度還是o(n^2)
    for ($i = 0; $i < $n; $i++) {
        for($j = 0; $j < $n-$i; $j++) {
        }
    }

常見的時間複雜度

    階                非正式術語
    O(1)             常數階  
    O(n)             線性階
    O(n2)            平方階
    O(logn)          對數階
    O(nlogn)         nlogn階
    O(n3)            立方階
    O(2n)            指數階

    常用的時間複雜度所耗費的時間從小到大依次是:
    O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)

演算法空間複雜度

  1. 演算法的空間複雜度透過計算演算法所需的儲存空間實現
  2. 演算法空間複雜度的計算公式:S(n) = O(f(n)),其中 n 為問題的規模,f(n)為語句關於 n 所佔儲存空間的函式。

總結

  1. 演算法是解決特定問題求解步驟的描述,在計算機中為指令的有限序列,並且每條指令表示一個或多個操作。
  2. 演算法的特性:有窮性、確定性、可行性、輸入、輸出。
  3. 演算法的設計要求:正確性、可讀性、健壯性、高效率和低儲存量需求。
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章