XOR hat Liste verbunden

Ein XOR verbundene Liste ist eine in der Computerprogrammierung verwendete Datenstruktur. Es nutzt die bitwise exklusive Trennung (XOR) Operation aus, die hier durch  angezeigt ist, um Lagerungsvoraussetzungen für doppelt verbundene Listen zu vermindern. Eine gewöhnliche doppelt verbundene Liste versorgt Adressen der vorherigen und folgenden Rasterpunkte in jedem Listenknoten, zwei Adressfelder verlangend:

... EIN B C D E...

-> als nächstes-> als nächstes-> als nächstes->

Ein XOR verbundene Liste presst dieselbe Information in ein Adressfeld durch die Speicherung des bitwise XOR von der Adresse für den vorherigen und der Adresse für als nächstes in einem Feld zusammen:

... EIN B C D E...

</Code>

Wenn Sie die Liste vom linken bis Recht überqueren: Das Annehmen von Ihnen ist an C, Sie können die Adresse des vorherigen Artikels, B, und XOR es mit dem Wert im Verbindungsfeld (BD) nehmen. Sie werden dann die Adresse für D haben, und Sie können fortsetzen, die Liste zu überqueren. Dasselbe Muster gilt in der anderen Richtung.

Um anzufangen, die Liste in jeder Richtung von einem Punkt zu überqueren, brauchen Sie die Adresse von zwei Konsekutivsachen, nicht nur ein. Wenn die Adressen der zwei Konsekutivsachen umgekehrt werden, werden Sie damit enden, die Liste in der entgegengesetzten Richtung zu überqueren.

Diese Form der verbundenen Liste kann nicht ratsam sein:

  • Mehrzweckbeseitigen-Werkzeuge können der XOR Kette nicht folgen, das schwierigere Beseitigen machend;
  • Der Preis für die Abnahme im Speichergebrauch ist eine Zunahme in der Codekompliziertheit, Wartung teurer machend;
  • Die meisten Müll-Sammlungsschemas arbeiten mit Datenstrukturen nicht, die wörtliche Zeigestöcke nicht enthalten;
  • XOR von Zeigestöcken wird in einigen Zusammenhängen nicht definiert (z.B, die c Sprache), obwohl viele Sprachen eine Art Typ-Konvertierung zwischen Zeigestöcken und ganzen Zahlen zur Verfügung stellen;
  • Die Zeigestöcke werden unlesbar sein, wenn man die Liste - zum Beispiel nicht überquert, wenn der Zeigestock zu einem Rasterpunkt in einer anderen Datenstruktur enthalten wurde;
Während
  • Sie die Liste überqueren, müssen Sie sich an die Adresse des vorher zugegriffenen Knotens erinnern, um die Adresse des folgenden Knotens zu berechnen.

Computersysteme haben immer preiswerteres und reichliches Gedächtnis, und Lagerung oben ist nicht allgemein ein überwiegendes Problem außerhalb eingebetteter Spezialsysteme. Wo es noch wünschenswert ist, die Gemeinkosten einer verbundenen Liste zu reduzieren, stellt das Entfalten eine praktischere Annäherung (sowie andere Vorteile, wie zunehmende Leistung des geheimen Lagers und Geschwindigkeitsübertretung zufälligen Zugangs) zur Verfügung.

Eigenschaften

  • In Anbetracht nur eines Rasterpunktes kann man nicht die Adressen der anderen Elemente der Liste sofort erhalten.
  • Zwei XOR Operationen genügen, um das Traversal von einem Artikel bis das folgende, dieselben Instruktionen zu tun, die in beiden Fällen genügen. Denken Sie eine Liste mit Sachen und mit R1 und R2, der Register ist, die beziehungsweise enthalten, die Adresse des Stroms (sagen Sie, dass C) Rasterpunkt und ein Arbeitsregister, das den XOR der aktuellen Adresse mit der vorherigen Adresse enthält (CD sagen). Wurf als Instruktionen des Systems/360:

X R2, Verbindung R2

  • Das Ende der Liste wird durch das Vorstellen eines Rasterpunktes an der Adressnull bedeutet, die neben einem Endpunkt, als darin gelegt ist. Das Verbindungsfeld an A würde 0B sein. Eine zusätzliche Instruktion ist in der obengenannten Folge erforderlich, nachdem die zwei XOR Operationen, um eine Null zu entdecken, auf das Entwickeln der Adresse des aktuellen Artikels, hinauslaufen
  • Ein Listenendargument kann reflektierend angebracht werden, indem es den Verbindungszeigestock Null sein lässt. Ein Nullzeigestock ist ein Spiegel. (Der XOR des verlassenen und der richtigen Nachbaradressen, dasselbe seiend, ist Null.)

Warum arbeitet es?

Der Schlüssel ist die erste Operation und die Eigenschaften von XOR:

  • XX=0
  • X0=X
  • XY=YX
  • (XY) Z=X  (YZ)

Das R2-Register enthält immer den XOR der Adresse des aktuellen Artikels C mit der Adresse des Vorgänger-Artikels P: CP. Die Verbindungsfelder in den Aufzeichnungen enthalten den XOR des verlassenen und der richtigen Nachfolger-Adressen, sagen LR. XOR von R2 (CP) mit dem aktuellen Verbindungsfeld (LR) gibt CPLR nach.

  • Wenn der Vorgänger L war, annullieren die P (=L) und L das Verlassen CR.
  • Wenn der Vorgänger R gewesen war, heben sich die P (=R) und R auf, CL verlassend.

In jedem Fall ist das Ergebnis der XOR der aktuellen Adresse mit der folgenden Adresse. XOR davon mit der aktuellen Adresse in R1 verlässt die folgende Adresse. R2 wird mit dem XOR notwendigen Paar der (jetzt) aktuellen Adresse und dem Vorgänger verlassen.

Schwankungen

Der zu Grunde liegende Grundsatz des XOR verbundene Liste kann auf jede umkehrbare binäre Operation angewandt werden. Das Ersetzen von XOR durch die Hinzufügung oder Subtraktion gibt ein bisschen verschiedene aber größtenteils gleichwertige, Formulierungen:

Hinzufügung hat Liste verbunden

... EIN B C D E...</Code>

Diese Art der Liste hat genau dieselben Eigenschaften wie der XOR verbundene Liste, außer dass ein Nullverbindungsfeld nicht ein "Spiegel" ist. Die Adresse des folgenden Knotens in der Liste wird durch das Abziehen der Adresse des vorherigen Knotens vom Verbindungsfeld des aktuellen Knotens gegeben.

Subtraktion hat Liste verbunden

... EIN B C D E...</Code>

Diese Art der Liste unterscheidet sich vom "traditionellen" XOR verbundene Liste, in der die Befehlsfolgen die Liste überqueren mussten, vorwärts ist von der Folge verschieden musste die Liste rückwärts überqueren. Die Adresse des folgenden Knotens, Vorankommens, wird durch das Hinzufügen des Verbindungsfeldes zur Adresse des vorherigen Knotens gegeben; die Adresse des vorhergehenden Knotens wird durch das Abziehen des Verbindungsfeldes von der Adresse des folgenden Knotens gegeben.

Die Subtraktion hat sich verbunden Liste ist auch darin speziell die komplette Liste kann im Gedächtnis umgesiedelt werden, ohne jedes Flicken von Zeigestock-Werten seit dem Hinzufügen zu brauchen, dass ein unveränderlicher Ausgleich zu jeder Adresse in der Liste keine Änderungen zu den in den Verbindungsfeldern versorgten Werten verlangen wird. (Siehe auch Anordnung.) Das ist ein Vorteil sowohl gegenüber verbundenen Listen von XOR als auch gegenüber traditionellen verbundenen Listen.

Bemerken Sie über Durchführungen in C:

Die Subtraktion hat sich verbunden Liste verlangt auch Gussteil C Zeigestöcke zu ganzen Zahlen nicht, vorausgesetzt dass die ganze Listenstruktur innerhalb eines einzelnen aneinander grenzenden Blocks des Gedächtnisses ist. In diesem Fall gibt die Subtraktion von zwei C Zeigestöcken eine ganze Zahl nach. Bemerken Sie, dass auf den meisten Plattformen die maximale Größe eines aneinander grenzenden Blocks des Gedächtnisses beträchtlich kleiner sein wird als das verfügbare Gesamtgedächtnis, so werden große Listen normalerweise einen einzelnen aneinander grenzenden Block des Gedächtnisses nicht einbauen. Das ist nicht ein Problem, so lange die Plattform den Typ C99 uintptr_t zur Verfügung stellt, weil dann Zeigestöcke zu uintptr_t und zurück wieder tragbar geworfen werden können.

Siehe auch

Links


Tourcoing / Die südlichen Niederlande
Impressum & Datenschutz