डेटा संरचना के "घुसपैठ" होने का क्या मतलब है?


120

मैंने सूची और स्टैक जैसी डेटा संरचनाओं का वर्णन करने के लिए उपयोग किया जाने वाला घुसपैठ शब्द देखा है , लेकिन इसका क्या मतलब है?

क्या आप एक घुसपैठ डेटा संरचना का एक कोड उदाहरण दे सकते हैं, और यह कैसे गैर-घुसपैठ से अलग होता है?

इसके अलावा, इसे घुसपैठ (या गैर-घुसपैठ) क्यों बनाते हैं? क्या लाभ हैं? नुकसान क्या हैं?

जवाबों:


107

एक घुसपैठ डेटा संरचना वह है जिसे उन तत्वों से सहायता की आवश्यकता होती है जो उन्हें संग्रहीत करने के लिए संग्रहीत करना चाहते हैं।

मुझे वह reword करने दो। जब आप उस डेटा संरचना में कुछ डालते हैं, तो यह "कुछ" इस तथ्य से अवगत हो जाता है कि यह उस डेटा संरचना में है, किसी तरह से। तत्व को डेटा संरचना में जोड़ने से तत्व बदल जाता है।

उदाहरण के लिए, आप एक गैर-घुसपैठ बाइनरी ट्री का निर्माण कर सकते हैं, जहां प्रत्येक नोड में बाएं और दाएं उप-पेड़ों का संदर्भ होता है, और उस नोड के तत्व मूल्य का संदर्भ होता है।

या, आप एक घुसपैठ बना सकते हैं जहां उन उप-पेड़ों के संदर्भ स्वयं मूल्य में एम्बेडेड होते हैं।

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

ORM- सिस्टम आम तौर पर घुसपैठ डेटा संरचनाओं के चारों ओर घूमते हैं, वस्तुओं की बड़ी सूची पर पुनरावृत्ति को कम करने के लिए। उदाहरण के लिए, यदि आप डेटाबेस में सभी कर्मचारियों की सूची प्राप्त करते हैं, तो उनमें से किसी एक का नाम बदलें, और इसे डेटाबेस में वापस सहेजना चाहते हैं, कर्मचारियों की घुसपैठ सूची को तब बताया जाएगा जब कर्मचारी ऑब्जेक्ट बदल गया हो क्योंकि ऑब्जेक्ट जानता है कि यह किस सूची में है।

एक गैर-दखल देने वाली सूची नहीं बताई जाएगी, और यह पता लगाना होगा कि क्या बदल गया और कैसे यह अपने आप बदल गया।


8
मैं अभी भी एक उदाहरण और पेशेवरों और विपक्ष देखना चाहता हूं, लेकिन यह एक अच्छा परिचय है।
रुडिगर

पोस्ट कोड के बजाय मैं कहूंगा कि एसटीएल गैर घुसपैठ है, जबकि बूस्ट.इनट्रसिव घुसपैठ (स्पष्ट रूप से) है।
स्टोनमेटल

1
घुसपैठ करने वाले पेशेवरों: अपने डेटा को आंतरिक संरचना में कॉपी करने की आवश्यकता नहीं है जैसा कि इसका उपयोग किया जा सकता है। विपक्ष: आपके डेटा को जिन कंटेनरों में संग्रहीत किया जा रहा है, उनका समर्थन करने के लिए आपको अपने डेटा पर इनकैप्सुलेशन को तोड़ना होगा। यदि आपके डेटा को कई कंटेनरों में होना चाहिए तो यह मुश्किल हो सकता है। गैर घुसपैठ कंटेनर पेशेवरों: बेहतर encapsulation अपने कंटेनरों के लिए डेटा को संशोधित करने की कोई जरूरत नहीं है। विपक्ष: आंतरिक नोड संरचना में अपने डेटा की एक प्रति की आवश्यकता है।
पत्थरबाज़

3
boost.org/doc/libs/1_45_0/doc/html/intrusive.html में उदाहरण और पेशेवरों और विपक्षों का अच्छा विवरण है।
टोनी डेलरो

5
उदाहरणों के साथ शानदार व्याख्या: boost.org/doc/libs/1_55_0/doc/html/intrusive/…
Paweł Szczur

22

एक घुसपैठ कंटेनर में डेटा कंटेनर के लिए आवश्यक जानकारी संग्रहीत करने के लिए स्वयं जिम्मेदार है। इसका मतलब यह है कि एक तरफ डेटा प्रकार को विशेष करने की आवश्यकता है, यह इस बात पर निर्भर करता है कि इसे कैसे संग्रहीत किया जाएगा, दूसरी तरफ इसका मतलब है कि डेटा "जानता है" कि यह कैसे संग्रहीत किया जाता है और इस तरह इसे थोड़ा बेहतर तरीके से अनुकूलित किया जा सकता है।

गैर दखल:

template<typename T>
class LinkedList
{
  struct ListItem
  {
    T Value;
    ListItem* Prev;
    ListItem* Next;
  };

  ListItem* FirstItem;
  ListItem* LastItem;

  [...]
  ListItem* append(T&& val)
  {
    LastItem = LastItem.Next = new ListItem{val, LastItem, nullptr};
  };
};

LinkedList<int> IntList;

दखल:

template<typename T>
class LinkedList
{
  T* FirstItem;
  T* LastItem;

  [...]
  T* append(T&& val)
  {
    T* newValue = new T(val);
    newValue.Next = nullptr;
    newValue.Prev = LastItem;
    LastItem.Next = newValue;
    LastItem = newValue;
  };
};

struct IntListItem
{
  int Value;
  IntListItem* Prev;
  IntListItem* Next;
};

LinkedList<IntListItem> IntList;

व्यक्तिगत रूप से मैं पारदर्शिता के लिए घुसपैठ डिजाइन पसंद करता हूं।


यह अंतिम पंक्ति "पारदर्शी" शब्द के उपयोग के कारण उत्सुक है क्योंकि एक घुसपैठ कंटेनर में होना वस्तु के लिए पारदर्शी नहीं है
स्लेज

@ArtB यह स्पष्ट करने में स्पष्ट है कि डेटा का उपयोग अंतिम अनुप्रयोग में कैसे किया जाता है, गैर-घुसपैठ डेटा के मामले में आपको आमतौर पर कंटेनरों में खुदाई करना पड़ता है जबकि घुसपैठ डेटा के लिए आप इसे अकेले डेटा की संरचना से देखते हैं।
एपीआई-बीस्ट

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

2
@ArtB ओह! पारदर्शी के लिए कुछ विशेष Computer Science अर्थ है! मेरे लिए पारदर्शी का मतलब है कि आप आंतरिक को देख सकते हैं, उदाहरण के लिए "दृश्य में बाधा नहीं", जैसे शब्द का उपयोग किसी भी गैर-सीएस संदर्भ में किया जाता है।
एपीआई-बीस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.