2010-11-05 9 views
6

जैसा कि मैंने समझा है, जब आप निम्न की तरह अभिव्यक्ति के साथ एक नई सूची बनाते हैं, ErlangL1 की प्रतिलिपि नहीं करता है, तो यह केवल H की प्रतिलिपि बनाता है।एरलांग लगातार डेटा संरचनाएं

L2 = [H|L1] 

वह यह है कि जब आप पेड़ केवल कुछ तत्वों (Clojure में) कॉपी किए गए किया जा रहा है में जोड़ें/निकालें/संशोधित नोड्स Erlang dict के लिए लगातार एक डेटा संरचना (Persistent data structure देखें) करता है,?

उत्तर

11

जब आप [H|T] का उपयोग करके एक सूची बनाते हैं तो आपने स्थिति को गलत समझा है। जैसा कि आप कहते हैं कि T कॉपी नहीं किया गया है लेकिन न तो H है। ऐसा ही होता है कि H के संदर्भ के साथ T पर एक नया सूची सेल प्रीपेड किया गया है (इसकी पूंछ T है)। सूचियों के साथ काम करते समय केवल बनाई गई बिट्स वास्तविक सूची कक्ष हैं और प्रत्येक सेल में डेटा कभी नहीं।

ऐसा ही होता है जब dict के साथ काम करते हैं। जब आप dict में संशोधित (तत्व जोड़ें/हटाएं) केवल वास्तविक dict संरचना संशोधित की जाती है और dict में वास्तविक डेटा नहीं है। यह भी स्मार्ट है ताकि संशोधन करने के लिए आवश्यक dict संरचना के रूप में केवल कॉपी करें।

तो, हाँ, एरलांग में लगातार डेटा संरचनाएं हैं। उस संबंध में क्लोजर एरलांग की तरह है (हम इससे पहले बहुत लंबे थे)।

+1

ठीक है, हम यहां पॉइंटर्स और मानों पर चर्चा नहीं करेंगे, अंतर मेरे लिए स्पष्ट है, बिंदु यह है कि बड़े इन-मेमोरी की-वैल्यू स्टोर्स के साथ कैसे काम करना है जिसमें दृढ़ता है (इसलिए कोई भी नहीं)। मैंने उल्लेख किया है कि कुछ मूल्यों के संशोधन के दौरान क्लोजर में रूट से उस मान तक केवल पथ की प्रतिलिपि बनाई जाती है (3-4 नोड्स) और हमारे पास दो पेड़ हैं: नया और पुराना। हम erlang में यह कैसे कर सकते हैं? क्या बॉक्स से कुछ संरचना इस तरह के व्यवहार को लागू करती है? – adolgarev

+0

'ए = कुछ ट्री, बी = परिवर्तन (ए)।'अब आपके पास ट्री बी और ट्री ए है, जहां' बी 'नया है और' ए 'पुराना है ..' {ए, बी} 'का उपयोग करके दोनों पेड़ों को एक ही टुपल में रखा जाता है। क्या आप यही जानना चाहते हैं? –

+0

एनओपी, मुझे ए = कुछ ट्री, बी = चेंज (ए) की आवश्यकता है, और ए और बी कुछ आम टुकड़े साझा करते हैं, http://en.wikipedia.org/wiki/Purely_functional#Trees – adolgarev

2

मेरे अनुभव में, पुस्तकालय मॉड्यूल के लिए डेटा संरचनाएं बड़े होने पर प्रदर्शन या स्मृति दबाव में गिरावट नहीं आती हैं।

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

मैं भी gb_trees मॉड्यूल जहाँ मैं टिप्पणी पाया में देखा:

व्यवहार logaritmic है (के रूप में यह होना चाहिए)।

और gb_trees आम तौर पर बहुत तेज़ होते हैं, इसलिए मुझे पूरा यकीन है कि बहुत अधिक प्रतिलिपि चल रही नहीं है।

आम तौर पर, यदि आप इरलांग जैसी भाषा में डेटा संरचनाओं को लागू करते हैं, तो आप समस्याओं की प्रतिलिपि बनाने का ख्याल रखते हैं, इसलिए सामान्य लाइब्रेरी फ़ंक्शंस के लिए इसके बारे में चिंता करने की आवश्यकता नहीं है।


मैं लगातार डेटा संरचनाओं के बारे में लेख पुन: पढ़ने: इस लेख के अर्थ में, Erlang के डेटा संरचनाओं पूरी तरह से लगातार और भी confluently लगातार कर रहे हैं।

+0

और रैखिक संरचनाओं के बारे में क्या? क्या वेक्टर (या उस मामले के लिए एक सेट) जैसी कोई चीज है जिसमें उन प्रदर्शन की गारंटी है? –

+0

हां वहाँ है .. 'सरणी' और fwiw 'set' ... क्या आपने दस्तावेज़ों को देखने का भी प्रयास किया था? –

संबंधित मुद्दे