Je sais que c'est ma deuxième réponse, mais je pense que l'explication que j'ai à fournir ici peut-être mieux, que la dernière réponse. Mais notez que, même que la réponse est correcte.
Un Efficace de la Mémoire Liée Liste est plus souvent appelé un XOR Liste Liée , comme cela est totalement dépendant de la XOR Porte Logique et de ses propriétés.
Est-ce différent d'une Liste Doublement chaînée?
Oui, il est. Il est en train de faire presque le même travail qu'une Liste Doublement chaînée, mais c'est différent.
Une Liste à double liaison est de stocker des deux pointeurs qui pointent à l'autre et le nœud précédent. En gros, si vous voulez revenir en arrière, vous allez à l'adresse pointée par l' back
pointeur. Si vous voulez aller de l'avant, vous allez à l'adresse pointée par l' next
pointeur. C'est comme:
Un Efficace de la Mémoire Liée Liste, ou à savoir le XOR Liste chaînée est de n'avoir qu'un seul pointeur au lieu de deux. Il stocke l'adresse précédente (addr (prev)) XOR (^) à l'adresse suivante (addr (suivant)). Lorsque vous souhaitez déplacer vers le nœud suivant, vous faire certains calculs, et de trouver l'adresse du nœud suivant. C'est la même chose pour aller au nœud précédent.C'est comme:
Comment ça fonctionne?
Le XOR Liste Liée, comme vous pouvez le faire à partir de son nom, est très dépendante de la porte logique XOR (^) et de ses propriétés.
Ses propriétés sont:
|-------------|------------|------------|
| Name | Formula | Result |
|-------------|------------|------------|
| Commutative | A ^ B | B ^ A |
|-------------|------------|------------|
| Associative | A ^ (B ^ C)| (A ^ B) ^ C|
|-------------|------------|------------|
| None (1) | A ^ 0 | A |
|-------------|------------|------------|
| None (2) | A ^ A | 0 |
|-------------|------------|------------|
| None (3) | (A ^ B) ^ A| B |
|-------------|------------|------------|
Maintenant, nous allons laisser cela de côté, et de voir ce que chaque nœud stocke:
Le premier nœud, ou de la tête, de magasins, 0 ^ addr (next)
comme il n'y a pas de nœud précédent ou de l'adresse. Il ressemble:
Ensuite, le deuxième nœud stocke addr (prev) ^ addr (next)
. Il ressemble:
L'image ci-dessus montre le nœud B, ou le second nœud. A et C sont de l'adresse de la troisième et le premier nœud. Tous le nœud, à l'exception de la tête et de la queue, sont comme ci-dessus, on.
La queue de la liste, n'a pas de nœud suivant, de sorte qu'il stocke addr (prev) ^ 0
. Il ressemble:
Avant de voir comment nous nous déplaçons, nous allons voir la représentation d'un XOR Liste Liée de nouveau:
Quand vous voyez
il signifie clairement il y a un lien de terrain, à l'aide duquel vous déplacer vers l'arrière et l'avant.
Aussi, à noter que lors de l'utilisation d'un XOR Liste Liée, vous devez avoir une variable temporaire (pas dans le nœud), qui stocke l'adresse du noeud qui vous étiez avant. Lorsque vous vous déplacez vers le nœud suivant, vous jetez l'ancienne valeur, et de stocker l'adresse du nœud étaient dans les premiers.
Le déplacement de la Tête vers le nœud suivant
Disons que vous êtes maintenant sur le premier nœud, ou au niveau du nœud A. Maintenant, vous avez envie d'aller au nœud B. C'est la formule pour le faire:
Address of Next Node = Address of Previous Node ^ pointer in the current Node
Donc, ce serait:
addr (next) = addr (prev) ^ (0 ^ addr (next))
Comme c'est la tête, l'adresse précédente, serait tout simplement 0, donc:
addr (next) = 0 ^ (0 ^ addr (next))
On peut supprimer les parenthèses:
addr (next) = 0 ^ 0 addr (next)
À l'aide de l' none (2)
de la propriété, nous pouvons dire qu' 0 ^ 0
sera toujours 0:
addr (next) = 0 ^ addr (next)
À l'aide de l' none (1)
de la propriété, nous pouvons simplifier ainsi:
addr (next) = addr (next)
Vous avez obtenu l'adresse de la prochaine noeud!
Le déplacement d'un nœud au nœud suivant
Maintenant, nous allons dire que nous sommes dans un milieu nœud, ce qui a un précédent et suivant nœud.
Nous allons appliquer la formule:
Address of Next Node = Address of Previous Node ^ pointer in the current Node
Maintenant, remplacez les valeurs:
addr (next) = addr (prev) ^ (addr (prev) ^ addr (next))
Supprimer Les Parenthèses:
addr (next) = addr (prev) ^ addr (prev) ^ addr (next)
À l'aide de l' none (2)
de la propriété, nous pouvons simplifier:
addr (next) = 0 ^ addr (next)
À l'aide de l' none (1)
de la propriété, nous pouvons simplifier:
addr (next) = addr (next)
Et vous l'obtenez!
Le déplacement d'un nœud du nœud que vous étaient dans les premiers
Si vous n'êtes pas à comprendre le titre, il signifie que si vous étiez au nœud X, et ont maintenant déplacé vers le nœud Y, vous voulez aller vers le nœud visité plus tôt, ou fondamentalement nœud X.
Ce n'est pas une tâche fastidieuse. Rappelez-vous que j'ai mentionné ci-dessus, que vous stockez l'adresse que vous avez été dans une variable temporaire. Donc l'adresse du noeud que vous voulez visiter, est couché dans une variable:
addr (prev) = temp_addr
Le déplacement d'un nœud au nœud précédent
Ce n'est pas le même que celui mentionné ci-dessus. Je veux dire que, vous avez au nœud Z, vous êtes maintenant au niveau du nœud Y, et que vous voulez aller vers le nœud X.
C'est presque la même que le déplacement d'un nœud au nœud suivant. Juste que c'est c'est vice-versa. Lorsque vous écrivez un programme, vous utilisez les mêmes étapes que je l'avais mentionné dans le déplacement d'un nœud au nœud suivant, c'est juste que vous êtes de trouver le plus tôt élément dans la liste que de trouver l'élément suivant.
Je ne pense pas que j'ai besoin de l'expliquer.
Avantages de la XOR Liste Liée
Il utilise moins de mémoire que d'une Liste Doublement chaînée. Environ 33% de moins.
Il utilise un seul pointeur. Cela simplifie la structure du nœud.
Comme doynax dit, une sous-section d'un XOR peut être inversé en temps constant.
Les inconvénients de XOR Liste Liée
C'est un peu délicat à mettre en œuvre. Il a plus de chances d'échec et de débogage, il est assez difficile.
Toutes les conversions (dans le cas d'un int) ont lieu à / à partir de uintptr_t
Vous ne pouvez pas simplement acquérir l'adresse d'un nœud, et le début de la traversée (ou autre) à partir de là. Vous devez toujours commencer par la tête ou la queue.
Vous ne pouvez pas aller sauter, sauter ou d'autres nœuds. Vous devez aller un par un.
Le déplacement nécessite plusieurs opérations.
Il est difficile de déboguer un programme qui est à l'aide d'un XOR Liste Liée. Il est beaucoup plus facile à déboguer une Liste Doublement chaînée.
Références