अंतिम N संख्याओं का भारित योग


19

मान लीजिए कि हमें एक स्ट्रीम में नंबर मिल रहे हैं। प्रत्येक संख्या प्राप्त होने के बाद, अंतिम संख्याओं के भारित योग की गणना करने की आवश्यकता होती है, जहां वेट हमेशा समान होता है, लेकिन मनमाना होता है।एन

अगर हम कम्प्यूटेशन में मदद करने के लिए डेटा संरचना रखने की अनुमति देते हैं तो यह कितनी कुशलता से किया जा सकता है? क्या हम किसी भी समय प्राप्त होने वाली राशि की तुलना में से बेहतर कर सकते हैं , यानी हर बार राशि का पुन: उपयोग?Θ(एन)

उदाहरण के लिए: मान लीजिए कि वजन । एक बिंदु पर हमारे पास अंतिम संख्या , और भारित योग ।डब्ल्यू=w1,w2,w3,w4एनL1=a,b,c,d>S1=w1a+w2b+w3c+w4d

जब कोई अन्य संख्या, , प्राप्त होती है, तो हम को प्राप्त करने के लिए सूची को अपडेट करते हैं और हमें गणना करने की आवश्यकता होती है। ।एल 2 = , , , एस 2 = डब्ल्यू 1 * + डब्ल्यू 2 * + डब्ल्यू 3 * + डब्ल्यू 4 * एल2=,सी,,एस2=w1*+w2*सी+w3*+w4*

एफएफटी का उपयोग करते हुए विचार इस समस्या का एक विशेष मामला फास्ट फूरियर ट्रांसफॉर्म को नियोजित करके कुशलता से हल करने योग्य प्रतीत होता है। यहाँ, हम गुणकों में भारित गणना करते हैं । दूसरे शब्दों में, हम नंबर प्राप्त करते हैं और उसके बाद ही हम संबंधित तौला रकम की गणना कर सकते हैं । ऐसा करने के लिए, हमें कुल नंबरों में पिछले नंबरों (जिसके लिए रकम पहले ही गणना की जा चुकी है) और नए नंबरों की आवश्यकता है।एन एन एन एन - 1 एन 2 एन - 1एसएनएनएनएन-1एन2एन-1

यदि इनपुट नंबरों का यह वेक्टर और वेट वेक्टर बहुपद के गुणांक और को परिभाषित करता है, तो Q में गुणांक के साथ उलट होता है, तो हम देखते हैं कि उत्पाद P (x) \ गुना Q (x) x है बहुपद जिसका गुणांक x ^ {N-1} से x ^ {2N-2} के सामने होता है, ठीक उसी तरह से भारित रकम जो हम चाहते हैं। इनकी गणना FFT का उपयोग करके \ Theta (N * \ log (N)) समय के साथ की जा सकती है, जो हमें औसत प्रति इनपुट नंबर के लिए Θ (\ log (N)) समय देती है।P ( x ) Q ( x ) Q P ( x ) × Q ( x ) x N - 1 x 2 N - 2( N Θ लॉग ( N ) ) Θ ( log ( N ) )डब्ल्यूपी(एक्स)क्यू(एक्स)क्यूपी(एक्स)×क्यू(एक्स)एक्सएन-1एक्स2एन-2Θ(Nlog(N))Θ(log(N))

हालाँकि यह समस्या का एक हल नहीं है, जैसा कि कहा गया है, क्योंकि यह आवश्यक है कि भारित राशि की गणना हर बार कुशलता से की जाए जब एक नया नंबर प्राप्त होता है - हम गणना में देरी नहीं कर सकते।


ध्यान दें कि आप यहां LaTeX का उपयोग कर सकते हैं।
राफेल

क्या कुछ ज्ञात वितरण से इनपुट आ रहे हैं? क्या उनके पास कोई उपयोगी गणितीय गुण हैं? यदि वे नहीं करते हैं, तो इसकी संभावना नहीं है कि यह संभव है (जब तक कि कोई व्यक्ति एक साफ बंद रूप को खोजने में सक्षम न हो, जो सबलाइनियर कम्प्यूटेशनल है - मैं निश्चित रूप से एक नहीं पा सकता हूं)। इसके अलावा, ठीक हैं? यह एक तरीका हो सकता है अगर यह आपके लिए उपयोगी हो।
आरडीएन

एफआईआर फिल्टर ऐसा करते हैं, इसलिए उनका डिज़ाइन प्रासंगिक होगा।
एड्रियन एन

@RDN मैंने इस प्रश्न को एक जिज्ञासा के रूप में प्रस्तुत किया, मेरे पास व्यावहारिक अनुप्रयोग नहीं है।
अम्ब्रोज़ बिज्जक

जवाबों:


6

यहाँ आपके दृष्टिकोण का विस्तार है। हर पुनरावृत्तियों, हम गणना करने के लिए FFT एल्गोरिथ्म का उपयोग समय में घुमाव के मूल्यों , यह सोचते हैं कि बाद में मान शून्य है। दूसरे शब्दों में, हम कर रहे हैं जहां वजन हैं (या रिवर्स वेट), इनपुट अनुक्रम है, वर्तमान समय है, और लिए ।मीटर हे ( एन लॉग इन करें n ) मीटर n - 1 Σ मैं = 0 डब्ल्यू मैं एक टी - मैं + कश्मीर ,O(nlogn)mडब्ल्यू मैं n एक मैं टी एक टी ' = 0 टी ' > टी

i=0n1wiati+,0-1,
wमैंnमैंटीटी'=0टी'>टी

निम्नलिखित पुनरावृत्तियों में से प्रत्येक के लिए , हम समय ( वें पुनरावृत्ति समय आवश्यकता है में आवश्यक दृढ़ संकल्प की गणना करने में सक्षम हैं । इसलिए परिशोधन समय । यह को चुनकर कम से कम किया जाता है , जो एक परिचालित चल समय देता है ।O ( m ) i O ( i ) O ( m ) + O ( n log n / m ) m = हे()मैंहे(मैं)हे()+हे(nलॉगn/) O( √)=nलॉगnहे(nलॉगn)

हम कम्प्यूटेशन को भागों में तोड़कर सबसे खराब समय के मामले में इसे सुधार सकते हैं । ठीक करें , और प्रत्येक केवल इनपुट पर निर्भर करता है, इसलिए इसे समय में परिकलित किया जा सकता है । इसके अलावा, लिए को देखते हुए , हम समय में कनवल्शन की गणना कर सकते हैं । इसलिए योजना की सूची बनाए रखने के लिए की प्रत्येक अवधि के लिएमीटर टी , पी , = मीटर - 1 Σ मैं = 0 डब्ल्यू पी मीटर + मैं एक टी एम - मैं + ,हे(nलॉगn)सी टी , पी 2 मीटर हे ( मीटर लॉग मीटर ) सी टी / मी - पी , पी 0 पी n / मीटर - 1 हे ( एन / मीटर + मीटर

टी,पी,=Σमैं=0-1wपी+मैंटी-मैं+,सीटी,पी=टी,पी,0,...,टी,पी,-1
सीटी,पी2हे(लॉग)सीटी/-पी,पी0पीn/-1हे(n/+)
सीटी/-पी,पी,0पीn/-1।
इनपुट्स, हमें इनमें से को अपडेट करने की आवश्यकता है । प्रत्येक अपडेट में समय लगता है , इसलिए यदि हम इन अपडेट को समान रूप से फैलाते हैं, तो प्रत्येक इनपुट । साथ ही साथ कनवल्शन की गणना करने पर, इनपुट के प्रति समय जटिलता । पहले की तरह चुनना , यह ।n/हे(लॉग)हे((n/2)लॉग)=हे((n/)लॉग)हे((n/)लॉग+)=nलॉगnहे(nलॉगn)

अद्भुत समाधान, धन्यवाद, मुझे यकीन नहीं था कि अगर यह किया जा सकता है।
अम्ब्रोज़ बिज्जक

और यह काम करता है! सी कार्यान्वयन: ideone.com/opuoMj
अम्ब्रोज़ बिज्जक

मेह, मुझे याद आ रहा था कि अंतिम बिट कोड जो वास्तव में गणना को तोड़ता है , यहां ideone.com/GRXMAZ तय किया गया है ।
अम्ब्रोज़ बिज्जक

मेरी मशीन पर यह एल्गोरिथ्म लगभग 17000 वज़न पर सरल एल्गोरिथ्म से तेज़ होना शुरू होता है। वजन की छोटी संख्या के लिए यह धीमा है। बेंचमार्क: ideone.com/b7erxu
अंबोज़ बिज्जक

बहुत प्रभावशाली है कि आपने वास्तव में इसे लागू किया है! आप शायद पर ऑप्टिमाइज़ करना चाहते हैं । चुनाव सिर्फ एक मोटा गाइड है, और यह इष्टतम नहीं हो सकता है। क्या आपने विभिन्न मूल्यों के साथ एल्गोरिथ्म चलाने की कोशिश की ? =nलॉगn
युवल फिल्मस २२'१३
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.