procedura di cancellazione di un binario di ricerca albero

voti
7

Prendere in considerazione la procedura di cancellazione su un BST, quando il nodo da eliminare ha due figli. Diciamo che ho sempre sostituirlo con il nodo tenendo premuto il tasto minima nel suo sottoalbero destro.

La domanda è: è questa procedura commutativa? Cioè, eliminando quindi x y ha lo stesso risultato di cancellare prima y e poi x?

Penso che la risposta è no, ma non riesco a trovare un controesempio, nè a capire ogni ragionamento valido.

MODIFICARE:

Forse ho avuto modo di essere più chiaro.

Si consideri la transplant(node x, node y)procedura: si sostituisce x con y (e relativo sottoalbero). Quindi, se voglio eliminare un nodo (per esempio x), che ha due figli lo sostituisco con il nodo tenendo premuto il tasto minima nel suo sottoalbero destro:

y = minimum(x.right)
transplant(y, y.right) // extracts the minimum (it doesn't have left child)
y.right = x.right
y.left = x.left
transplant(x,y)

Il problema era come per dimostrare la procedura di cui sopra non è commutativa.

È pubblicato 07/06/2010 alle 15:46
fonte dall'utente
In altre lingue...                            


4 risposte

voti
17

La cancellazione (in generale) non è commutativa. Ecco un controesempio:

    4
   / \
  3   7
     /
    6

Che cosa succede se cancelliamo 4 e poi 3?

Quando cancelliamo 4, otteniamo 6 come la nuova radice:

   6
  / \
 3   7

L'eliminazione di 3 non cambia l'albero, ma ci dà questa:

  6
   \
    7

Che cosa succede se cancelliamo 3 e poi 4?

Quando cancelliamo 3 l'albero non cambia:

 4
  \
   7
  /
 6

Tuttavia, quando abbiamo ora cancelliamo 4, la nuova radice diventa 7:

  7
 /
6

I due alberi risultanti non sono gli stessi, quindi cancellazione non è commutativa.

AGGIORNARE

Non ho letto la restrizione che questo è quando si elimina sempre un nodo con 2 bambini. La mia soluzione è per il caso generale. Io aggiornare se / quando posso trovare un contro-esempio.

Un altro aggiornamento

Non ho prove concrete, ma ho intenzione di azzardare un'ipotesi:

Nel caso generale, si gestiscono le eliminazioni in modo diverso a seconda che si hanno due figli, un bambino, o senza figli. Nel contro-esempio che ho fornito, in primo luogo ho eliminare un nodo con due figli e poi un nodo con un bambino. Dopo di che, ho eliminare un nodo senza figli e poi un altro nodo con un bambino.

Nel caso particolare di eliminare solo i nodi con due figli, si vuole considerare il caso in cui entrambi i nodi sono nella stessa sotto-albero (in quanto non importa se sono in diversi sotto-alberi, si può essere sicuri che il struttura complessiva non cambierà in base all'ordine di soppressione). Quello che si ha realmente bisogno di dimostrare è se l'ordine di cancellazione dei nodi nella stessa sotto-albero, dove ogni nodo ha due figli, questioni.

Consideriamo due nodi A e B dove A è un antenato di B. Quindi è possibile raffinare ulteriormente la questione di essere:

È l'eliminazione commutativa quando si stanno prendendo in considerazione la cancellazione di due nodi da un binario di ricerca albero, che hanno un rapporto antenato-discendente tra di loro (questo implicherebbe che sono nella stessa sotto-albero)?

Quando si elimina un nodo (diciamo A), si attraversa il diritto sub-albero per trovare l'elemento minimo. Questo nodo sarà un nodo foglia e non può mai essere uguale a B (perché B ha due figli e non può essere un nodo foglia). Si potrebbe quindi sostituire il valore di A con il valore di questa foglia-nodo. Ciò significa che l'unica modifica strutturale alla struttura è la sostituzione del valore di A con il valore del nodo foglia, e la perdita del nodo foglia.

Lo stesso processo è coinvolto in B. Cioè, si sostituisce il valore del nodo e sostituire una foglia-nodo. Quindi, in generale, quando si elimina un nodo con due figli, l'unico cambiamento strutturale è la variazione del valore del nodo si sta eliminando, e l'eliminazione del nodo foglia che è il valore che si sta utilizzando in sostituzione .

Quindi la domanda è ulteriormente raffinato:

Può garantire che otterrete sempre lo stesso nodo sostitutivo indipendentemente dall'ordine di eliminazione (quando si sta sempre Eliminazione di un nodo con due figli)?

La risposta (credo) è sì. Perché? Qui ci sono alcune osservazioni:

  • Diciamo che si elimina il nodo discendente primo ed il secondo nodo antenato. Il sub-albero che è stato modificato quando è stato eliminato il nodo discendente è non nel sotto-albero sinistro del figlio destro del nodo antenato. Ciò significa che questo sub-tree rimane inalterato. Ciò significa anche indipendentemente dall'ordine di soppressione, due diverse sotto-alberi vengono modificate e pertanto l'operazione è commutativa.
  • Anche in questo caso, diciamo che si elimina il nodo discendente primo ed il secondo nodo antenato. Il sub-albero che è stato modificato quando è stato eliminato il nodo discendente è nel sotto-albero sinistro del figlio destro del nodo antenato. Ma anche qui, non c'è sovrapposizione. Il motivo è quando si elimina il nodo discendente prima, si guarda al sotto-albero sinistro del nodo discendente destra bambino. Quando si elimina il nodo antenato, si non imboccare questa sotto-albero dal momento che sarà sempre si reca verso sinistra dopo aver inserito a sinistra sotto-albero di destro elementi secondari del nodo antenato. Così ancora una volta, indipendentemente da ciò che si elimina prima che si sta modificando diversi sotto-alberi e così appare ordine non importa.
  • Un altro caso è se si elimina il nodo antenato prima e si scopre che il punto di minimo è un figlio del nodo discendente. Ciò significa che il nodo discendente finirà con un bambino, e l'eliminazione della un bambino è banale. Consideriamo ora il caso in cui in questo scenario, è stato eliminato il nodo discendente prima. Poi si dovrebbe sostituire il valore del nodo discendente con il suo figlio destro e quindi eliminare il figlio destro. Poi, quando si elimina il nodo predecessore, si finisce per trovare la stessa punto di minimo (figlio sinistro del vecchio nodo cancellato, che è anche figlio sinistro del nodo sostituito). In entrambi i casi, si finisce con la stessa struttura.

Questa non è una dimostrazione rigorosa; queste sono solo alcune osservazioni che ho fatto. Con tutti i mezzi, non esitate a colpire i fori!

Risposto il 07/06/2010 a 18:32
fonte dall'utente

voti
0

Rispondo qui per secondo aggiornamento di Vivin.

Credo che questo sia un buon rifusione della questione:

È l'eliminazione commutativa quando si stanno prendendo in considerazione la cancellazione di due nodi da un binario di ricerca albero, che hanno un rapporto antenato-discendente tra di loro (questo implicherebbe che sono nella stessa sotto-albero)?

ma questa frase in grassetto qui sotto non è vero:

Quando si elimina un nodo (diciamo A), si attraversa il diritto sub-albero per trovare l'elemento minimo. Questo nodo sarà un nodo foglia e non può mai essere uguale a B

poiché l'elemento minimo in sottoalbero destro di un grado di avere un figlio proprio . Quindi, non è una foglia. Chiamiamo l'elemento minimo nel sottoalbero destro di A successor(A). Ora, è vero che B non può essere successor(A), ma può essere nel suo sottoalbero destro. Quindi, è un casino.

Provo a riassumere.

ipotesi :

  1. A e B hanno due figli ciascuno.
  2. A e B sono nella stessa sottostruttura.

Altre cose possiamo dedurre da un'ipotesi:

  1. B non è successor(A), né A è successor(B).

Ora, visto che, penso che ci sono 4 diversi casi (come al solito, per non essere un antenato di B):

  1. B si trova nel sottoalbero sinistro di A
  2. B è un antenato di successor(A)
  3. successor(A) è un antenato di B
  4. B e successore (A) non hanno alcun rapporto. (Sono in diverse sottostrutture di A)

Credo (ma naturalmente non posso dimostrarlo) che i casi 1, 2 e 4 non contano. Quindi, solo nel caso successor(A)è un antenato di B procedura di cancellazione non potrebbe essere commutativa. O potrebbe?

Io passo la palla:)

Saluti.

Risposto il 11/06/2010 a 18:45
fonte dall'utente

voti
2

Mi sembra che il controesempio mostrato nella risposta di Vivin è l'unico caso di non commutativa, e che sia effettivamente eliminato la restrizione che i nodi solo con i due figli possono essere eliminati.

Ma può anche essere eliminato se noi scartare quello che sembra essere uno dei locali del Vivin, che è che dobbiamo attraversare il sottoalbero destro il meno possibile trovare qualsiasi successore accettabile. Se, invece, promuoviamo sempre il nodo più piccolo del sottoalbero destro come il successore, a prescindere da quanto lontano si scopre di essere situato, allora anche se ci rilassiamo la limitazione eliminazione dei nodi con meno di due figli, frutto di Vivin

    7
   /
  6
non viene mai raggiunta se iniziamo a

    4
   / \
  3 7
     /
    6

Invece, avremmo prima eliminare 3 (senza successore) e quindi eliminare 4 (con 6 come successore), ottenendo

    6
     \
      7

che è lo stesso come se l'ordine di eliminazione sono stati invertiti.

La cancellazione sarebbe allora commutativa, e penso che sia sempre commutativa, data la premessa che ho chiamato (successore è sempre più piccolo nodo nel sottoalbero destro del nodo cancellato).

Non ho una prova formale da offrire, solo un'enumerazione di casi:

  1. Se i due nodi da eliminare sono in diverse sottostrutture, l'eliminazione di una non influenza l'altra. Solo quando sono nello stesso percorso può dell'ordine di delezione eventualmente influenzare l'esito.

    Quindi, qualsiasi effetto sulla proprietà commutativa può venire solo quando un nodo predecessore e uno dei suoi discendenti sono entrambi eliminati. Ora, come il loro rapporto verticale influisce commutativity?

  2. Discendente in sottoalbero sinistro dell'antenato. Questa situazione non influirà commutativity perché il successore viene dalla sottostruttura giusto e non può influenzare il sottoalbero di sinistra a tutti.

  3. Discendente in sottoalbero destro dell'antenato. Se il successore del antenato è sempre il nodo più piccolo del sottoalbero destro, quindi ordine di cancellazione non può cambiare la scelta del successore, non importa quale discendente viene eliminato prima o dopo l'antenato. Anche se il successore l'antenato si rivela essere il nodo discendente che è anche da cancellare, che discendente troppo viene sostituito con il nodo successivo ordine di grandezza ad esso, e che discendente non possono avere il proprio sottoalbero sinistro rimanente da trattare . Quindi l'eliminazione di un antenato e qualsiasi discendente destra-sotto-albero sarà sempre commutativa.

Risposto il 06/04/2011 a 19:34
fonte dall'utente

voti
0

Penso che ci sono due modi ugualmente valide per eliminare un nodo, quando ha 2 figli:
VAI A CASO 4 ...

Caso 1: eliminare 3 (nodo foglia)
 2 3
 / \ -> / \
1 3 1


Caso 2: eliminare 2 (nodo figlio sinistro)
 2 3
 / \ -> / \
1 3 1


Caso 3: eliminare 2 (nodo figlio destro)
 2 2
 / \ -> / \
1 3 3

______________________________________________________________________
Caso 4: eliminare 2 (Left & nodi figlio destro)
 2 2 3
 / \ -> / \ o / \      
1 3 1 3
sia il lavoro e hanno diversi alberi risultanti :) ______________________________________________________________________
Come algoritmo spiegato qui: http: // www .mathcs.emory.edu / ~ cheung / Corsi / 323 / Syllabus / Alberi / AVL-delete.html Deleting a node with 2 children nodes: 1) Replace the (to-delete) node with its in-order predecessor or in-order successor 2) Then delete the in-order predecessor or in-order successor

Risposto il 10/10/2016 a 01:02
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more