Comment fonctionne exactement un XOR liste Liée de travail?
Suivantes lien l'explique.
La mise en œuvre est dit de travailler en stockant le XOR de la précédente et de la suivante adresse(dire nxp), au lieu de les stocker à la fois(précédent et suivant adresse) séparément.Cependant, plus loin le long de la mise en œuvre est dit de travailler par xor-ing de l'adresse précédente et nxp, afin d'obtenir le adresse suivante.
Mais ce n'est pas pratiquement à l'aide de la même espace comme ayant précédent et suivant des pointeurs?
- Comparer l'exécution normale de 2 pointeurs par nœud et 1 pointeur par nœud pour XOR liste, et vous verrez la différence. (Notez que cette liste doublement chaînée)
Vous devez vous connecter pour publier un commentaire.
Dans une liste doublement chaînée, de stocker les deux pointeurs par nœud: prev et next. Dans un XOR liste liée, vous stockez un 'pointeur' par nœud, ce qui est le XOR de prev et next (ou si l'un d'eux est absent, juste de l'autre (le même que XORing 0)). La raison pour laquelle vous pouvez encore parcourir un XOR liste liée dans les deux directions s'appuie sur les propriétés de XOR et la redondance de l'information inhérente à une double liste chaînée.
Imaginez que vous avez trois nœuds dans votre XOR liste liée.
Un est le chef, et a un unobfuscated pointeur vers B (B XOR 0, après seulement)
B est le milieu de l'élément, et a le XOR de pointeurs A et C.
C est la queue, et une unobfuscated pointeur vers B (0 XOR B, prev seulement)
Quand je suis à parcourir cette liste, je commence à A. je note Une position en mémoire, car je voyage à B. Quand je veux voyager à C, je XOR B le pointeur de la avec Un, m'accordant le pointeur de la C. ensuite, je note B de la position dans la mémoire et les voyages de C.
Cela fonctionne parce que le XOR est la propriété de la réparation elle-même si elle est appliquée deux fois: C UN XOR XOR A == C. une Autre façon de le penser il est, la liste doublement liée stocke aucune information supplémentaire une seule liste liée n'est pas (puisqu'il s'agit seulement de stocker toutes les pointeurs que des copies de pointeurs suivants ailleurs en mémoire), par l'exploitation de cette redondance, nous pouvons disposer de liste doublement chaînée propriétés avec seulement que de nombreux liens sont nécessaires pour. Cependant, Cela ne fonctionne que si nous commençons notre XOR liste liée de la traversée à partir du début ou de la fin — comme si nous n'sauter dans un nœud aléatoire dans le milieu, nous n'avons pas les informations nécessaires pour commencer la traversée.
Tout un XOR liste liée a l'avantage de réduire l'utilisation de la mémoire, il a aussi des inconvénients — il confondre le compilateur, le débogage et les outils d'analyse statique comme votre XOR de deux pointeurs ne sera pas correctement reconnu par un pointeur par rien, sauf votre code. Il ralentit aussi le pointeur de l'accès à l'devez faire l'opération XOR pour récupérer le vrai pointeur de la première. Il a également ne peut pas être utilisé dans du code managé — XOR obscurci les pointeurs ne sont pas reconnus par le garbage collector.
an XOR linked list fits both previous and next pointers in the same space in memory.
dans votre réponse. Actuellement, je ne peux pas voir le rapport entre votre réponse et la question.Non - ce utilise environ la moitié de l'espace, comme la taille du résultat du XOR-ment le "prev" et "next" est égale à la taille de la plus grande des deux.
XOR a un très spécial de la propriété à ce sujet, à savoir, compte tenu de
a XOR b = c
, seulement deux (deux) de la variable sont tenus de calculer le troisième, avec certaines restrictions. Voir la XOR algorithme de swap pour expliquer pourquoi cela fonctionne.Dans ce cas, le précédent (ou suivant) pointeur doit toujours être porté, mais seulement par le biais de la traversée de calculs et non pas comme un autre membre.
Double liste chaînée besoin de 2*N pointeurs stockés pour N nœuds, plus au moins un pointeur supplémentaires(tête, ou peut-être la tête et la queue).
XOR liste liée besoin de N pointeurs stockés pour N nœuds, et au moins deux des pointeurs supplémentaires (tête et visite d'un nœud, ou peut-être la tête, la queue et la dernière visite du nœud). En parcourant, vous stockez un nœud (la dernière visite du nœud), mais quand vous allez vers le nœud suivant, vous réécrivez que le nœud précédent adresse de l'.
2*N
vsN
.Considérons la suite XOR liste
A->B->C->D
supposons que vous nœuds créés dans ce format ci-dessous
Clé|Lien|
CAS n ° 1:[Avant la Traversée] Maintenant, Supposons que vous êtes dans B (current_node=>B) voulez visiter C , si vous avez besoin de l'Adresse de C . La façon dont vous obtenez ?
CAS n ° 2: [en Arrière de la traversée] Maintenant, Supposons que vous êtes dans C (current_node=> C) veulent visiter, B , de sorte que vous besoin de l'Adresse de B . La façon dont vous obtenez ?
Déplacement:
De parcourir toute la liste ,Vous aurez besoin de 3 pointeurs prevPtr , currPtr , nextPtr pour stocker actuelle relative, précédent et suivant du nœud de l'adresse de départ de la tête.
Puis, à chaque itération ces pointeurs besoin de se déplacer vers une position de l'avant.