2013-03-16 8 views
15

sto imparando Left-Lean-Red-Black tree, da Prof.Robert SedgewickQualcuno può spiegare chiaramente la cancellazione dell'albero Left-Lean-Red-Black?

http://www.cs.princeton.edu/~rs/talks/LLRB/LLRB.pdf http://www.cs.princeton.edu/~rs/talks/LLRB/RedBlack.pdf

Mentre ho avuto modo di capire la insert del 2-3 tree e la LLRB, ho speso tutto come 40 ore ora per 2 settimane e posso ancora' t ottenere la cancellazione del LLRB.

Qualcuno può davvero spiegare lo deletion di LLRB a me?

+2

È ... intricato. – Thomas

+0

@Thomas, un sacco di RB o LLRB stanno parlando solo di inserimento, nessuno parla davvero di cancellazione –

risposta

8

Ok, ho intenzione di provare questo, e forse le altre brave persone di SO possono dare una mano. Sapete come un modo di pensare di nodi rossi è come indicatori di

  1. dove non c'è uno squilibrio/nuovi nodi dell'albero, e
  2. quanto squilibrio c'è.

Ecco perché tutti i nuovi nodi sono rossi. Quando i nodi (localmente) si equilibrano, subiscono un capovolgimento del colore, e il rossore viene passato al genitore, e ora il genitore può sembrare squilibrato rispetto al fratello.

Come illustrazione, prendere in considerazione una situazione in cui si aggiungono nodi da più grandi a più piccoli. Si inizia con il nodo Z che ora è root ed è nero. Aggiungi il nodo Y, che è rosso ed è un figlio sinistro di Z. Aggiungi una X rossa come figlio di Z, ma ora hai due rossi successivi, quindi ruoti a destra, ricolora e hai un bilanciato, tutto nero (nessun squilibrio/"nuovi nodi"!) albero con radice su Y [primo disegno]. Ora aggiungi W e V, in questo ordine. All'inizio sono entrambi rossi [secondo disegno], ma immediatamente V/X/W vengono ruotati a destra e il colore viene capovolto, in modo che solo X sia rosso [terzo disegno]. Questo è importante: X essendo rosso indica che il sottoalbero sinistro di Y è sbilanciato di 2 nodi, o, in altre parole, ci sono due nuovi nodi nella sottostruttura di sinistra. Quindi l'altezza dei collegamenti rossi è il numero di nuovi nodi potenzialmente sbilanciati: ci sono 2^altezza di nuovi nodi nella sottostruttura rossa.

enter image description here

Nota come quando si aggiungono i nodi, il rossore è sempre lasciato perdere: a sua volta di colore, due figli rossi diventano nero (= localmente bilanciato), mentre la colorazione rossa il loro genitore. Essenzialmente ciò che fa la cancellazione, è invertire questo processo. Proprio come un nuovo nodo è rosso, vogliamo sempre anche eliminare un nodo rosso. Se il nodo non è rosso, vogliamo prima farlo diventare rosso. Questo può essere fatto con un capovolgimento del colore (per inciso, questo è il motivo per cui il capovolgimento del colore nel codice a pagina 3 è in realtà neutrale rispetto al colore). Quindi, se il bambino che vogliamo eliminare è nero, possiamo renderlo rosso colorando il suo genitore. Ora il bambino è garantito per essere rosso.

Il prossimo problema da affrontare è il fatto che quando iniziamo la cancellazione non sappiamo se il nodo di destinazione da eliminare sia rosso o meno. Una strategia sarebbe scoprire prima. Tuttavia, secondo la mia lettura del tuo primo riferimento, la strategia scelta è quella di garantire che il nodo cancellato possa essere reso rosso, "spingendo" un nodo rosso in basso di fronte al nodo di ricerca mentre stiamo cercando nell'albero per il nodo da cancellare. Ciò potrebbe creare nodi rossi non necessari che la procedura fixUp() risolverà durante il backup dell'albero. fixUp() mantiene invariabilmente i soliti invarianti LLRBT: "nessun nodo rosso successivo" e "nessun nodo rosso corretto".

Non sono sicuro se ciò sia di aiuto o se sia necessario approfondire l'esame del codice.

+3

è molto utile. 'Proprio come un nuovo nodo è rosso, vogliamo sempre anche eliminare un nodo rosso. Se il nodo non è rosso, allora vogliamo renderlo rosso per primo., Questo è davvero stimolante. –

+2

Penso che qualcosa non va con la rotazione. se h.left e h.left.left sono entrambi rossi, facciamo un rotateToRight sul nodo superiore, che nel caso in cui stavi mostrando, il risultato dovrebbe essere V/W/X, e W diventare rosso dopo il capovolgimento del colore. {In realtà, il sottostruttura VXW non corrisponde al criterio dell'albero di ricerca binario} – hakunami

1

C'è un commento interessante sull'implementazione di Sedgwich e in particolare il suo metodo di cancellazione da un professore di Harvard Comp Sci. Left-Leaning Red-Black Trees Considered Harmful è stato scritto nel 2013 (pdf Sedgwich si fa riferimento sopra è datato 2008):

scrittura Tricky

carta di Sedgewick è difficile. A partire dal 2013, la sezione di inserimento presenta 2-3-4 alberi come impostazione predefinita e descrive 2-3 alberi come variante. L'implementazione di eliminazione, tuttavia, funziona solo per 2-3 alberi. Se implementi la variante predefinita di insert e l'unica variante di delete, la tua struttura non funzionerà. Il testo non evidenzia il passaggio da 2-3-4 a 2-3: non gentile.

La versione più recente sono riuscito a trovare del codice Sedgwich, che contiene un'implementazione 2-3, è datato aprile 2014 . È sul suo Algorithms sito di libro a RedBlackBST.java

+0

La sua implementazione è sbagliata, solo dicendo. Controlla il metodo deleteMin. – Pavel

+1

Solo curioso, hai davvero guardato il documento di Sedgewick, a cui Kohler si collega? Non vedo come una grande didascalia e il testo circostante che dice 2-3 ripetutamente non "evidenzia" il codice di cancellazione sia per 2-3 alberi. Anche Sedgewick fa un commento sulla modifica del codice per 2-3-4. Non so dove Kohler abbia avuto l'idea che il 2-3-4 sia l'albero principale e 2-3 sia una variante. Sedgewick presenta chiaramente entrambi i tipi fin dall'inizio, senza che sia descritto come "predefinito". Kohler sembra avere un'ascia per macinare con alcuni dei suoi commenti lì. –

Problemi correlati