Was bedeutet es, wenn eine Datenstruktur “aufdringlich” ist?

Lesezeit: 4 Minuten

Benutzeravatar von Rüdiger
Rüdiger

Ich habe den Begriff gesehen aufdringlich verwendet, um Datenstrukturen wie Listen und Stapel zu beschreiben, aber was bedeutet es?

Können Sie ein Codebeispiel für eine aufdringliche Datenstruktur geben und wie sie sich von einer nicht aufdringlichen unterscheidet?

Warum auch aufdringlich (oder nicht aufdringlich)? Was sind die Vorteile? Was sind die Nachteile?

Eine aufdringliche Datenstruktur ist eine Struktur, die die Hilfe der Elemente erfordert, die sie speichern möchte, um sie zu speichern.

Lassen Sie mich das umformulieren. Wenn Sie etwas in diese Datenstruktur einfügen, wird diesem „Etwas“ auf irgendeine Weise bewusst, dass es sich in dieser Datenstruktur befindet. Das Hinzufügen des Elements zur Datenstruktur ändert das Element.

Beispielsweise können Sie einen nicht-intrusiven Binärbaum erstellen, bei dem jeder Knoten einen Verweis auf die linken und rechten Teilbäume und einen Verweis auf den Elementwert dieses Knotens hat.

Oder Sie können eine aufdringliche erstellen, bei der die Verweise auf diese Unterbäume in den Wert selbst eingebettet sind.

Ein Beispiel für eine aufdringliche Datenstruktur wäre eine geordnete Liste von Elementen, die veränderbar sind. Wenn sich das Element ändert, muss die Liste neu geordnet werden, sodass das Listenobjekt in die Privatsphäre der Elemente eindringen muss, um ihre Zusammenarbeit zu erreichen. dh. das Element muss wissen, in welcher Liste es sich befindet, und es über Änderungen informieren.

ORM-Systeme drehen sich normalerweise um störende Datenstrukturen, um die Iteration über große Listen von Objekten zu minimieren. Wenn Sie beispielsweise eine Liste aller Mitarbeiter in der Datenbank abrufen, dann den Namen eines von ihnen ändern und ihn wieder in der Datenbank speichern möchten, würde die aufdringliche Mitarbeiterliste informiert, wenn sich das Mitarbeiterobjekt dadurch geändert hat Objekt weiß, in welcher Liste es sich befindet.

Eine nicht aufdringliche Liste würde nicht informiert und müsste selbst herausfinden, was sich geändert hat und wie es sich geändert hat.

  • Ich würde immer noch gerne ein Beispiel und die Vor- und Nachteile sehen, aber dies ist eine gute Einführung.

    – Rüdiger

    15. Februar 2011 um 14:30 Uhr

  • Anstatt Postcode werde ich sagen, dass die STL nicht aufdringlich ist, während Boost.Intrusive (offensichtlich) aufdringlich ist.

    – Steinmetall

    15. Februar 2011 um 16:05 Uhr


  • Aufdringliche Vorteile: Sie müssen Ihre Daten nicht in eine interne Struktur kopieren, sie können so verwendet werden, wie sie sind. Nachteile: Sie müssen die Kapselung Ihrer Daten aufheben, um die Container zu unterstützen, in denen Ihre Daten gespeichert werden. Es kann schwierig werden, wenn sich Ihre Daten in mehreren Containern befinden müssen. Nicht aufdringliche Container Vorteile: Bessere Kapselung, keine Notwendigkeit, Daten für Ihre Container zu ändern. Nachteile: Erfordert eine Kopie Ihrer Daten in die interne Knotenstruktur.

    – Steinmetall

    15. Februar 2011 um 16:11 Uhr

  • boost.org/doc/libs/1_45_0/doc/html/intrusive.html enthält Beispiele und eine gute Beschreibung der Vor- und Nachteile.

    – Toni Delroy

    16. Februar 2011 um 6:37 Uhr

  • Tolle Erklärung mit Beispielen: boost.org/doc/libs/1_55_0/doc/html/intrusive/…

    – Pawel Szczur

    24. April 2014 um 8:34 Uhr


In einem intrusiven Container sind die Daten selbst dafür verantwortlich, die notwendigen Informationen für den Container zu speichern. Das bedeutet einerseits, dass der Datentyp je nach Art der Speicherung spezialisiert werden muss, andererseits bedeutet dies, dass die Daten „wissen“, wie sie gespeichert werden, und somit etwas besser optimiert werden können.

Nicht aufdringlich:

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;

Aufdringlich:

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;

Ich persönlich bevorzuge aufdringliches Design wegen seiner Transparenz.

  • Diese letzte Zeile ist aufgrund der Verwendung des Wortes “transparent” merkwürdig, da es sich um einen aufdringlichen Container handelt nicht transparent für das Objekt.

    – Schlitten

    20. Mai 2014 um 12:55 Uhr

  • @ArtB Es ist klarer zu vermitteln, wie die Daten in der endgültigen Anwendung genau verwendet werden. Bei nicht aufdringlichen Daten müssen Sie normalerweise in die Container eingreifen, während Sie dies bei aufdringlichen Daten allein an der Struktur der Daten erkennen.

    – API-Biest

    20. Mai 2014 um 14:24 Uhr

  • Nun, ich nehme an, jede Verwendung “transparent” von transparent sollte dahingehend qualifiziert werden, aus welcher Perspektive. Meiner Erfahrung nach wird “transparent” oft verwendet, um anzuzeigen, dass die Art und Weise, wie die Daten behandelt werden, für die Domäne unsichtbar ist (dh dass die Domänenmodellierung rein ist). Wenn der Begriff in beide Richtungen verwendet wird, frage ich mich, ob er irgendeinen Wert hat.

    – Schlitten

    20. Mai 2014 um 14:44 Uhr

  • @ ArtB Oh! Es gibt eine spezielle Informatikbedeutung für transparent! Transparent bedeutet für mich, dass man die Interna sehen kann, zB “die Sicht nicht versperren”, wie der Begriff in jedem Nicht-CS-Kontext verwendet wird.

    – API-Biest

    21. Mai 2014 um 2:28 Uhr

1423750cookie-checkWas bedeutet es, wenn eine Datenstruktur “aufdringlich” ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy