Gli alberi AVL e rosso nero sono entrambi autobilanciati tranne il colore rosso e nero nei nodi. Qual è il motivo principale per scegliere alberi neri rossi invece di alberi AVL? Quali sono le applicazioni degli alberi neri rossi?
Gli alberi AVL e rosso nero sono entrambi autobilanciati tranne il colore rosso e nero nei nodi. Qual è il motivo principale per scegliere alberi neri rossi invece di alberi AVL? Quali sono le applicazioni degli alberi neri rossi?
Risposte:
Qual è il motivo principale per scegliere alberi neri rossi invece di alberi AVL?
Entrambi gli alberi rosso-neri e alberi AVL sono i più comunemente utilizzati bilanciati alberi binari di ricerca e supportano l'inserimento, la cancellazione e look-up in garanzia O(logN) time
. Tuttavia, ci sono i seguenti punti di confronto tra i due:
O(N)
spazio extra. Tuttavia, se sappiamo che le chiavi che verranno inserite nell'albero saranno sempre maggiori di zero, possiamo utilizzare il bit di segno delle chiavi per memorizzare le informazioni sul colore di un albero rosso-nero. Pertanto, in questi casi l'albero rosso-nero non occupa spazio aggiuntivo.Quali sono le applicazioni dell'albero rosso nero?
Gli alberi rosso-neri hanno uno scopo più generale. Funzionano relativamente bene con l'aggiunta, la rimozione e la ricerca, ma gli alberi AVL hanno ricerche più veloci al costo di una più lenta aggiunta / rimozione. L'albero rosso-nero viene utilizzato nel seguente:
java.util.TreeMap
,java.util.TreeSet
In general, the rotations for an AVL tree are harder to implement and debug than that for a Red-Black tree.
non è vero.
std:: map
e gli amici usano una struttura particolare. Questo è lasciato all'implementazione, sebbene libstdc ++ e Dinkumware utilizzino almeno alberi rosso-neri, e sembra che tu abbia ragione in pratica.
Prova a leggere questo articolo
Offre alcune buone informazioni su differenze, somiglianze, prestazioni, ecc.
Ecco una citazione dall'articolo:
Gli alberi RB sono, così come gli alberi AVL, autobilanciati. Entrambi forniscono prestazioni di ricerca e inserimento O (log n).
La differenza è che gli alberi RB garantiscono O (1) rotazioni per operazione di inserto. Questo è ciò che in realtà costa le prestazioni nelle implementazioni reali.
Semplificato, gli RB-Trees ottengono questo vantaggio dall'essere concettualmente 2-3 alberi senza portare in giro il sovraccarico delle strutture dinamiche dei nodi. Fisicamente gli RB-Trees sono implementati come alberi binari, i flag rosso / nero simulano 2-3 comportamenti
Per quanto ne so, gli alberi AVL e RB non sono molto distanti in termini di prestazioni. Un albero RB è semplicemente una variante di un albero B e il bilanciamento è implementato in modo diverso da un albero AVL.
La nostra comprensione delle differenze nelle prestazioni è migliorata nel corso degli anni e ora il motivo principale per utilizzare alberi rosso-neri su AVL sarebbe non avere accesso a una buona implementazione AVL poiché sono leggermente meno comuni forse perché non sono coperti in CLRS.
Entrambi gli alberi sono ora considerati forme di alberi con equilibrio di rango, ma gli alberi rosso-neri sono costantemente più lenti di circa il 20% nei test del mondo reale . O addirittura del 30-40% più lento quando vengono inseriti dati sequenziali .
Quindi le persone che hanno studiato alberi rosso-neri ma non alberi AVL tendono a scegliere alberi rosso-neri. Gli usi principali degli alberi rosso-neri sono descritti in dettaglio nella voce di Wikipedia per loro .
Altre risposte qui riassumono bene i pro ei contro degli alberi RB e AVL, ma ho trovato questa differenza particolarmente interessante:
Gli alberi AVL non supportano il costo di aggiornamento ammortizzato costante [ma gli alberi rosso-neri sì]
Fonte: Mehlhorn & Sanders (2008) (sezione 7.4)
Quindi, mentre entrambi gli alberi RB e AVL garantiscono O (log (N)) tempo peggiore per la ricerca, l'inserimento e l'eliminazione, il ripristino della proprietà AVL / RB dopo l' inserimento o l'eliminazione di un nodo può essere eseguito in O (1) tempo ammortizzato per alberi rosso-neri.
I programmatori generalmente non amano allocare dinamicamente la memoria. Il problema con l'albero avl è che per "n" elementi hai bisogno almeno di log2 (log2 (n)) ... (altezza-> log2 (n)) bit per memorizzare l'altezza dell'albero! Quindi, quando gestisci dati enormi, non puoi essere sicuro di quanti bit assegnare per memorizzare l'altezza in ogni nodo.
Ad esempio, se usi 4 byte int (32 bit) per memorizzare l'altezza. L'altezza massima può essere: 2 ^ 32 e quindi il numero massimo di elementi che puoi memorizzare nell'albero è 2 ^ (2 ^ 32) - (sembra essere molto grande ma in quest'era di dati niente è troppo grande immagino). E quindi se superi questo limite devi allocare dinamicamente più spazio per la memorizzazione dell'altezza.
Questa è una risposta suggerita da un professore della mia università che mi è sembrata ragionevole! Spero di avere un senso.
Modifiche: gli alberi AVL sono più bilanciati rispetto agli alberi neri rossi, ma possono causare più rotazioni durante l'inserimento e l'eliminazione. Quindi, se la tua applicazione prevede molti frequenti inserimenti ed eliminazioni, allora dovrebbero essere preferiti gli alberi Red Black. E se gli inserimenti e le eliminazioni sono meno frequenti e la ricerca è un'operazione più frequente, l'albero AVL dovrebbe essere preferito rispetto all'albero nero rosso. - Fonte GEEKSFORGEEKS.ORG
you need need atleast log2(log2(n))...(height->log2(n)) bits to store the height of [an AVL] tree
Non ho bisogno dell'altezza di alcun nodo in un albero AVL per implementarlo. Hai bisogno di un po ' di informazioni extra per ogni nodo ( I AM THE GREATEST (il fratello con il sottoalbero più alto))); è più conveniente oltre che convenzionale avere due bit extra (il bambino è più alto per sinistra e destra), come presentato da AV e L.
Il riequilibrio dell'albero AVL dovrebbe soddisfare la proprietà seguente. (Riferimento Wiki - Albero AVL )
In un albero AVL, le altezze dei due sottoalberi figli di qualsiasi nodo differiscono al massimo di uno; se in qualsiasi momento differiscono di più di uno, viene effettuato un ribilanciamento per ripristinare questa proprietà.
Quindi questo implica che l'altezza complessiva dell'albero AVL non può impazzire, cioè le ricerche saranno migliori con gli alberi AVL. E poiché devono essere eseguite operazioni aggiuntive (rotazioni) per non far impazzire l'altezza, le operazioni di modifica dell'albero possono essere un po 'costose.