Qual è il punto di classe SplDoublyLinkedList di PHP, e ancora più importante, liste collegate in generale?

StackOverflow https://stackoverflow.com/questions/3963288

Domanda

in una missione per espandere la mia abilità di programmazione, ho approfondito sempre così leggermente nella Il PHP libreria standard . Ciò ha portato alla mia scoperta del href="http://www.php.net/manual/en/class.spldoublylinkedlist.php" rel="noreferrer"> SplDoublyLinkedList classe liste concatenate e noreferrer liste doppiamente concatenate su Wikipedia.

ho capito come funzionano ... ma non posso concepire un motivo per cui ne abbiamo bisogno, o meglio ancora un esempio pratico di SplDoublyLinkedList dal momento che abbiamo indicizzato e array associativi in ??PHP.

Come sono collegate liste normalmente utilizzato in-and-out di PHP?

È stato utile?

Soluzione

Le strutture dati SPL ridurre il consumo di memoria e migliorare le prestazioni. Buone spiegazioni:

  

Strutture dati sono intrinsecamente indipendente dal linguaggio e esistono come un insieme di concetti logici basati in matematica. Questi contenitori utilizzano algoritmi differenti come appropriato per massimizzare l'efficienza.

     

Per esempio, se non hai bisogno delle funzionalità di hash mappa di un array associativo - che è, se non si utilizza la chiave dell'array per uno scopo specifico e solo bisogno di un array enumerato - SplFixedArray (ex SplFastArray , attualmente non documentato) può essere un sostituto adatto. L'unica avvertenza è che la dimensione della matrice è fissa, il che significa che è necessario specificare la dimensione quando si crea un'istanza della classe e un errore si verifica se si tenta di memorizzare più di quel numero di elementi. Questa è la ragione per cui, in media, si comporta meglio di array PHP standard.

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

  

All'interno del codice C che costituisce l'interprete PHP, gli array siano implementati come una struttura di dati chiamato una tabella hash o una mappa di hash. Quando un valore contenuto all'interno di una matrice viene identificato dal suo indice, PHP utilizza una funzione di hashing per convertire tale indice in un hash univoco che rappresenta la posizione del valore corrispondente all'interno della matrice.

     

Questa mappa attuazione hash consente matrici per memorizzare un numero arbitrario di elementi e di fornire l'accesso a tutti gli elementi contemporaneamente utilizzando i tasti numerici o stringa. Gli array sono estremamente veloce per le capacità che forniscono e che sono un eccellente struttura di dati di uso generale.

     

In informatica, una lista è definita come un insieme ordinato di valori. Una lista concatenata è una struttura dati in cui ogni elemento della lista include un riferimento a uno o entrambi gli elementi su entrambi i lati di esso all'interno della lista. Il termine “lista doppiamente collegata” è usato per riferirsi a quest'ultimo caso. Nel SPL, questo assume la forma del SplDoublyLinkedList classe .... Ha senso uso elenchi quando il numero di elementi da memorizzare non è noto in anticipo e gli elementi devono solo essere utilizzati da posizionamento sequenziale.

http://matthewturland.com / 2010/05/20 / nuovo-SPL-funzioni-in-php-5-3 /

Altri suggerimenti

Secondo Per Wikipedia ,

  

Il vantaggio principale di una lista collegata   su una matrice convenzionale è che il   ordine degli elementi collegati può essere   diverso dall'ordine che i dati   elementi vengono memorizzati nella memoria o sul disco.   Per questo motivo, le liste collegate consentono   inserimento e la rimozione di nodi in qualsiasi   punto nell'elenco, con una costante   numero di operazioni.

     

D'altra parte, le liste collegate da   stessi non consentono l'accesso casuale   ai dati, o qualsiasi forma di efficiente   indicizzazione. Così, molte operazioni di base   - come ottenere l'ultimo nodo di   la lista, o la ricerca di un nodo che   contiene un determinato dato, o localizzazione   il luogo in cui un nuovo nodo dovrebbe essere   inserita - può richiedere la scansione di più   degli elementi della lista.

Quindi, per rispondere alla tua domanda, non ho idea. :)

In primo luogo, SplDoublyLinkedList sono oggetti, come ad esempio

  • che può essere esteso, in modo da poter sostituire i loro metodi (si può ad esempio restituire tutti le stringhe in maiuscolo, ecc)
  • le interfacce che implementano può essere controllato come in myfunc( SplDoublyLinkedList $var ) ...
  • stanno passati come riferimento di default
  • ecc.

In secondo luogo, SplDoublyLinkedList accettare iterazione modalità, in modo da poter eliminare i tuoi oggetti in movimento, e la direzione interruttore, senza riordinare la matrice o complicare il codice:

  

SplDoublyLinkedList :: IT_MODE_LIFO (stile Stack)

     

SplDoublyLinkedList :: IT_MODE_FIFO (stile coda) Il comportamento del   iterator (l'uno o l'altro)

     

SplDoublyLinkedList :: IT_MODE_DELETE (elementi vengono eliminati dalla   iteratore)

     

SplDoublyLinkedList :: IT_MODE_KEEP (elementi sono attraversate da   l'iteratore)

La citazione di cui sopra è da http://simpletechinfo.com/SplDoublyLinkedList che contiene alcuni esempi di codice.

Ci sono altri vantaggi (come foreach non dover fare una copia in memoria di tutti i dati, etc)

Si Ci sono perché molti programmatori comming da altre lingue sono utilizzati per loro dove gli array hanno fissato dimensioni e si deve prendere cura di managment di memoria.
Così per PHP sono solo un altro strumento. Sono implementati perché molti algoritmi e relè modello su liste e quindi non hanno bisogno di essere modificati per php-array.

Come altri hanno già detto, gli elenchi sono un'alternativa alle matrici fissi che sono comuni in altre lingue. Ma un importante aspetto che spesso è trascurato - è possibile inserire o rimuovere un elemento da qualsiasi luogo all'interno di un elenco molto efficiente

.

Perché questo sarebbe importante? Diciamo che si dispone di diversi elementi che si desidera mantenere ordinato in un array, forse in modo non c'è bisogno di ordinare in un secondo momento o semplicemente per ridurre al minimo il tempo di ricerca. In questo caso un elenco può essere uno strumento molto potente. Soprattutto per grandi insiemi di dati.

Probabilmente hai ragione, e semplicemente non è molto utile.

Ci sono molti usi di liste collegate in teoria (in particolare i collegamenti di danza). Ma la maggior parte di loro coinvolge sia la conservazione e la clonazione dei suoi iteratori altrove, l'accesso al contenuto in più di due direzioni, o scissione e fusione delle liste. SplDoublyLinkedList sembrava non avere quelli.

Se non è per algoritmi, un uso è quello di consentire un oggetto per rimuovere il riferimento della stessa in qualche lista in tempo costante, liberando la sua memoria e senza shuffling l'elenco (da hashing o scambio con l'ultimo elemento) dopo l'inserimento o eliminazione. Ma questo richiede la memorizzazione di un iteratore della lista di quegli oggetti.

Senza queste funzionalità, semplicemente si comportano come due deque. Se avete solo bisogno di elementi di accesso utilizzando l'iteratore, sono come due pile. Un modo migliore in singoli casi semplici filettate, non estingue già avvolto in una classe, è solo quello di utilizzare due pile (array forse fissi, o entrambe le estremità della stessa matrice). Pop da una pila e spingerlo ad un altro ogni volta che si desidera che l'iteratore di muoversi, e la parte superiore di una pila è l'elemento corrente. Se hai bisogno anche di accedere alla testa e la coda, è necessario sostituire le pile con i deque.

Ma se si desidera implementare pile o deque stessi senza conoscere la dimensione massima, o anche di destinare i nodi di normali liste collegate (in una lingua senza quelle biblioteche come in PHP), il modo in cui il bene è a catena di alcuni array fisse insieme , utilizzando doppiamente liste collegate, senza quelle caratteristiche. In qualche modo ci si può comunque bisogno.

La documentazione PHP stesso, come il Java uno, suggerisce che si suppone di essere solo un deque sostenere alcune funzioni extra strane, nemmeno due deque (credo). Non usarli se si ha realmente bisogno di liste doppiamente concatenate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top