11

मेरे पास आइटम (बड़े राशन) का संग्रह है जो मैं प्रसंस्करण कर रहा हूं। प्रत्येक मामले में, प्रसंस्करण में संग्रह में सबसे छोटी वस्तु को हटाने, कुछ काम करने, और फिर 0-2 नए आइटम जोड़ना शामिल होगा (जो हमेशा हटाए गए आइटम से बड़ा होगा)। संग्रह एक आइटम के साथ शुरू किया जाएगा, और काम खाली होने तक जारी रहेगा। मुझे यकीन नहीं है कि संग्रह किस आकार तक पहुंचने की संभावना है, लेकिन मैं 1 एम -100 एम वस्तुओं की श्रेणी में अपेक्षा करता हूं। मुझे सबसे छोटे से किसी भी आइटम का पता लगाने की आवश्यकता नहीं होगी।क्या मेरा लाल डेटा का लाल-काला पेड़ है?

मैं वर्तमान में एक लाल-काले पेड़ का उपयोग करने की योजना बना रहा हूं, संभवतः सबसे छोटी वस्तु को पॉइंटर रखने के लिए tweaked। हालांकि मैंने पहले कभी नहीं इस्तेमाल किया है, और मुझे यकीन नहीं है कि मेरे उपयोग का पैटर्न इसकी विशेषताओं को अच्छी तरह से फिट करता है या नहीं।

1) क्या बाएं से हटाने का पैटर्न खतरे में है + यादृच्छिक सम्मिलन प्रदर्शन को प्रभावित करेगा, उदाहरण के लिए यादृच्छिक विलोपन की तुलना में काफी अधिक घूर्णन की आवश्यकता होगी? या उपयोग के इस पैटर्न के साथ अभी भी ओ (लॉग एन) ऑपरेशन हटाएंगे और डालेंगे?

2) क्या कुछ अन्य डेटा संरचना मुझे बेहतर प्रदर्शन देती है, या तो हटाने के पैटर्न या इस तथ्य का लाभ उठाने के कारण मुझे केवल सबसे छोटी वस्तु को खोजने की ज़रूरत है?

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

ह्यूगो

+0

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

उत्तर

12

binary heap आप जो चाहते हैं उसके लिए बहुत बेहतर है। इसे लागू करना और तेज़ करना आसान है क्योंकि आप केवल सबसे छोटे तत्व और सम्मिलन को ढूंढने की परवाह करते हैं। सबसे छोटा तत्व ढूंढना ओ (1) है, इसे हटाकर ओ (लॉग एन) है, और एक सम्मिलन भी ओ (लॉग एन) है।

+0

असल में, अगर वह जानता है कि वह हमेशा हटाए गए एक से बड़ी वस्तु डाल रहा है, तो एक बाइनरी हीप (ट्रेप) एक बिंदु पर बहुत असंतुलित हो जाएगा। 100 एम रिकॉर्ड बहुत अधिक है, इसलिए यह अब असंतुलित हो सकता है ताकि यह अब ओ (लॉग (एन)) न हो, बल्कि ओ (एन) - उदाहरण के लिए, अगर ट्रेप की ऊंचाई 160k हो गई तो एन = 100 एम, तो वह ओ (एन/((एलएनजी)^2)) – Etai

+0

@Etai - मैंने जो परिचालनों का उल्लेख किया है, उसके लिए एक बाइनरी ढेर हमेशा 'ओ (लॉग एन)' है। मुझे नहीं पता कि आपने ट्रेप्स का उल्लेख क्यों किया, मेरा जवाब द्विआधारी ढेर को संदर्भित करता है, न कि झपकी। ढेर वास्तव में ट्रेप्स की संरचना में एक भूमिका निभाते हैं, लेकिन दोनों अलग-अलग डेटा संरचनाएं हैं। – IVlad

+0

बाइनरी ढेर सम्मिलन 'ओ (1) 'औसत (ब्रॉडल के लिए सबसे खराब मामला) है, और बीएसटी पर इसका उपयोग करने का यह मुख्य कारण है: http://stackoverflow.com/a/29548834/895245 –

5

एक ढेर आप हे (1) हे (लॉग एन) को हटाने दे देंगे और हे (लॉग एन) प्रविष्टि, और ज्यादा आसान एक लाल-काले पेड़ से लागू करने के लिए है

+3

दरअसल, निष्कासन ओ (लॉग एन) है, ** ढूंढना (मूल्य का पता लगाना) ** न्यूनतम/अधिकतम ओ (1) है। – IVlad

+0

मैंने कभी भी 1 एम -100 एम वस्तुओं के साथ ढेर नहीं देखा है, क्या किसी के पास कुछ जानकारी है कि इसकी गति को कैसे प्रभावित करता है? –

+3

@ निकलर्सन: यही वही है जो बिग-ओ नोटेशन के लिए है। –

1

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

एक बार जब मैंने कभी एक आत्म-संतुलन वृक्ष लागू किया था, तब एक बार जब मुझे पता चला कि मेरा पेड़ वास्तव में बड़ा (10,000 से अधिक तत्व) होने वाला था, और डेटा क्रमबद्ध स्पर्ट्स में आने वाला था। इसका मतलब था कि अगर मैं एक सामान्य द्विआधारी पेड़ का उपयोग करता, तो मैं लगभग एक लिंक वाली सूची के साथ समाप्त होता।

यदि आपका डेटा यादृच्छिक क्रम में दर्ज किया जा रहा है, तो आपको वास्तव में संतुलन वाले एल्गोरिदम से परेशान नहीं होना चाहिए।

+0

सामान्य रूप से केआईएसएस के बारे में सहमत सबसे पहले, और केवल आवश्यक होने पर जटिल। स्व-संतुलन के लिए आवश्यकता को पूरा करने के कई तरीके हैं, जैसे यादृच्छिक क्रम में डेटा पढ़ने के लिए एक अनुक्रमणिका बनाना, लेकिन चेतावनी यह केवल तभी काम करती है जब आप आवश्यकता को जानते हों। आईई: लाइब्रेरी बनाने में सामान्य उद्देश्य के उपयोग के लिए नहीं। कुछ खराब बेस्टर्ड के लिए इस कोर को छोड़ने के लिए भी बहुत बुरा शिष्टाचार है जिसे बाद में अपना कोड बनाए रखना है। उस ने कहा, मैं आम तौर पर आपके दर्शन से सहमत हूं। – RocketRoy