2010-10-18 9 views
17

Dans une quête pour étendre mes prouesses de programmation, j'ai plongé un peu dans le The Standard PHP Library. Cela a conduit à ma découverte de la classe SplDoublyLinkedList. De là, j'ai lu les descriptions de Linked Lists et Doubly Linked Lists sur Wikipedia.Quel est le point de la classe SplDoublyLinkedList de PHP, et plus important encore, les listes liées en général?

Je comprends comment ils fonctionnent ... Mais je ne peux pas concevoir de raison POURQUOI nous en avons besoin — ou mieux encore un exemple pratique de SplDoublyLinkedList puisque nous avons des tableaux indexés et associatifs en PHP.

Comment les listes liées sont-elles normalement utilisées dans et hors de PHP?

Répondre

6

Les structures de données SPL réduisent la consommation de mémoire et améliorent les performances. Bonnes explications:

Les structures de données sont intrinsèquement indépendantes du langage et existent sous la forme d'un ensemble de concepts logiques basés sur les mathématiques. Ces conteneurs utilisent différents algorithmes pour optimiser l'efficacité. Par exemple, si vous n'avez pas besoin des fonctionnalités de mappage de hachage d'un tableau associatif, c'est-à-dire, si vous n'utilisez pas la clé de tableau dans un but spécifique et avez seulement besoin d'un tableau énuméré: SplFixedArray (anciennement SplFastArray, actuellement non documenté) peut être un remplacement approprié. La seule mise en garde est que la taille du tableau est fixe, ce qui signifie que vous devez spécifier la taille lorsque vous instanciez la classe et qu'une erreur se produira si vous tentez de stocker plus que ce nombre d'éléments. C'est la raison pour laquelle, en moyenne, il fonctionne mieux que les baies PHP standard.

http://web.archive.org/web/20130805120049/http://blueparabola.com/blog/spl-deserves-some-reiteration

Dans le code C qui constitue l'interpréteur PHP, les tableaux sont mis en oeuvre comme une structure de données appelée une table de hachage ou d'une carte de hachage. Lorsqu'une valeur contenue dans un tableau est référencée par son index, PHP utilise une fonction de hachage pour convertir cet index en un hachage unique représentant l'emplacement de la valeur correspondante dans le tableau.

Cette implémentation de mappe de hachage permet aux baies de stocker un nombre arbitraire d'éléments et de fournir l'accès à tous ces éléments simultanément en utilisant des clés numériques ou de type chaîne. Les tableaux sont extrêmement rapides pour les capacités qu'ils fournissent et sont une excellente structure de données à usage général.

En informatique, une liste est définie comme une collection ordonnée de valeurs. Une liste chaînée est une structure de données dans laquelle chaque élément de la liste inclut une référence à l'un ou aux deux éléments de chaque côté de la liste. Le terme "liste doublement liée" est utilisé pour désigner ce dernier cas. Dans le SPL, cela prend la forme de la classe SplDoublyLinkedList .... Il est logique d'utiliser des listes lorsque le nombre d'éléments à stocker n'est pas connu à l'avance et que les éléments ne doivent être accédés que par une position séquentielle.

http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/

+0

Ceci est la meilleure réponse ici, et une bonne pour comprendre le but de ces structures de données. Cependant, les choses ne sont pas aussi simples que cette réponse l'indique. Juste basé sur le concept de ce qu'est une double liste chaînée et ce qu'est une table de hachage (comment les tableaux sont implémentés en PHP), on pourrait s'attendre à ce qu'une double liste chaînée puisse économiser beaucoup de mémoire sur un tableau. Cependant, dans mes tests, je n'ai plus de mémoire à peu près sur place. Ce qui m'amène à croire que les listes doublement chaînées sont implémentées très bêtement en PHP. –

+1

J'ai aussi essayé de créer ma propre classe de liste à lien unique avec un souci de conserver la mémoire. Quelque part, je manque de mémoire à peu près au même endroit que si j'utilisais un tableau PHP normal, ce qui est très bizarre. Cela m'amène à soupçonner que les internes de PHP utilisent des tableaux PHP dans des endroits inattendus. C'est juste une supposition, mais je ne sais pas quoi d'autre à penser. BTW J'utilise PHP 5.3.2, alors j'espère que les nouvelles versions sont mieux à ce sujet, mais je ne sais pas. Le point est, si vous allez utiliser une structure de données autre que le tableau PHP pour des raisons de performances, assurez-vous de mesurer la performance pour vous assurer que cela aide. –

3

Selon Pour Wikipedia,

Le principal avantage d'une liste chaînée sur un tableau classique est que l'ordre des éléments liés peut être différent de l'ordre que les données articles sont stockés dans mémoire ou sur le disque. Pour cette raison, les listes liées permettent l'insertion et la suppression de nœuds à tout point dans la liste, avec un nombre constant d'opérations .

D'autre part, les listes chaînées par eux-mêmes ne permettent pas l'accès aléatoire aux données, ou toute forme d'indexation efficace . Ainsi, de nombreuses opérations de base - telles que l'obtention du dernier nœud de la liste, ou de trouver un noeud qui contient une donnée donnée, ou la localisation le lieu où un nouveau nœud doit être Inséré - peuvent nécessiter la numérisation plus du éléments de liste.

Donc pour répondre à votre question, je n'en ai aucune idée. :)

+0

HAha! Oui, j'ai lu ça aussi. +1 pour "Je n'ai aucune idée." – Stephen

+0

+1: aucune idée n'est une bonne idée – tacone

+1

Ce qu'il dit, c'est que les formes liées ont une insertion et un retrait rapides, alors que dans un tableau conventionnel, les éléments doivent être mélangés autour ou le tableau doit être copié et développé.Cependant, le "tableau" de PHP n'est pas un tableau conventionnel. – mpen

0

Ils sont là parce que beaucoup de programmeurs venant d'autres langues leur sont habitués là où les tableaux ont des tailles fixes et que vous devez prendre soin de la gestion de la mémoire.
Donc, pour PHP, ils sont juste un autre outil. Ils sont implémentés car de nombreux algorithmes de relais de modèle sur les listes et donc ils n'ont pas besoin d'être changés en php-array.

+1

Est-ce basé sur l'hypothèse? Il semble que les structures de données inutiles - qui n'existe que pour apaiser les programmeurs passant d'une autre langue à PHP - seraient implémentées dans le SPL ... – Stephen

+0

Elles sont implémentées dans le SPL car les implémentations PHP personnalisées sont beaucoup moins efficace. La communauté php pourrait vivre sans eux pendant des années. Et les listes sont sûres l'une des structures de données les plus importantes utilisées. Il en va de même pour les cours par exemple - vous n'avez pas besoin d'eux pour écrire des programmes mais ils sont sûrs de vous aider mais ils sont aussi un outil. – Fge

+1

D'accord, je vais mordre. Ils ne sont pas nécessaires (évidemment depuis que je m'entends si longtemps sans eux), mais avez-vous un exemple de comment ils pourraient me rendre la vie plus facile? Vous les avez comparés aux classes. Les cours me rendent la vie environ neuf milliards de fois plus facile. Comment et où une liste chaînée s'intègre-t-elle dans PHP? – Stephen

0

Comme d'autres l'ont mentionné, les listes sont une alternative aux réseaux fixes qui sont communs dans d'autres langues. Mais un aspect important qui est souvent négligé - vous pouvez insérer ou supprimer un élément de n'importe quel endroit dans une liste très efficacement.

Pourquoi cela serait-il important? Supposons que vous ayez plusieurs éléments à conserver triés dans un tableau, peut-être pour ne pas devoir les trier plus tard ou simplement pour réduire le temps de recherche. Dans ce cas, une liste peut être un outil très puissant. Surtout pour les très grands ensembles de données.

3

D'abord et avant tout, SplDoublyLinkedList sont des objets, en tant que tels

  • ils peuvent être étendus, de sorte que vous pouvez remplacer leurs méthodes (vous pouvez par exemple Renvoyez toutes les chaînes en majuscule, etc.)
  • les interfaces ils implémentent peuvent être vérifiés comme dans myfunc(SplDoublyLinkedList $var) ...
  • ils sont passés en référence par défaut
  • etc.

En second lieu, SplDoublyLinkedList accepte les modes d'itération, de sorte que vous pouvez supprimer vos articles sur la route, et la direction du commutateur sans réorganisant le tableau ou de compliquer votre code:

SplDoublyLinkedList :: IT_MODE_LIFO (style Stack)

SplDoublyLinkedList :: IT_MODE_FIFO (style de file d'attente) le comportement du iterator (un ou l'autre)

SplDoublyLinkedList :: IT_MODE_DELETE (Les éléments sont supprimés par le itérateur)

SplDoublyLinkedList :: IT_MODE_KEEP (éléments sont traversés par l'itérateur)

La citation ci-dessus provient de http://simpletechinfo.com/SplDoublyLinkedList qui contient des exemples de code.

Il y a d'autres avantages (comme foreach ne pas avoir à faire une copie en mémoire de toutes les données, etc.)

0

Vous avez probablement raison, et il est tout simplement pas très utile.

Il y a plusieurs utilisations des listes chaînées en théorie (notamment les liens dansants). Mais la plupart d'entre elles implique soit le stockage et le clonage de ses itérateurs ailleurs, l'accès au contenu dans plus de deux directions, soit la division et la fusion des listes. SplDoublyLinkedList semblait ne pas avoir ceux-ci. Si ce n'est pas pour des algorithmes, une utilisation est de permettre à un objet de supprimer la référence de lui-même dans une liste à temps constant, libérant sa mémoire et sans mélanger la liste (en hachant ou en échangeant avec le dernier élément) après l'insertion ou suppression. Mais cela nécessite de stocker un itérateur de la liste dans ces objets.

Sans ces fonctionnalités, ils se comportent comme deux deques. Si vous avez seulement besoin d'accéder à des éléments en utilisant l'itérateur, ils sont comme deux piles. Un meilleur moyen dans les cas simples simples, à moins d'être déjà enveloppés dans une classe, consiste simplement à utiliser deux piles (peut-être des tableaux fixes, ou les deux extrémités du même tableau). Passez d'une pile à une autre et poussez-la sur une autre à chaque fois que vous voulez que l'itérateur bouge, et le haut d'une pile est l'élément courant. Si vous devez également accéder à la tête et à la queue, vous devrez remplacer les piles par des deques. Mais si vous voulez implémenter des piles ou les déduire sans connaître la taille maximum, ou même allouer des nœuds de listes chaînées normales (dans une langue sans ces bibliothèques comme en PHP), le bon moyen est de chaîner des tableaux fixes ensemble, en utilisant des listes doublement chaînées sans ces fonctionnalités. D'une certaine manière, vous en aurez toujours besoin. La documentation PHP elle-même, comme celle de Java, suggère qu'ils sont supposés être juste une deque supportant des fonctionnalités bizarres, pas même deux deques (je pense). Ne les utilisez pas si vous avez vraiment besoin de listes doublement chaînées.

Questions connexes