2015-03-02 14 views
22

मैं इसफ्लाई (औसत चलती औसत) पर औसत कुशलतापूर्वक गणना कैसे करें?

n=1; 
curAvg = 0; 
loop{ 
    curAvg = curAvg + (newNum - curAvg)/n; 
    n++; 
} 

मुझे लगता है कि इस तरह से की मुख्य आकर्षण हैं के साथ आते हैं:
- यह बड़ी संख्या से बचा जाता है (और संभव अतिप्रवाह अगर आप योग और फिर विभाजित)
- आप एक रजिस्टर को बचाने (नहीं योग को स्टोर करने की आवश्यकता है)

समस्या को हल करने में समस्या हो सकती है - लेकिन मुझे लगता है कि आमतौर पर गोलियों और गोलियों की संतुलित संख्या होगी ताकि त्रुटि नाटकीय रूप से समेकित न हो।

क्या आपको इस समाधान में कोई समस्या है? क्या आपके पास कोई बेहतर प्रस्ताव है?

+0

मुझे आपके फॉर्मूला को समझ में नहीं आता है। अगले '1 2' और' 3' के लिए, आप 'curAvg = 1.5 + (3 - 1.5)/2 = 1.5 + 0.75 = 2.25' करेंगे, जो गलत होगा? – IVlad

+1

इसी प्रकार का प्रश्न: http://stackoverflow.com/questions/12636613/how-to-calculate-moving-Average-without-keeping-the-count-and-data- कुल –

+0

@IVlad: लूप 1: curAvg = 0 + (1-0)/1 = 1; एन = 2
लूप 2: curAvg = 1 + (2-1)/2=1.5; एन = 3
पाश 3: curAvg = 1.5 + (3-1.5)/3 = 2; n = 4 –

उत्तर

14

आपका समाधान अनिवार्य रूप से "मानक" इष्टतम ऑनलाइन समाधान है जो बड़ी रकम को संग्रहीत किए बिना औसत चलने वाला ट्रैक रखने के लिए और "ऑनलाइन" चलाने के दौरान भी है, यानी आप किसी अन्य नंबर पर वापस बिना किसी नंबर पर प्रक्रिया कर सकते हैं , और आप केवल अतिरिक्त स्मृति की निरंतर मात्रा का उपयोग करते हैं। यदि आप "ऑनलाइन" होने की लागत पर संख्यात्मक शुद्धता के मामले में थोड़ा अनुकूलित समाधान चाहते हैं, तो मान लें कि आपकी संख्याएं सभी गैर-ऋणात्मक हैं, फिर अपनी संख्याओं को सबसे पहले सबसे छोटे से क्रमबद्ध करें और फिर उन्हें उस क्रम में संसाधित करें, वैसे ही आप अभी करते हैं। इस तरह, यदि आपको संख्याओं का एक समूह मिलता है जो वास्तव में बराबर के बारे में छोटे होते हैं और फिर आपको एक बड़ी संख्या मिलती है, तो आप पहले बड़ी संख्या में संसाधित होने के विपरीत औसत के बिना सटीक गणना कर सकेंगे।

-4

उपरोक्त सूत्र बकवास है। सरल गणित और सटीक हुक्म होगा:

n यात्रा काउंटर, AV चल रहा है औसत है, newVal नया मान

प्रारंभ n=0, AV=0

((AV * n) + newVal)/(n+1) = AV 

कोई शॉर्टकट नहीं है, आपके पास करने के लिए है सभी संख्याएं और पुनरावृत्तियों की संख्या से उन्हें विभाजित करें, हालांकि आप यह जानकर संख्याओं में से एक को पुनर्निर्माण कर सकते हैं कि यह कौन सा पुनरावृत्ति है, यह कुल रन रखने या फिर से गणना करने का एक टॉसअप है। फिर से गणना करने का समय एक उच्च लागत पर स्मृति की स्थिति में संभवतः कम लागत को संग्रहीत करने की लागत है और फिर से गणना करने के लिए कोड निश्चित रूप से कुल और पुनरावृत्ति को पकड़ने के लिए स्मृति स्थान से अधिक होगा।

+1

वे बिल्कुल वही सूत्र हैं जो अलग-अलग प्रस्तुत किए गए हैं। एवी को अपने फॉर्म के नामांकित करने के लिए जोड़ें और घटाएं और आपको (एवी * (एन + 1) + न्यूवेल - एवी)/(एन + 1) मिलता है, जिसे पुन: व्यवस्थित किया जा सकता है - एवी * (एन + 1)/(एन + 1) + (न्यूवेल - एवी)/(एन + 1) – Itai

+2

आपका समाधान गणितीय रूप से सही है लेकिन आपके पास एक अतिरिक्त गुणा है। कुछ संख्याओं को आज़माएं और आप देखेंगे कि मेरा समाधान काफी अच्छा काम करता है ... शायद आप कुछ सामान्य ज्ञान का उपयोग करने की कोशिश कर सकते हैं और थोड़ा अधिक विनम्र हो सकते हैं। यदि 6 पीपीएल सहमत है कि यह "मानक इष्टतम समाधान" है तो यह लिखना सही नहीं हो सकता है कि यह "बकवास" है। –

संबंधित मुद्दे