Va bene non comprendere appieno gli alberi RB? [chiuso]


15

Quindi ho appena imparato alberi neri rossi a Cormen e wow! In genere mi piace comprendere tutti gli algoritmi e le strutture di dati al punto da poterli ricostruire da zero senza dover imbrogliare guardando lo pseudo codice. Mi piacciono molto gli algoritmi, quindi mi piace imparare come funzionano e di solito vado riga per riga e provo alcuni casi guardando il codice e controllando se ciò che sta accadendo è ciò che ho capito che dovrebbe accadere.

La sola comprensione di ciò che sta accadendo mi ha richiesto MOLTO tempo per gli alberi RB. Anche con le spiegazioni del libro, ho ancora trovato difficile capire il codice. Per non parlare del fatto che non sono riuscito a capire come / perché le rotazioni funzionano. Non lo trovo affatto intuitivo. Voglio dire, i tre (sei in realtà) diversi casi per l'inserimento e poi i 4 casi per la cancellazione? È possibile capire questa cosa? È impossibile per me ricostruire questo codice senza imbrogliare. Fino a quando l'albero binario potrei implementare la roba dalla mia testa, con alcune modifiche funzionerebbe sempre, ma gli alberi RB non ci proverò nemmeno. Voglio dire, anche l'insegnante a volte si confonde, quindi suppongo che non sia così facile, ma allo stesso tempo, non dovremmo capire tutto ciò che sta accadendo o almeno perché? Il libro non ha Spiego davvero come qualcuno ha avuto l'idea delle rotazioni. In che modo qualcuno ha notato che con 2 rotazioni è stato possibile risolvere qualsiasi problema di inserimento? È stupefacente!

La mia domanda è: devo davvero capire al 100% gli alberi RB? Mi sento un po 'male saltare cose senza comprenderle appieno. Grazie in anticipo ragazzi! (PS: non esiste un tag per RB-tree, in realtà nemmeno per tree, solo binary-tree, quindi metto solo algoritmi)


18
"Giovane, in matematica non capisci le cose. Ti ci abitui e basta." - John von Neumann

2
@Clash In quale contesto? Non credo di aver mai avuto bisogno di sapere come funzionano gli alberi RB in un ambiente professionale, ma ciò potrebbe variare in base a ciò che si desidera fare. Direi che va bene saltarli finché non ne hai bisogno.
Adam Lear

4
@Clash Mi disturba immensamente il fatto che tu dica che è "imbroglione" implementare qualsiasi cosa con la guida di una fonte esterna. Lo pseudocodice esiste per una ragione: eliminano la necessità di farlo dalla memoria. Sono completamente d'accordo con Winston: la comprensione e la conoscenza dalla memoria sono due cose reciprocamente esclusive. Memorizzazione! = Comprensione e comprensione! = Memorizzazione.
doppelgreener,

3
Va bene non preoccuparsi davvero degli alberi RB - fino a quando non ne ho bisogno?
Steven A. Lowe,

1
Forse capirai QUANDO dovresti usare gli alberi RB, preferendo tutti gli altri tipi di implementazione dell'albero. Scopri quali problemi risolvono e tutti i motivi della scelta degli alberi RB. Ma se dovessi mai implementarne uno (al di fuori di un esame, ovviamente), sarai in grado di cercarlo; quindi perché preoccuparsi di saperlo fare dalla memoria?
Dawood dice di ripristinare Monica il

Risposte:


13

Sembri equiparare l'idea di "comprensione" con "essere in grado di scrivere il codice senza guardare il libro". Queste sono due cose diverse. Se riesci a vedere come ruotare i nodi dell'albero riorganizza l'albero per mantenere l'equilibrio, allora lo capisci. Essere in grado di richiamare immediatamente tutti i casi per cui si applicano le rotazioni non è il punto.

Personalmente, potrei probabilmente capire le rotazioni se avessi avuto a disposizione penna / carta / diverse ore. Ma non potevo certo scriverlo senza pensarci. Se davvero dovessi scrivere un tale algoritmo, lo cercarei per assicurarmi di ottenere tutti i dettagli giusti. Certo, in quasi ogni situazione userei un codice già scritto.

Quando tutto ciò viene utilizzato è quando ti imbatti in una situazione che non si adatta perfettamente a nessuno degli algoritmi. Non avrai mai bisogno di scrivere la tua implementazione ad albero. Ma potresti ritrovarti, per esempio, a dover appiattire un'erede di elenchi doppiamente collegati. In tal caso, avere compreso l'idea di base alla base della rotazione può essere molto utile.


2
"Sembri equiparare l'idea di" comprensione "con" la capacità di scrivere il codice senza guardare il libro ". Queste sono due cose diverse.' Err ... no. Se stai scrivendo questo, probabilmente significa che non hai studiato matematica molto oltre un anno o due di college, anche se quello. Ad un certo punto, la "comprensione" della matematica (che, per gentile concessione di Turing, equivale al calcolo) riguarda solo la capacità di dimostrare ciò che "hai capito". Non c'è soluzione alternativa o ifs o maybes o foo o bar o baz. A quel livello, se non riesci a provare la tua affermazione matematica, sei un brindisi. (A meno che non ti chiami Fermat.)
Denis de Bernardy,

14
@Dennis, ho una laurea in CS con un numero di corsi di matematica superiore alla media per i maggiori. Temo che tu non abbia capito il mio punto. Essere in grado di dimostrare o dimostrare ciò che capisci è molto importante. Essere in grado di memorizzare i dettagli di una prova o di un metodo non lo è. DOVREBBE essere in grado di scrivere il codice. Ma non vedo alcun uso per un requisito per poter scrivere il codice da MEMORY.
Winston Ewert,

2
Fai attenzione anche a dove lo cerchi: IIRC, alcuni libri di testo hanno errori significativi nei loro algoritmi ad albero rosso-nero.
Steve314,

2
@ Steve314, non hai nemmeno bisogno di capire RB per essere un autore di libri di testo allora! ;)
Winston Ewert

Grazie Winston, questo mi fa sentire sollevato! Ci sono solo un paio di cose che non ho capito con il codice che potrei pubblicare nel prossimo futuro. Ma sono così felice che è ok non capire (intendo intendo scrivere il codice senza imbrogliare) perché / come qualcuno ha notato i casi 3/6 per l'inserimento e 4/8 casi per l'eliminazione.
Bernardo Pires,

4

Se hai familiarità con la programmazione funzionale, potresti trovare questo approccio migliore (Okasaki 1999):

http://www.eecs.usma.edu/webs/people/okasaki/jfp99redblack.pdf

In caso contrario, prendi almeno il cuore dalla frase di apertura:

Ognuno impara a conoscere alberi di ricerca binaria bilanciati nelle loro lezioni introduttive di informatica, ma anche il tremito sbalorditivo al pensiero di implementare davvero una tale bestia.


Hahah Ryan! Questo mi fa sentire sollevato! Molte grazie! Oggi ho anche notato che ci sono pochissime domande su SO su RB-Trees. Quindi suppongo che siano davvero difficili.
Bernardo Pires

2
Penso sia solo che, a parte gli studenti del college CS, sono il tipo di cosa che viene implementata approssimativamente una volta per linguaggio di programmazione. (O meno. Penso che il codice RB più popolare per Scheme sia stato portato dal codice RB per OCaml.)
Ryan Culpepper

Il collegamento è interrotto: mirror 1 , mirror 2 . Citazione completa nel caso in cui entrambi gli specchi non fossero disponibili in futuro: Chris Okasaki, "Alberi rosso-neri in un ambiente funzionale", Journal of Functional Programming, 9 (4), pp471-477, luglio 1999.
Snowball

3

Non è necessario comprendere le rotazioni in dettaglio. Si dovrebbe capire il rapporto tra gli alberi RB e alberi 2-3-4 (vedi Sedgewick). Tutte quelle pazze rotazioni hanno molto più senso se le pensi come 2-3-4 alberi. Se il tuo professore non ha insegnato alberi RB come dettaglio di implementazione per 2-3-4 alberi, probabilmente dovresti leggere qualcosa su 2-3-4 alberi. (Il trattamento di Sedgewick è abbastanza buono; Wikipedia non ce l'ha.)

Più in generale, la comprensione dei dettagli di implementazione del perché un algoritmo funziona è talvolta utile. Comprendere la logica del perché l'algoritmo funziona è quasi sempre utile. Essere in grado di elaborare l'algoritmo da soli non è di solito necessario, anche se più algoritmi capisci, maggiori sono le possibilità che avrai.


1

Se hai bisogno di "RB Trees By Heart" per l'esame della prossima settimana, dovrai mordere il proiettile e impararli. In tal caso, dovresti riconsiderare i tuoi metodi di apprendimento. Forse provare a spiegare RB Trees a un compagno di classe ti aiuterà più di un'altra notte di scrittura di codice solitario.

Se RB Trees è una base per il tuo prossimo corso dopo le vacanze, saltali ora (senza cattivi sentimenti) e concentrati sul corso di questo semestre. Ma tieni gli occhi aperti per argomenti che potrebbero prepararti per un secondo tentativo in RB Trees.

Se senti onestamente che non ne avrai mai davvero bisogno (vedi il commento di Anna Lear), baciagli addio senza rimpianti - nessuno sa più che una goccia nel mare della conoscenza (peccato che gli insegnanti pensino spesso che la loro caduta sia la più importante).


1

La chiave del successo della programmazione è non mollare mai :

Oggi i suoi alberi RB domani sarà qualcos'altro. La lezione più grande non è arrendersi .

Per me, questa è una delle essenze fondamentali della programmazione, non arrendersi ...

Ti suggerirei di continuare a provare , e quando fallisci FARLO DI NUOVO .

"Finché non ottieni, finché non scatta, fino a quando non viene eseguito."

Perché una volta che hai superato le montagne, il cielo diventa chiaro. La tua mente si sposta nella comprensione, sei temporaneamente elevato (fino alla montagna successiva) . Questa elevazione temporale vale più di tutti i soldi del mondo.


Grazie, questa era esattamente la mia paura! Se mi arrendo, cosa mi impedisce di rinunciare alla prossima cosa? Questo è il motivo per cui ho perso quasi un'intera giornata solo per capire l'inserimento e la cancellazione.
Bernardo Pires,

Non è mai uno spreco, credimi quando "scatta" l'altezza più che compensa tutto il sudore e le lacrime.
Darknight,

0

Il modo migliore per capirlo è provarlo :

  • Ci sono 3 o 6 rotazioni. Prendi un pezzo di carta e scrivilo uno per uno.
  • Una volta ottenuto, vai e implementa un albero nero rosso. Va bene se devi cercare alcune cose.

È come l'abbiamo fatto al college. E per l'esame abbiamo dovuto spiegare come funzionava una parte di esso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.