2013-08-09 14 views
5

मेरे पास कुछ कोड है जो एक रोलिंग विंडो - "रोलिंग माध्य" में एक माध्य को ट्रैक करने के लिए बूस्ट संचयक का उपयोग करता है। रोलिंग मतलब के अलावा, मैं इस रोलिंग विंडो में न्यूनतम और अधिकतम ट्रैक करना चाहता हूं।सी ++ बूस्ट के लिए रोलिंग न्यूनतम और रोलिंग अधिकतम?

क्या बूस्ट संचयक के साथ रोलिंग मिनट और रोलिंग अधिकतम गणना करने का कोई तरीका है? मुझे कोई रास्ता नहीं दिख रहा है ...

मैंने rolling_mean के लिए उपयोग किए गए संचयक में न्यूनतम और अधिकतम टैग जोड़ने का प्रयास किया है, लेकिन यह मुझे वह नहीं देता जो मुझे चाहिए।

typedef accumulator_set<uint32_t, stats<tag::rolling_mean> > rollingMeanAcc_t; 

typedef accumulator_set<uint32_t, stats<tag::rolling_mean,tag::min,tag::max> > rollingMeanAcc_t; 

हालांकि, मिनट हो जाता है और अधिकतम यहाँ प्रदान पूरे संचायक से अधिक गणना कर रहे हैं, बजाय मतलब के रूप में ही रोलिंग खिड़की तक ही सीमित।

बूस्ट documentation का कहना है कि न्यूनतम और अधिकतम भर में गणना सभी नमूने, एक रोलिंग खिड़की तक ही सीमित नहीं। वे नमूनों को सीमित या वजन देने का तरीका प्रदान नहीं करते हैं।

मैं रोलिंग विंडो में सभी/न्यूनतम/अधिकतम रिपोर्ट करने में सक्षम होना चाहता हूं।

मैं वर्तमान में बूस्ट संस्करण 1.48.0 का उपयोग कर रहा हूं। मैंने नवीनतम संस्करण (1.54.0) के लिए प्रलेखन को देखा है और वहां लागू रोलिंग न्यूनतम/अधिकतम दिखाई नहीं देता है।

मुझे sliding window minimum को ट्रैक करने के लिए एक गैर-बूस्ट तरीका मिला है, लेकिन यह ऐसा नहीं लगता है जो मैं चाहता हूं। मैं मूल्यों को सिर्फ इसलिए नहीं हटाना चाहता क्योंकि वे पिछले न्यूनतम/अधिकतम से अधिक/कम हैं, क्योंकि रोलिंग_मेअन गलत होगा।

उत्तर

6

मुझे नहीं लगता कि एक संचयक रोलिंग न्यूनतम/अधिकतम कर सकता है।

समस्या बहुत सरल है: परिभाषा द्वारा बहुत अधिक संचयक केवल ओ (1) डेटा का उपयोग करता है - यह संसाधित होने वाले डेटा को संग्रहीत नहीं करता है। यह ओ (1) डेटा के साथ एक न्यूनतम या अधिकतम बनाए रख सकता है, क्योंकि यह वर्तमान न्यूनतम/अधिकतम की सीमा के बाहर आता है जब यह वर्तमान न्यूनतम/अधिकतम बदलता है।

हालांकि, खिड़की के लिए, इसे विपरीत करने के लिए तैयार होने की आवश्यकता है: जब वर्तमान मिनट खिड़की से बाहर निकलता है, तो उसे नया न्यूनतम - विंडो में अगला सबसे छोटा नंबर ढूंढना होगा। निश्चित रूप से अधिकतम के लिए, बिल्कुल।

अब, विचार करें कि न्यूनतम (यदि उदाहरण के लिए) इनपुट सॉर्ट किया गया है तो न्यूनतम क्या होता है। हर बार जब एक विंडो खिड़की से हटा दी जाती है, तो हमें एक अलग न्यूनतम मूल्य मिलता है। दूसरे शब्दों में, संचयी को न्यूनतम न्यूनतम तरीके से बनाए रखने के लिए विंडो में सभी डेटा स्टोर करने की आवश्यकता होगी। इसी प्रकार, अवरोही क्रम में क्रमबद्ध इनपुट के साथ अधिकतम के लिए।

संक्षेप में, आप इसके लिए एक संचयक का उपयोग नहीं कर सकते हैं। आपको खिड़की में सभी डेटा स्टोर करने की जरूरत है।

+0

धन्यवाद। यह समझ में आता है। क्या इस के आसपास एक रास्ता हो सकता है?क्या मैं किसी भी तरह से "रीसेट" या संचयक में संग्रहीत वर्तमान अधिकतम और मिनट को ओवरराइट कर सकता हूं? –

0

एक और चालाक एल्गोरिदम हो सकता है (वास्तव में शायद वहां है), लेकिन मेरे सिर के ऊपर से, मैं बस एक गोलाकार बफर में खिड़की को स्टोर करता हूं और रोलिंग न्यूनतम/अधिकतम मांग की गणना करता हूं। जब परिणाम बदलता है तो परिणाम कैश करें और गंदे झंडा सेट करें। यह ओ (1) संचय ऑपरेशन और ओ (के) के सबसे बुरे मामले के साथ एक अमूर्त ओ (1) निकालने का ऑपरेशन देता है, जहां के खिड़की का आकार होता है।

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