मैं एक कार्यात्मक शब्दकोश डेटा संरचना कैसे चुन सकता हूं?


10

मैंने निम्नलिखित डेटा संरचनाओं के बारे में थोड़ा पढ़ा है:

  • Bagwell के आदर्श हैश की कोशिश करता है
  • लार्सन की डायनामिक हैश टेबल
  • लाल-काले पेड़
  • पेट्रीसिया के पेड़

... और मुझे यकीन है कि वहाँ बहुत सारे लोग हैं। मैंने इस बारे में बहुत कम देखा है कि प्रत्येक व्यक्ति किसके लिए बेहतर अनुकूल है, या मैं दूसरे पर एक का चयन क्यों करूंगा। तो, यहाँ इन लाइनों के साथ कुछ सवाल हैं:

  1. किस कार्यात्मक शब्दकोश डेटा संरचनाओं के बारे में जानना महत्वपूर्ण है?
  2. इन दृष्टिकोणों के पक्ष और विपक्ष क्या हैं?
  3. एक अधिक अनिवार्य डेटा संरचना का उपयोग करना कब समझ में आता है?

संख्या 2 और 3 हालांकि अधिक महत्वपूर्ण हैं। :-)



इस प्रश्न (आइटम नंबर 3 के अलावा) में एक [बड़ी सूची] की भावना है।
केव

2
यह जानना उपयोगी होगा कि क्या उपरोक्त लिंक आपकी चिंताओं को संबोधित करता है, और यदि नहीं तो क्यों नहीं?
सुरेश वेंकट

@ सुरेश - यह उत्तर # 1 है, लेकिन 2 और 3 अधिक महत्वपूर्ण थे। मैं ज्यादातर एक बड़े चित्र के अवलोकन के लिए देख रहा हूँ, ताकि मैं यह निर्धारित कर सकूँ कि कौन से लोग अधिक गहराई से अध्ययन करने के लायक हैं।
जेसन

2
ठीक। तो यह सवाल संपादन के लायक हो सकता है।
सुरेश वेंकट

जवाबों:


16

मैं वास्तव में बिना खोए # 2 का जवाब नहीं दे सकता (बहुत सारे आयाम हैं जिनके साथ आप इन संरचनाओं की तुलना कर सकते हैं), लेकिन # 3 के लिए उत्तर बहुत सरल है।

एक अनिवार्य डेटा संरचना का उपयोग करें अगर: (ए) बिल्कुल कोई अलियासिंग नहीं है, या (ख) आपको वास्तव में कुशल प्रसारण के लिए अलियासिंग का उपयोग करने की आवश्यकता है।

यदि आपकी डेटा संरचना में कोई भी बदलाव नहीं है, तो आप इस तथ्य का लाभ नहीं उठा रहे हैं कि कार्यात्मक डेटा संरचनाएं लगातार हैं। इसलिए उनकी लागत का भुगतान करने का कोई कारण नहीं है। इस सलाह के दो संकेत हैं। सबसे पहले, आप एक कार्यात्मक डेटा संरचना के कार्यान्वयन की सादगी पसंद कर सकते हैं: एक कार्यात्मक लाल-काले पेड़ के लिए विलोपन को लागू करना आपको अभिशाप बना देगा, लेकिन माता-पिता के संकेत के साथ एक लाल-काले पेड़ में विलोपन को लागू करना आपको आत्महत्या का विचार करने पर छोड़ देगा। दूसरा, असाइनमेंट एक gc'd भाषा में आपकी अपेक्षा से अधिक महंगा हो सकता है, क्योंकि लिखने से युवा पीढ़ी से डेटा संरचनाएं निकल सकती हैं। हमारे पास वास्तव में कैश इफेक्ट्स और gc का अच्छा सिद्धांत नहीं है, इसलिए आपके पास बेंचमार्किंग करने के अलावा कोई विकल्प नहीं है।

दूसरा, यदि आपको एक प्रसारण चैनल की आवश्यकता है, तो एक साझा डेटा संरचना इसे करने का एक शानदार तरीका है। निरंतर-समय के अद्यतन के साथ, आप मनमाने ढंग से कई अन्य लोगों को बता सकते हैं कि एक मूल्य बदल गया है। (यही कारण है कि संघ-खोज एक ऐसी महान डेटा संरचना है।) विशुद्ध रूप से कार्यात्मक सेटअप के साथ, आपको या तो उन सभी अन्य लोगों को संशोधित करने की आवश्यकता है, या उन्हें एक राज्य में अमूर्त संकेत देते हैं जिसे आप मैन्युअल रूप से कोड करते हैं (जो एक तरह का ऑब्सट्यूट है। करने के लिए)।

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

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


2
इस संदर्भ में क्या उपनाम है?
सुरेश वेंकट

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

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

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

1

किस कार्यात्मक शब्दकोश डेटा संरचनाओं के बारे में जानना महत्वपूर्ण है?

ऊँचाई-संतुलित द्विआधारी पेड़ और उनमें से एक अच्छा चौतरफा समझौता है। इसके अलावा:

  • पेट्रीसिया के पेड़।
  • हैश कोशिश करता है।

इन दृष्टिकोणों के पक्ष और विपक्ष क्या हैं?

ऊंचाई पर संतुलित बाइनरी पेड़ और उनमें से एक परमाणु कुंजी के लिए एक अच्छा चौतरफा समझौता है। ट्राई सीन्स के लिए समान हैं जो सीक्वेंस हैं, जैसे स्ट्रिंग कीज़।

पेट्रीसिया के पेड़ कई गुना तेज हो सकते हैं लेकिन केवल पूर्णांक कुंजियों को अनुमति देते हैं।

हैश कोशिश संतुलित द्विआधारी पेड़ों की तुलना में कई गुना तेज हो सकती है, खासकर अगर हैशिंग तुलना की तुलना में सस्ता है और बहुरूपता के पास एक ओवरहेड (जैसे .NET पर स्ट्रिंग्स) है और ढेर में पॉइंटर्स लिखना तेजी से है (उदाहरण के लिए वीवी जैसे जेवीएम और सीएलआर जो कि किया गया है) कार्यात्मक भाषाओं के बजाय अनिवार्य भाषाओं के लिए अनुकूलित)। हैश कोशिश करता है कि अनुकूलन के रूप में म्यूटेशन के आंतरिक उपयोग की भी अनुमति दें।

लाल-काले पेड़ कम महत्वपूर्ण हैं क्योंकि उन्हें ऊंचाई वाले संतुलित पेड़ों पर कोई महत्वपूर्ण लाभ नहीं है, लेकिन महत्वपूर्ण नुकसान यह है कि वे कुशल संघ, चौराहे और अंतर की अनुमति नहीं देते हैं।

इसी तरह, उंगली के पेड़ अभ्यास में ज्यादा बेहतर नहीं हैं।

एक अधिक अनिवार्य डेटा संरचना का उपयोग करना कब समझ में आता है?

जब आपका शब्दकोश एक बार आबाद हो जाता है और तब केवल लुकअप के लिए उपयोग किया जाता है, अर्थात जमे हुए।

जब आपको प्रदर्शन की आवश्यकता होती है (.NET जैसी एक सभ्य हैश तालिका Dictionaryआमतौर पर किसी भी सामान्य शुद्ध कार्यात्मक शब्दकोश की तुलना में 10-40 × तेज होती है)।

जब आपको एक कमजोर शब्दकोश की आवश्यकता होती है क्योंकि कोई विशुद्ध रूप से कार्यात्मक कमजोर शब्दकोष नहीं होता है।

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