सरणी आरंभीकरण पर बचत


19

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

उदाहरण के लिए क्यों आश्चर्य की बात हो सकती है:

मान लें कि आप पूर्णांक में में पूर्णांक के सबसे खराब केस हैशटेबल (सम्मिलित / डिलीट / सर्च में से प्रत्येक लिए प्रयास कर रहे हैं ।[ 1 , n 2 ]हे(1)[1,n2]

आप आकार की एक सरणी बिट्स आवंटित कर सकते हैं और हैशटेबल में पूर्णांक के अस्तित्व का प्रतिनिधित्व करने के लिए व्यक्तिगत बिट्स का उपयोग कर सकते हैं । नोट: मेमोरी आवंटित करना समय माना जाता है ।n2O(1)

अब, अगर आप सब पर इस सरणी प्रारंभ करने में नहीं था, कहते हैं की किसी भी क्रम इस hashtable पर कार्रवाई अब सबसे खराब स्थिति है । ( एन )nO(n)

तो वास्तव में, आपके पास "पूर्ण" हैश कार्यान्वयन है, जो संचालन के अनुक्रम के लिए स्थान का उपयोग करता है, लेकिन समय में चलता है !Θ ( n 2 ) हे ( एन )nΘ(n2)O(n)

आम तौर पर किसी से अपेक्षा की जाती है कि आपका रनटाइम कम से कम आपके अंतरिक्ष उपयोग के रूप में खराब हो!

नोट: ऊपर दिए गए उदाहरण का उपयोग विरल सेट या विरल मैट्रिक्स के कार्यान्वयन के लिए किया जा सकता है, इसलिए यह केवल सैद्धांतिक हित नहीं है, मुझे लगता है।

तो सवाल यह है:

डेटा-संरचना की तरह एक सरणी होना कैसे संभव है जो हमें आरंभीकरण कदम को छोड़ने की अनुमति देता है?


@ आर्यभट्ट आपने किस संदर्भ का उल्लेख किया है?
औली

1
"मेमोरी का उपयोग करना" उसी तरह नहीं है जैसे "आवंटित किया गया लेकिन कभी एक्सेस की गई मेमोरी नहीं है", इसलिए मुझे लगता है कि प्रेरक "विरोधाभास" काफी अस्तित्व में नहीं है।
राफेल

1
मुझे लगता है कि पहला पैराग्राफ बहुत स्पष्ट है: एक डिफ़ॉल्ट मान है, वास्तव में डिफ़ॉल्ट मान के साथ सरणी को भरने के लिए समय के बिना। उत्तर, यदि किसी के पास मेरे लिखने से पहले इसे लिखने का समय है, तो यहाँ scholar.google.co.uk/ है / ... मेरे ब्लॉग rgrig.blogspot.co.uk/2008/12/array
html

@ औली: यह एक सीडिंग प्रश्न है, मैं वास्तव में इसे बहुत समय पहले पढ़ता हूं ।
आर्यभट्ट

@ राफेल: जब आप पहली बार इस तरह की बात सुनते हैं तब भी आश्चर्य होता है। अधिकांश विरोधाभास :-) नहीं हैं
आर्यभट्ट

जवाबों:


15

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

तीन अप्रारंभीकृत वैक्टर चलो , पी और वी आकार के एन प्रत्येक। हम अपने डेटा संरचना द्वारा अनुरोधित कार्यों को करने के लिए इनका उपयोग करेंगे। हम एक चर p o s भी बनाए रखते हैं । संचालन निम्नानुसार कार्यान्वित किए गए हैं:पीवीnपीरों

init:
  pos <- 0

set(i,x):
if not(V[i] < pos and P[V[i]] = i) 
  V[i] <- pos, P[pos] <- i, pos <- pos + 1
A[i] <- x

get(i):
if (V[i] < pos and P[V[i]] = i) 
  return A[i] 
else 
  return empty 

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

ध्यान दें कि से 0 में हर पल तत्व , हम जानते हैं कि [पी0 से आरंभीकृत होते हैं। इसलिए हम इन मानों को में प्रारंभिक मूल्यों के लिए एक प्रमाण पत्र के रूप में सुरक्षित रूप से उपयोग कर सकते हैं । हर स्थिति के लिए मैं में एक है कि आरंभ नहीं हो जाता है, वहाँ वेक्टर में एक इसी तत्व है पी जिसका मूल्य के बराबर है मैं । यह वी [ i ] द्वारा इंगित किया गया है । इसलिए, यदि हम इसी तत्व को देखते हैं, P [ V [ i ] ] और इसका मान i हैपीरों-1मैंपीमैंवी[मैं]पी[वी[मैं]]मैं को इनिशियलाइज़ किया गया है (क्योंकि P कभी झूठ नहीं बोलता, क्योंकि हम जिन सभी तत्वों पर विचार कर रहे हैं, वे इनिशियलाइज़ हैं)। इसी प्रकार, यदि A [ i ] को प्रारंभ नहीं किया जाता है, तो V [ i ] सीमा 0 से बाहर P में किसी स्थिति की ओर इशारा कर सकता है .. p o s - 1 , जब हम यह सुनिश्चित करने के लिए जानते हैं कि यह प्रारंभ नहीं हुआ है, या इंगित कर सकता है उस सीमा के भीतर एक स्थिति। लेकिन यह विशेष पी [ जे ] में एक अलग स्थिति से मेल खाती है, और इसलिए[मैं]पी[मैं]वी[मैं]पी0 ..पीरों-1पी[जे] , इसलिए हम जानते हैं कि एक [ मैं ] प्रारंभ नहीं किया गया है।पी[जे]मैं[मैं]

यह देखना आसान है कि ये सभी ऑपरेशन निरंतर समय में किए जाते हैं। इसके अलावा, प्रयुक्त स्थान प्रत्येक वैक्टर के लिए है, और चर p o s के लिए O ( 1 ) है , इसलिए कुल में O ( n ) है।हे(n)हे(1)पीरोंहे(n)


पी[वी[मैं]]मैं[मैं]

यह है, लेकिन तब V V से छोटा होगा [i] अब यह नहीं होगा? कारण अन्यथा यह संयोग से नहीं होगा। चूँकि V [i] की तुलना में अधिक है, इसका मतलब है कि हमने विशेष रूप से P का मूल्य सूचकांक V [i] पर निर्धारित किया है, जिसे हमने चुना है।
भेड़ियाडॉन

ध्यान दें कि यह उस चीज़ का एक उत्कृष्ट उदाहरण है जो (पोर्टेबल) C. में करना असंभव है
TLW
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.