प्रारंभिक निरंतर समय में सरणी सरणी - इस चाल को क्या कहा जाता है?


13

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

यह हाल ही में स्टैक ओवरफ्लो पर इस जवाब में आया है , लेकिन मुझे याद नहीं है कि इस ट्रिक का आधिकारिक नाम है या नहीं। क्या यह?

एक उपयोग का मामला है दिक्जस्ट्रा का एल्गोरिथ्म यदि नोड्स के केवल एक छोटे उपसमूह को आराम करना है, और यदि यह बार-बार किया जाना है।


2
दिलचस्प चाल है, लेकिन यह काफी उपरि है। तो मुझे आश्चर्य है कि जो उपयोग करता है वह सरणी को ऐसे सामान्य ऑपरेशन के रूप में समाविष्ट करता है जिसका मूल्य भुगतान करता है? (गंभीर सवाल!)
जोकिम सउर

@ जोशिमसौर: संपादित।
21 नवंबर को krlmlr

मेमोरी उपयोग और एक्सेस कॉस्ट दोनों के लिए सामान्य मामले में बहुत महंगा लगता है। इस तकनीक के लिए उपयोग का मामला बहुत विशिष्ट होना चाहिए।
मार्टिन

3
@ जोचिम: इसका उपयोग स्पष्ट बफ़र्स को रेंडर करने के लिए किया जाता है- मोटे तौर पर। उनके पास बस 64kb प्रति "क्लियर बिट" या कुछ इस तरह का है।
डेडएमजी

3
@ user946850 "amortized" का अर्थ है कि आप यह साबित कर सकते हैं कि एक महंगा ऑपरेशन समग्र चित्र में शायद ही कभी होता है कि यह ओ (1) से अधिक योगदान नहीं करता है

जवाबों:


2

पूर्वोक्त दृष्टिकोण की आवश्यकता है कि प्रत्येक सेल एक बड़ी संख्या को धारण करने में सक्षम हो सकता है, जिस समय सरणी को पुन: व्यवस्थित करने की आवश्यकता हो सकती है, जो कि एक पर्याप्त स्थान जुर्माना है। यदि कोई स्लॉट कम से कम एक मान रखने में सक्षम है, जो कभी वैध रूप से नहीं लिखा जाएगा, तो कोई O(Wlg(N))समय जुर्माना जोड़ने की कीमत पर किसी भी अन्य (गैर-स्थिर) अंतरिक्ष दंड से बच सकता है , जहां विभिन्न सरणी स्लॉट्स के बीच Wकी संख्या लिखी गई है समाशोधन संचालन और सरणी का आकार है। उदाहरण के लिए, मान लीजिए कि एक पूर्णांक -2,147,483,647 से 2,147,483,647 (लेकिन कभी -2,147,483,648) नहीं होगा और कोई रिक्त सरणी आइटम को शून्य पर पढ़ना चाहता है। सरणी को -2,147,483,648 (उस मूल्य पर कॉल करें) से भरना शुरू करेंNB)। आवेदन के लिए एक सरणी स्लॉट पढ़ते समय, Bशून्य के मान की रिपोर्ट करें । सरणी स्लॉट लिखने से पहले I, जाँच करें कि क्या यह निर्णय किया Bऔर अगर ऐसा है और Iएक से अधिक, स्लॉट के लिए एक शून्य की दुकान है I/4(, और अगर यह मानते थे कि स्थान के लिए एक समान की जांच करने के बाद B, I/16, आदि)।

सरणी को खाली करने के लिए, I0 या 1 के बराबर से शुरू करें, सरणी आधार पर निर्भर करता है (जैसा कि वर्णित एल्गोरिथ्म या तो काम करेगा)। फिर निम्न प्रक्रिया को दोहराएं: यदि आइटम Iहै B, वेतन वृद्धि Iऔर, यदि ऐसा करने से चार में से कई का उत्पादन होता है, तो चार से विभाजित करें (समाप्त करें यदि विभाजित 1 का मूल्य देता है); यदि आइटम Iनहीं है B, तो Bवहां स्टोर करें और Iचार से गुणा करें (यदि Iशून्य से शुरू होता है, तो चार से गुणा करने से यह शून्य हो जाएगा, लेकिन चूंकि आइटम 0 रिक्त Iहोगा , वेतन वृद्धि होगी)।

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


सभी मूल्यों को ताजा मूल्यों के साथ अद्यतन करने से पहले पर्याप्त अनुक्रमिक रीसेट को समायोजित करने के लिए एक संस्करण काउंटर सक्षम होना पर्याप्त है। व्यवहार में एक बाइट पर्याप्त हो सकता है, या तंग छोरों में भी कम हो सकता है।
9000

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

1
... यदि काउंटर की रैप वैल्यू स्थिर है, तो प्रत्येक एरे क्लियर ऑपरेशन के लिए कार्य की औसत मात्रा O (N) होगी, एन के साथ एरे का आकार होगा। ऐसा नहीं है कि इस तरह की चीज व्यवहार में उपयोगी नहीं हो सकती है, क्योंकि एक ओ (एन) कार्यान्वयन जो 65,536 के कारक द्वारा फैलाया जाता है, फिर भी ओ (एन) होगा, लेकिन गैर-सुधारे हुए के रूप में 65,536 गुना तेज भी होगा । संयोग से, ऐसे मामले जहां ये दृष्टिकोण सहायक होंगे, एक विरल-सरणी डेटा संरचना का उपयोग करने से भी लाभ हो सकता है, जो एक गैर-रिक्त तत्वों के साथ एन के आकार के सरणी के साथ सरणी रखने के लिए O (AlgN) स्थान का उपयोग कर सकता है।
सुपरकैट

1

मैं इसे "आलसी एरे सेल रीइन्फोर्समेंटेशन" कहूंगा, लेकिन इसका कोई स्थापित नाम नहीं है (यानी नाम व्यापक उपयोग में है)।

एल्गोरिथ्म चतुर है, लेकिन बहुत ही संकीर्ण क्षेत्र में बहुत विशिष्ट और लागू है।


1

मेरा मानना ​​है कि यह संस्मरण का एक विशेष मामला है , इस मामले को छोड़कर, वैश्विक काउंटर के प्रत्येक वेतन वृद्धि के साथ "मेमो" का अर्थ "उम्र" है। मुझे लगता है कि एक प्रकार का "बैकवर्ड मेमोइज़ेशन" है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.