2012-11-02 160 views
1

我正在研究計算數組的多個平均最大值的算法。該陣列包含時間/價值對,例如5小時內Garmin設備上記錄的HR數據。數據大約每秒一次,但是沒有保證頻率。一個例子是10分鐘平均最大值,這是最大平均10分鐘持續時間值。假設「平均值」只是本次討論的平均值。期望的平均最大值的持續時間是任意的,1分鐘,5分鐘,60分鐘。而且,我可能需要其中的很多 - 至少30個,但如果不是一個冗長的請求,最好是任何需求。數組值的平均最大子集

現在我有一個簡單的算法來計算價值:

1)開始在陣列的開頭和「走」着,直到子集等於或1元過去所需的持續時間。如果到達數組的末尾,則停止。

2)找出這些子集值的平均值。如果大於當前最大值,則存儲爲最大平均值。

3)從陣列左側移出一個值。

4)從1開始重複,直到數組結束。

它基本上計算每個可能的連續平均值並返回最大值。 它在每個持續時間都這樣做。它可以連續計算一個實際的平均值計算,而不是通過移除左邊的點並加上右邊來以某種方式滑動它,就像人們可以爲簡單移動平均值系列做的那樣。根據總陣列大小,每個平均最大值需要大約3-10秒。

我想知道如何優化這個。例如,所有平均最大值的序列將是1s值最高的指數曲線,並且下降直到滿足整個平均值。該曲線和所有值是否可以從一定數量的點內插?還是對上面的重計算還有其他一些優化但仍然保持準確性?

回答

1

「它會連續計算一個實際的avg計算,而不是通過刪除左邊的點和增加右邊來以某種方式滑動它,就像一個簡單的移動平均值系列一樣。」

爲什麼不只是滑動它(即保持一個運行總和除以該總和中元素的數量)?

+0

這就是我在該聲明中暗指的,但保持運行總和而不僅僅是運行平均值是我失去了做這項工作的一塊。謝謝。我會測試它,看看如何提高性能。仍然對其他想法開放。 – Miro

+0

偉大的開始,這個滑動平均更新已經大大提高了性能。特別是對於更大的細分市場,它不是計算數千點的平均值,而是隻進行3次算術計算。 – Miro

相關問題