算法效率分析(原創文章)

算法是一系列解決問題的明確指令,對于一定符合規范的輸入,能夠在有限時間內獲得要求的輸出。從實際問題的提出到設計合適的算法再到正確性的分析以及算法效率的分析,最后為算法編寫代碼,一步步得到問題的解決方案。

算法效率分析(原創文章)的圖1

圖1.算法的概念

算法效率分析(原創文章)的圖2

圖2.算法設計分析過程

對算法效率的分析,需要指出有兩種算法效率:時間效率和空間效率,分指算法運行速度和需要的額外空間。由于技術革新,對于大多數問題,速度上效率的提高遠大于空間上的提高。在研究算法效率上提出一般性框架。

定義1:如果存在正常數c和算法效率分析(原創文章)的圖3使得當算法效率分析(原創文章)的圖4算法效率分析(原創文章)的圖5,則記為算法效率分析(原創文章)的圖6

定義2:如果存在正常數c和算法效率分析(原創文章)的圖7使得當算法效率分析(原創文章)的圖8算法效率分析(原創文章)的圖9,則記為算法效率分析(原創文章)的圖10

定義3算法效率分析(原創文章)的圖11當且僅當算法效率分析(原創文章)的圖12算法效率分析(原創文章)的圖13

定義4:如果算法效率分析(原創文章)的圖14算法效率分析(原創文章)的圖15,則算法效率分析(原創文章)的圖16

定義的目的實在函數之間建立相對的級別。可直觀的理解為算法效率分析(原創文章)的圖17增長率小于等于算法效率分析(原創文章)的圖18算法效率分析(原創文章)的圖19增長率大于等于算法效率分析(原創文章)的圖20算法效率分析(原創文章)的圖21增長率等于算法效率分析(原創文章)的圖22算法效率分析(原創文章)的圖23增長率小于算法效率分析(原創文章)的圖24

法則1:如果算法效率分析(原創文章)的圖25算法效率分析(原創文章)的圖26,那么

(a)算法效率分析(原創文章)的圖27

(b)算法效率分析(原創文章)的圖28

法則2:如果算法效率分析(原創文章)的圖29是k次多項式,則算法效率分析(原創文章)的圖30

法則3:對任意常數k,算法效率分析(原創文章)的圖31

 

下面以最大子序列和問題的四種解決方法來分析算法的效率問題。

最大子序列和:給定整數算法效率分析(原創文章)的圖32(可能含負數),求算法效率分析(原創文章)的圖33最大值(若所有整數為負,則最大子序列和為0)

算法
1 2 3 4
時間
算法效率分析(原創文章)的圖34 算法效率分析(原創文章)的圖35 算法效率分析(原創文章)的圖36 算法效率分析(原創文章)的圖37
輸入大小/m N=10
0.00103

0.00045

0.00066

0.00034
N=100

0.47015

0.01112

0.00486

0.00063


N=1000

448.77

1.1233

0.05843

0.00333


N=10000

NA

111.13

0.68631

0.03042


N=100000

NA

NA

8.0113

0.29832


算法效率分析(原創文章)的圖38

算法效率分析(原創文章)的圖39

方法一、窮舉嘗試所有可能,含有3重for循環。第一循環大小為N,第二循環大小為算法效率分析(原創文章)的圖40,第三循環大小為算法效率分析(原創文章)的圖41。考慮最差時間效率,第二循環第三循環大小均為N。總數為算法效率分析(原創文章)的圖42。可精確分析,第三循環時間算法效率分析(原創文章)的圖43

int MaxSubsequenceSum(const int A[], int N)

{

    int ThisSum, MaxSum, i, j, k;

    MaxSum = 0;

    for (i = 0; i < N;i++)

       for (j = i; j < N; j++)

       {

          ThisSum = 0;

          for (k = i; k <= j; k++)

              ThisSum += A[k];

          if (ThisSum > MaxSum)

              MaxSum = ThisSum;

       }

       return MaxSum;

}

算法效率分析(原創文章)的圖44

方法二、在方法一的基礎上去掉三重循環,復雜度降為算法效率分析(原創文章)的圖45

int MaxSubsequenceSum(const int A[], int N)

{

   int ThisSum, MaxSum, i, j, k;

   MaxSum = 0;

   for (i = 0; i < N; i++)

   {

       ThisSum = 0;

       for (j = i; j < N; j++)

       {

          ThisSum += A[k];

         if (ThisSum > MaxSum)

           MaxSum = ThisSum;

       }

   }

   return MaxSum;

}


方法三、使用一種遞歸的方法,使復雜度降為算法效率分析(原創文章)的圖46。當問題無法找到算法效率分析(原創文章)的圖47復雜度的線性解法前,該方法很好的體現遞歸的強力。方法使用“分治”策略。將問題“分割”成兩個大致相等的子問題,再將兩個子問題的解合并,再做少量工作使問題解決。

假設測試序列:

前半部 后半部





4
-3 5
-2 -1
2
6 -2

1前半部最大子序列和為6(算法效率分析(原創文章)的圖48),后半部最大子序列和為8(算法效率分析(原創文章)的圖49

2前半部包含最后元素最大和為4(算法效率分析(原創文章)的圖50),后半部第一元素最大和為7(算法效率分析(原創文章)的圖51

3兩部分最大和11(算法效率分析(原創文章)的圖52

算法3比前兩種需要更多代碼量,但在運行時間上,特別是大數據量的運算時間,會比前兩種方法節省更多時間。


方法四、極為簡潔而且更加的有效。打破了第二循環和第三循環,使運行時間變為線性。

int MaxSubsequenceSum(const int A[], int N)

{

   int ThisSum, MaxSum, j;

   MaxSum = ThisSum = 0;

   for (j = 0; j < N; j++)

   {

      ThisSum += A[j];

      if (ThisSum > MaxSum)

         MaxSum = ThisSum;

      else if (ThisSum < 0)

        ThisSum = 0;

  }

   return MaxSum;

}

在實際的代碼編寫中,對算法復雜度進行估算,可以更加有計劃性的進行算法改進。提高時間效率。

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP