के बीच से एक तत्व निकालें मैं एक अतिरिक्त आवश्यकता के साथ शेड्यूलर के रूप में प्राथमिकता कतार का उपयोग कर रहा हूं। मुझे अनुसूचित वस्तुओं को रद्द करने में सक्षम होना चाहिए। यह प्राथमिकता कतार के बीच से किसी आइटम को हटाने के बराबर है।एक std :: heap
मैं std::priority_queue
का उपयोग शीर्ष के अलावा किसी अन्य तत्व तक पहुंच के रूप में नहीं कर सकता।
मैं algorithm
के ढेर कार्यों का उपयोग करने की कोशिश कर रहा हूं। लेकिन मुझे अभी भी उस टुकड़े को याद आ रहा है जो मुझे चाहिए। जब मैं ढेर के बीच से एक तत्व हटा देता हूं, तो मैं इसे कुशलता से पुनर्निर्माण करना चाहता हूं।
std::make_heap
ओ (3n)std::push_heap
ओ (एलजी (एन))std::pop_heap
हे (2 एलजी (एन))
मुझे एक नया फ़ंक्शन चाहिए जैसे std::repair_heap
एक बड़े-ओ < 3n। मैं इसे छेद के स्थान के साथ प्रदान करूंगा जहां रद्द आइटम का उपयोग किया जाता था और यह ठीक से ढेर को समायोजित करेगा।
यह std::repair_heap
फ़ंक्शन प्रदान नहीं करने के लिए एक बड़ी निगरानी प्रतीत होता है। क्या मुझसे साफ़ - साफ़ कुछ चीज़ चूक रही है?
क्या ऐसी लाइब्रेरी है जो एक stl-compliant std::repair_heap
प्रदान करती है?
क्या शेड्यूलर मॉडलिंग के लिए कोई बेहतर डेटा संरचना है?
नोट:
मैं कुछ कारणों के लिए एक std::map
का उपयोग नहीं कर रहा हूँ।
- एक ढेर में लगातार स्मृति ओवरहेड है।
- एक ढेर में शानदार कैश इलाके है।
अगर मैं गलत हूं तो कृपया मुझे सही करें, लेकिन मुझे लगता है कि आपको इसके लिए 'std :: make_heap' कॉल करना होगा, क्योंकि आपको किसी भी तरह के तत्वों को स्थानांतरित करना होगा। –
मैं सिर्फ 'std :: make_heap' का उपयोग कर सकता हूं। लेकिन ऐसा लगता है कि एक तेज विकल्प होना चाहिए। मुझे संदेह है कि 'repair_heap' को _O (lg (n)) _, पुश और पॉप की तरह लिखा जा सकता है। मेरा तर्क है कि 'repair_heap' सिर्फ सिर के बजाय ढेर के बीच से पॉपिंग कर रहा है। –
मैंने इसी तरह की शेड्यूलिंग समस्या (सी ++ में नहीं) के लिए 'repair_heap' जैसी कुछ लिखा है और यह किया जा सकता है। बाद में मैंने 'std :: priority_queue' के साथ एक ही समस्या को मारा और आखिरकार मैंने फैसला किया कि निष्कासन (संभवतः आपके लिए सच नहीं है) की तुलना में निष्कासन इतना कम था कि मैंने तत्व को हटाते समय ढेर की प्रतिलिपि बनाई थी। उस मामले में मेरा लक्ष्य जितना संभव हो उतना नया/अवांछित कोड बनाना था। –