Naive कार्यान्वयन वास्तव में इस समस्या को उजागर करेगा - जब आप किसी मौजूदा एक को अपडेट करने के बजाय एक नई डेटा संरचना बनाते हैं, तो आपको कुछ ओवरहेड करना होगा।
विभिन्न भाषाओं में इससे निपटने के अलग-अलग तरीके होते हैं, और उनमें से कुछ तरकीबें होती हैं।
एक रणनीति कचरा संग्रहण है । जिस समय नई संरचना बनाई गई है, या कुछ ही समय बाद, पुरानी संरचना के संदर्भ दायरे से बाहर हो गए हैं, और जीसी एल्गोरिथ्म के आधार पर कचरा कलेक्टर इसे तुरंत या बहुत जल्द उठाएगा। इसका मतलब यह है कि जहां अभी भी एक ओवरहेड है, यह केवल अस्थायी है, और डेटा की मात्रा के साथ रैखिक रूप से नहीं बढ़ेगा।
एक अन्य डेटा संरचनाओं के विभिन्न प्रकार उठा रहा है। जहाँ सरणियाँ अनिवार्य भाषाओं में डेटा संरचना को सूचीबद्ध करने के लिए होती हैं (आमतौर पर किसी प्रकार के डायनेमिक-रियलाइजेशन कंटेनर जैसे कि std::vector
C ++ में लिपटे हुए ), कार्यात्मक भाषाएं अक्सर लिंक की गई सूचियों को पसंद करती हैं। लिंक की गई सूची के साथ, एक प्रीपेन्ड ऑपरेशन ('विपक्ष') नई सूची की पूंछ के रूप में मौजूदा सूची का पुन: उपयोग कर सकता है, इसलिए जो वास्तव में आवंटित किया जाता है वह नई सूची का प्रमुख होता है। अन्य प्रकार की डेटा संरचनाओं के लिए समान रणनीति मौजूद है - सेट, पेड़, आप इसे नाम देते हैं।
और फिर आलसी मूल्यांकन है, अ ला हास्केल। विचार यह है कि आपके द्वारा बनाई गई डेटा संरचनाएं पूरी तरह से तुरंत नहीं बनाई गई हैं; इसके बजाय, उन्हें "थ्रक्स" के रूप में संग्रहीत किया जाता है (आप जब आवश्यक हो तो मूल्य के निर्माण के लिए व्यंजनों के रूप में सोच सकते हैं)। केवल तभी जब मूल्य की आवश्यकता होती है, थंक एक वास्तविक मूल्य में विस्तारित हो जाता है। इसका मतलब है कि मूल्यांकन आवश्यक होने तक मेमोरी आवंटन को स्थगित किया जा सकता है, और उस बिंदु पर, कई थ्रेड्स को एक मेमोरी आवंटन में जोड़ा जा सकता है।