आपको यह समझने की आवश्यकता है कि एक शब्दकोश कैसे काम करता है। एक शब्दकोश में "हैश बाल्टी" की एक सूची होती है जहां आपके द्वारा डाली गई वस्तुओं को रखा जाता है। यह एक सीमित संख्या है, इसलिए एक बार जब आप इसे भर देते हैं तो आपको अधिक बाल्टी आवंटित करने की आवश्यकता होती है, इसके आसपास कोई रास्ता नहीं है। चूंकि ऑब्जेक्ट-टू-बाल्टी का असाइनमेंट हैश फ़ंक्शन के परिणाम पर आधारित है, इसलिए आप सरणी के अंत में बाल्टी नहीं जोड़ सकते हैं और वहां सामान डाल सकते हैं, आपको ब्लॉक की पूरी सूची को फिर से आवंटित करने की आवश्यकता है, सब कुछ फिर से है और इसे (नई) संबंधित बाल्टी में डाल दिया।
इस व्यवहार को देखते हुए, को फिर से आवंटित करने का एकमात्र तरीका यह सुनिश्चित करने के लिए है कि यह कभी पूर्ण नहीं हो जाता है। यदि आप जानते हैं कि डिक्शनरी में आपके द्वारा डाले गए आइटमों की संख्या इसे कन्स्ट्रक्टर के पैरामीटर के रूप में पास कर देती है और आप कर लेंगे, तो कोई और शब्दकोश फिर से नहीं होगा।
यदि आप ऐसा नहीं कर सकते हैं (आपको शब्दकोश में मौजूद वस्तुओं की संख्या पता नहीं है) तो आपको पहली बार TDictionary
चुनने और डेटा संरचना का चयन करने के लिए पुनर्विचार करना होगा जो आपके विशेष एल्गोरिदम के लिए बेहतर समझौता प्रदान करता है। उदाहरण के लिए आप बाइनरी सर्च पेड़ का उपयोग कर सकते हैं, क्योंकि वे मौजूदा नोड्स में जानकारी घूर्णन करके संतुलन करते हैं, फिर से आवंटन कभी की आवश्यकता नहीं है।
स्रोत
2011-12-02 12:52:30
मुझे लगता है कि मूल धारणा यह है कि आप अपने पूरे उपलब्ध संसाधनों में से आधा एक 'TDictionary' उदाहरण में उपभोग नहीं करते हैं। यह इस तरह के उपयोग के लिए डिज़ाइन नहीं किया गया है। –
तो यह "नहीं, यह संभव नहीं है" होगा? – jpfollenius
एक बार जब आप मेमोरी का आधा हिस्सा ले लेते हैं, तो आप कोई पुनर्वितरण कैसे करते हैं। मान लीजिए कि आप एक और 10% जोड़ना चाहते हैं। आपको एक नया ब्लॉक आवंटित करना होगा, मौजूदा से 10% बड़ा। फिर पुराने से नए में कॉपी करें। फिर बूढ़े को हटा दें। वह काम नहीं करेगा। यह मेरे लिए अजीब लगता है कि एक भी कंटेनर आपके संसाधनों में से आधे से अधिक उपभोग कर सकता है। –