2010-10-18 15 views
17

En una búsqueda para expandir mi destreza en la programación, he profundizado ligeramente en The Standard PHP Library. Esto me llevó a descubrir la clase SplDoublyLinkedList. Desde allí, leí las descripciones de Linked Lists y Doubly Linked Lists en Wikipedia.¿Cuál es el objetivo de la clase SplDoublyLinkedList de PHP y, más importante aún, de las listas vinculadas en general?

Entiendo cómo funcionan ... Pero no puedo concebir una razón POR QUÉ lo necesitamos — o mejor aún un ejemplo práctico de SplDoublyLinkedList ya que tenemos matrices indexadas y asociativas en PHP.

¿Cómo se usan normalmente las listas vinculadas dentro y fuera de PHP?

Respuesta

6

Las estructuras de datos SPL reducen el consumo de memoria y mejoran el rendimiento. Buenas explicaciones:

Las estructuras de datos son inherentemente independientes del lenguaje y existen como un conjunto de conceptos lógicos basados ​​en las matemáticas. Estos contenedores utilizan diferentes algoritmos según corresponda para maximizar la eficiencia.

Por ejemplo, si usted no necesita las capacidades mapa hash de una matriz asociativa - es decir, si usted no está utilizando la clave de la matriz para un propósito específico y sólo necesitamos una matriz enumerada - SplFixedArray (anteriormente SplFastArray, actualmente no documentado) puede ser un reemplazo adecuado. La única advertencia es que el tamaño de la matriz es fijo, lo que significa que debe especificar el tamaño al instanciar la clase y se producirá un error si intenta almacenar más elementos que esa cantidad. Esta es la razón por la que, en promedio, funciona mejor que las matrices PHP estándar.

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

Dentro del código C que conforma el intérprete de PHP, las matrices se implementan como una estructura de datos llamada una tabla hash o mapa hash. Cuando un valor de contenido dentro de una matriz se hace referencia por su índice, PHP utiliza una función hashing para convertir dicho índice en un hash único que representa la ubicación del valor correspondiente dentro de la matriz.

Este hash aplicación mapa permite matrices para almacenar un número arbitrario de elementos y proporcionar acceso a todos esos elementos de manera simultánea utilizando cualquiera de las teclas numéricas o de cadena. Las matrices son extremadamente rápidas para las capacidades que proporcionan y son una excelente estructura de datos de propósito general.

En informática, una lista se define como una colección ordenada de valores. Una lista vinculada es una estructura de datos en la que cada elemento de la lista incluye una referencia a uno o ambos elementos a cada lado de la lista. El término "lista doblemente enlazada" se usa para referirse al último caso. En el SPL, esto toma la forma de la SplDoublyLinkedList clase .... Tiene sentido utilizar listas cuando el número de elementos que se almacena no se conoce de antemano y sólo necesita ser visitada por la posición secuencial de los elementos.

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

+0

Esta es la mejor respuesta aquí, y una buena para entender el propósito de estas estructuras de datos. Sin embargo, las cosas no son tan simples como implica esta respuesta. Basándose en el concepto de qué es una lista de doble enlace y qué es una tabla de hash (cómo se implementan las matrices en PHP), uno esperaría que una lista de doble enlace pudiera ahorrar MUCHA memoria en una matriz. Sin embargo, en mis pruebas, me quedé sin memoria en el lugar con cualquiera de los dos. Lo que me lleva a creer que las listas doblemente vinculadas se implementan muy estúpidamente en PHP. –

+1

También intenté hacer mi propia clase de lista enlazada con un buen ojo para conservar la memoria. De alguna manera me estoy quedando sin memoria en el mismo lugar que si utilizo una matriz PHP normal, lo cual es muy extraño. Esto me lleva a sospechar que las partes internas de PHP usan matrices PHP en lugares inesperados. Es solo una suposición, pero no estoy seguro de qué más pensar. Por cierto, estoy usando PHP 5.3.2, así que espero que las versiones más nuevas sean mejores sobre esto, pero no sé. El punto es que si va a utilizar una estructura de datos distinta de la matriz PHP por motivos de rendimiento, asegúrese de medir el rendimiento para asegurarse de que sea útil. –

3

Según Para Wikipedia,

El principal beneficio de una lista enlazada sobre una matriz convencional es que el orden de los elementos vinculados puede ser diferente del orden que los datos artículos se almacenan en memoria o en el disco. Por esa razón, las listas vinculadas permiten la inserción y la eliminación de nodos en cualquier punto de la lista, con un número constante de operaciones .

Por otro lado, las listas enlazadas por mismos no permiten el acceso aleatorio a los datos , o cualquier forma de indexación eficiente . Por lo tanto, muchas de las operaciones básicas - tales como obtener el último nodo de la lista, o la búsqueda de un nodo que contiene un dato determinado, o localizar el lugar donde un nodo nuevo debe ser insertados - puede requerir de escaneo más de la elementos de lista.

Para responder a su pregunta, no tengo ni idea. :)

+0

¡Jaja! Sí, también leo eso. +1 para "No tengo idea. :)" – Stephen

+0

+1: ninguna idea es una buena idea – tacone

+1

Lo que está diciendo es que las últimas vinculadas tienen una inserción y eliminación rápida, mientras que en una matriz convencional, los elementos tienen que barajarse o array tiene que ser copiado y expandido.Sin embargo, la "matriz" de PHP es * no * una matriz convencional. – mpen

0

Están ahí porque muchos programadores que provienen de otros idiomas están acostumbrados a ellos, donde las matrices tienen tamaños fijos y usted tiene que encargarse de la administración de la memoria.
Así que para PHP son solo otra herramienta. Se implementan porque muchos algoritmos & retransmiten patrones en las listas y, por lo tanto, no es necesario cambiarlos a php-arrays.

+1

¿Esto se basa en una suposición? Parece exagerado que una estructura de datos innecesaria, una que solo exista para apaciguar a los programadores que realizan la transición a PHP desde otro idioma, se implementaría en el SPL ... – Stephen

+0

Están implementados en el SPL ya que las implementaciones personalizadas de php-write son mucho menos eficiente. La comunidad php podría vivir sin ellos durante años. Y las listas son seguras de que es una de las estructuras de datos más importantes que se utilizan. Lo mismo se aplica a las clases, por ejemplo: no es necesario que escriban programas, pero sí ayudan, pero también son una herramienta. – Fge

+1

Bien, morderé. No son necesarios (obviamente ya que llevo tanto tiempo sin ellos), pero ¿tienen un ejemplo de cómo podrían hacerme la vida más fácil? Los has comparado con clases. Las clases hacen que mi vida sea aproximadamente nueve mil millones de veces más fácil. ¿Cómo y dónde encaja una lista enlazada en PHP? – Stephen

0

Como otros han mencionado, las listas son una alternativa a las matrices fijas que son comunes en otros idiomas. Pero hay un aspecto importante que a menudo se pasa por alto: puede insertar o eliminar un elemento de cualquier lugar dentro de una lista de manera muy eficiente.

¿Por qué esto es importante? Supongamos que tiene varios elementos que desea mantener ordenados en una matriz, tal vez para que no tenga que ordenarlos más tarde o simplemente para minimizar el tiempo de búsqueda. En este caso, una lista puede ser una herramienta muy poderosa. Especialmente para conjuntos de datos muy grandes.

3

En primer lugar, SplDoublyLinkedList son objetos, como tal

  • que pueden extenderse, por lo que puede invalidar sus métodos (es posible que, por ejemplo, devolver todas las cadenas uppercased, etc)
  • las interfaces implementan se pueden verificar como en myfunc(SplDoublyLinkedList $var) ...
  • se pasan como referencia por defecto
  • etc.

En segundo lugar, SplDoublyLinkedList aceptar modos de iteración, por lo que puede borrar sus artículos en el camino, y la dirección del interruptor sin reordenar la matriz o complicar su código:

SplDoublyLinkedList :: IT_MODE_LIFO (estilo de pila)

SplDoublyLinkedList :: IT_MODE_FIFO (estilo de cola) el comportamiento de la iterador (ya sea uno o la otra)

SplDoublyLinkedList :: IT_MODE_DELETE (elementos se eliminan por el iterador)

SplDoublyLinkedList :: IT_MODE_KEEP (Elementos son atravesadas por el iterador)

La cita anterior es de http://simpletechinfo.com/SplDoublyLinkedList que contiene algunas muestras de código.

Hay otros beneficios (como foreach no tener que hacer una copia en la memoria de todos los datos, etc)

0

Probablemente tienes razón, y eso no es muy útil.

Hay muchos usos de listas enlazadas en teoría (especialmente los enlaces de baile). Pero la mayoría de ellos implica almacenar y clonar sus iteradores en otro lugar, acceder al contenido en más de dos direcciones o dividir y fusionar las listas. SplDoublyLinkedList parecía no tenerlos.

Si no es por algoritmos, un uso es permitir que un objeto elimine la referencia de sí mismo en una lista en tiempo constante, liberando su memoria y sin mezclar la lista (mediante hashing o intercambio con el último elemento) después de la inserción o eliminación Pero esto requiere almacenar un iterador de la lista en esos objetos.

Sin esas funcionalidades, simplemente se comportan como dos deques. Si solo necesita acceder a elementos utilizando el iterador, son como dos pilas. Una mejor manera en casos simples de un solo hilo, salvo que ya no esté incluido en una clase, es solo usar dos pilas (arreglos fijos, o ambos extremos del mismo conjunto). Haga estallar desde una pila y empújela a otra cuando quiera que se mueva el iterador, y la parte superior de una pila es el elemento actual. Si también necesita acceder a la cabeza y la cola, deberá reemplazar las pilas con deques.

Pero si quiere implementar stacks o deques sin saber el tamaño máximo, o incluso asignar nodos de listas enlazadas normales (en un lenguaje sin esas bibliotecas como PHP), la buena manera es encadenar algunas matrices fijas juntos, usando listas doblemente enlazadas sin esas características. De alguna manera, todavía lo necesitarás.

La documentación de PHP en sí, al igual que la de Java, sugiere que se supone que son simplemente un deque que admite algunas características extra extrañas, ni siquiera dos deques (creo). No los use si realmente necesita listas doblemente vinculadas.

Cuestiones relacionadas