Cosa significa per una struttura dati essere "invadente"?


120

Ho visto il termine invadente usato per descrivere strutture di dati come elenchi e pile, ma cosa significa?

Puoi fornire un esempio di codice di una struttura di dati intrusiva e in che modo differisce da una non intrusiva?

Inoltre, perché renderlo invadente (o non invadente)? Quali sono i vantaggi? Quali sono gli svantaggi?

Risposte:


107

Una struttura dati intrusiva è quella che richiede l'aiuto degli elementi che intende archiviare per memorizzarli.

Lasciatemi riformulare. Quando metti qualcosa in quella struttura dati, quel "qualcosa" diventa consapevole del fatto che è in quella struttura dati, in qualche modo. L'aggiunta dell'elemento alla struttura dati modifica l'elemento.

Ad esempio, puoi creare un albero binario non intrusivo, in cui ogni nodo ha un riferimento ai sottoalberi sinistro e destro e un riferimento al valore dell'elemento di quel nodo.

Oppure puoi crearne uno intrusivo in cui i riferimenti a quei sottoalberi sono incorporati nel valore stesso.

Un esempio di una struttura di dati intrusiva sarebbe un elenco ordinato di elementi che sono mutabili. Se l'elemento cambia, l'elenco deve essere riordinato, quindi l'oggetto elenco deve intromettersi nella privacy degli elementi per ottenere la loro collaborazione. vale a dire. l'elemento deve conoscere l'elenco in cui si trova e informarlo dei cambiamenti.

I sistemi ORM di solito ruotano attorno a strutture di dati intrusive, per ridurre al minimo l'iterazione su grandi elenchi di oggetti. Ad esempio, se si recupera un elenco di tutti i dipendenti nel database, quindi si cambia il nome di uno di essi e si desidera salvarlo di nuovo nel database, l'elenco intrusivo dei dipendenti verrà comunicato quando l'oggetto dipendente è cambiato perché quello l'oggetto sa in quale elenco si trova.

Un elenco non invadente non sarebbe stato raccontato e avrebbe dovuto capire cosa è cambiato e come è cambiato da solo.


8
Mi piacerebbe comunque vedere un esempio e i pro ei contro, ma questa è una buona introduzione.
Rudiger

Piuttosto che codice postale dirò che l'STL non è invadente, mentre Boost.Intrusive è invadente (ovviamente).
pietraia

1
Pro intrusivi: non è necessario copiare i dati in una struttura interna che possono essere utilizzati così come sono. Contro: è necessario interrompere l'incapsulamento dei dati per supportare i contenitori in cui verranno archiviati i dati. Può diventare complicato se i dati devono trovarsi in più contenitori. Contenitori non intrusivi Pro: migliore incapsulamento, non è necessario modificare i dati per i contenitori. Contro: richiede una copia dei dati nella struttura del nodo interno.
pietraia

3
boost.org/doc/libs/1_45_0/doc/html/intrusive.html contiene esempi e una buona descrizione dei pro e dei contro.
Tony Delroy


22

In un contenitore intrusivo i dati stessi sono responsabili della memorizzazione delle informazioni necessarie per il contenitore. Ciò significa che da un lato il tipo di dati deve essere specializzato a seconda di come verrà memorizzato, dall'altro significa che i dati "sanno" come vengono memorizzati e quindi possono essere ottimizzati leggermente meglio.

Non intrusivo:

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;

Invadente:

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;

Personalmente preferisco il design invadente per la sua trasparenza.


Quest'ultima riga è curiosa a causa dell'uso della parola "trasparente" poiché trovarsi in un contenitore invadente non è trasparente all'oggetto.
Slitta

@ArtB È più chiaro nel trasmettere come i dati vengono utilizzati esattamente nell'applicazione finale, nel caso di dati non intrusivi di solito devi scavare nei contenitori mentre per i dati intrusivi li vedi solo dalla struttura dei dati.
API-Beast

1
Ebbene, suppongo che qualsiasi utilizzo "trasparente" di trasparente dovrebbe essere qualificato da quale prospettiva. Nella mia esperienza "trasparente" è spesso usato per indicare che il modo in cui i dati vengono gestiti è invisibile al dominio (cioè che la modellazione del dominio è pura). Se il termine viene utilizzato in entrambi i modi, mi chiedo se abbia qualche valore in esso.
Slitta

2
@ArtB Oh! C'è un significato speciale di informatica per trasparente! Trasparente per me significa che puoi vedere gli interni, ad esempio "non ostruire la vista", come il termine è usato in qualsiasi contesto non cs.
API-Beast
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.