1. 程式人生 > >算法學習 三 >> 認識算法的效率(循環設計)

算法學習 三 >> 認識算法的效率(循環設計)

scp 復雜度 時間復雜度 ear learn git 計算 mage notes

引子:

例1:求1+2+....+n.


  1. 循環(模擬計算過程):時間復雜度O(n)
    int s = 0;
    for
    (int i = 1; i <= n; i++) s = s + i;

  2. 數學模型(高斯求和):時間復雜度為O(1)
    S = n(n+1)/2

例2:求1-2+3-4.....+(-1)^(n-1)n.


  1. 數學模型:Sn = Sn-1 + (-1)^(n-1)n
    int s = 0;
    for(int i = 1; i <= n; i++)
    {
        sign = -1 * sign;
        s = s + sign * i;        
        
    }  

    時間復雜度:O(n)

例3:求1-3+5-7......(-1)n-1(2n-1).


  1. 數學模型:Sn = Sn-1 + (-1)n-1(2n-1)
    int s = 0;
    for(int i = 1; i <= n; i++)
    {
        sign = -1 * sign;
        s = s + sign * (2*i-1);        
    }  

    時間復雜度:O(n)

例4:1!-3!+5!-7!.....(-1)(n-1)(2n-1)!


  1. 數學模型:Sn = Sn-1 + (-1)n-1(2n - 1)! 或 Sn = Sn-1
    + (-1)n-1|Sn-1|x(2n-2)x(2n-1)
  2. 描述:
    int s = 0;
    for(1到2n-1)
    {
        求2n-1階乘;
        判斷是正還是負後賦值給t;
        s = s + t; 
    }

  3. 實現一:效率低
    int s = 0, signal = -1;
    for(int i = 1; i <= n; i++)
    {
        int t = 1;
        for(int j = 2; j <= 2*n - 1; j++)
            t = t * j;                //求階乘
        signal = - signal;            //
    正負交替 s = s + signal*t; //求和 }

    時間復雜度:O(n2)

  4. 實現二:Sn = Sn-1 + (-1)n-1|Sn-1|x(2n-2)x(2n-1)  效率較高
    int s = 0, signal = -1, t = 1;
    for(int i = 1; i <= n; i++)
    {
        if(i > 1)
            t = t*(2*n-2)*(2*n-1);     //求2n-1的階乘
        signal = - signal;            //正負交替
        s = s + signal*t;             //求和
    }

    時間復雜度:O(n)

例5:小試牛刀>>>求>>> Sn = 1 / 1! - 1 / 4! + 1 / 7!..... 1 / [ (-1)(n-1)(3n-2)! ]的n項和Sn。


  1. input描述:輸入站一行,僅輸入一個正整數n,可輸入多組數據。
  2. output描述:輸出n對應的Sn的值(每組數據的輸出占一行)。
  3. 五組測試數據:(試著做一做在看答案O)

技術分享圖片

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>參考答案?

算法學習 三 >> 認識算法的效率(循環設計)