2014年12月24日 星期三

演算法訓練 3 ─ Moving Average

http://4rdp.blogspot.com/2014/12/3-moving-average.html?m=0

演算法訓練第一集 平均演算法,頗受大家熱烈迴響,第三集延續這個主軸出一個姊妹題給大家想想:

以移動平均法,每十筆相鄰資料做平均計算。


這個移動平均法最常被用在股價週線、月線、年線上計算,會使用它的原因在可以屏除很久以前的歷史資料。

這裡所出的題目,不限制程式語言,甚至以純文字表述也歡迎,就算有人已經以某種語言發表答案,也歡迎你用更精簡方式或是其它程式語言再重製,一個好的程式,應同時注重程式碼大小、占用記憶體資源與執行效率。在此貼出的程式碼,著作權除非另有聲明,否則屬貼文者的,其內容純研究討論供大眾參考,也不負任何使用損壞賠償責任。

4 則留言:

  1. 你好, 在GOOGLE PID用法時碰巧看到您的文章, 所以用C#與法試寫了一個:

    private int counter = 0;
    private bool flag = true;
    private Queue FIFO = new Queue();
    private float answer;

    public float add_new(float current_data)
    {
    switch (flag)
    {
    case true:
    FIFO.Enqueue(current_data);
    if (counter == 9)
    {
    flag = false;
    answer = FIFO.Average();
    }
    else
    {
    counter++;
    answer = 0;
    }
    break;
    default:
    FIFO.Dequeue();
    FIFO.Enqueue(current_data);
    answer = FIFO.Average();
    break;
    }
    return answer;
    }

    回覆刪除
    回覆
    1. fu-i 你好,

      PID 確實是本格文章閱覽率最高的,很高興認識你,謝謝提供程式範例。

      刪除
  2. 我想以下的演算法可能效率高些
    先 count 數值個數,
    1. n <10 不計算
    2. n>=10,
    今天的 MV = (X1 + X2...+X10)/10, 往前回推10個值計算平均值
    昨天的 MV(1) = MV+(-X1 + X11)/10, 今天的MV值 (減 昨日值 加前11日值)/10

    好處是效率高些,壞處是後人比較不好 re-use 這個 function.

    回覆刪除
    回覆
    1. 行天下,
      你總是會提供令人料想不到的方法,這方式不錯,倒過來算,然後又減少計算量。

      刪除