Tudo bem não entender completamente as árvores RB? [fechadas]

15

Então eu acabei de aprender árvores negras vermelhas em Cormen e uau! Normalmente, eu gosto de entender todos os algoritmos e estruturas de dados a ponto de poder reconstruí-los do zero sem precisar trapacear olhando o pseudo-código. Eu realmente gosto de algoritmos, então gosto de aprender como eles funcionam e geralmente passo a linha e tento alguns casos olhando o código e verificando se o que está acontecendo é o que eu entendi que deveria acontecer.

Apenas entender o que está acontecendo me levou muito tempo para as árvores RB. Mesmo com as explicações do livro, eu ainda achava difícil entender o código. Sem mencionar que eu não conseguia entender como / por que as rotações funcionam. Não acho nada intuitivo. Quero dizer, os três (seis, na verdade) casos diferentes para inserção e os quatro casos para exclusão? É possível entender isso? É impossível reconstruir esse código sem trapacear. Até a árvore binária, eu conseguia implementar as coisas da minha cabeça, com alguns ajustes sempre funcionava, mas as árvores RB eu nem vou tentar. Quero dizer, até o professor ficou confuso às vezes, então acho que não é tão fácil assim, mas ao mesmo tempo, não deveríamos ter que entender tudo o que está acontecendo ou pelo menos por quê? O livro não Explique realmente como alguém teve a ideia de rotações. Como alguém percebeu que com 2 rotações você poderia resolver qualquer problema de inserção? Isso é incrível!

Minha pergunta é: eu realmente preciso entender 100% das árvores RB? Eu me sinto meio que pulando coisas sem entender completamente. Agradecemos antecipadamente pessoal! (PS: não há tag para RB-tree, na verdade nem mesmo para tree, apenas binary-tree, então eu apenas coloco algoritmos)

Bernardo Pires
fonte
18
"Jovem, em matemática você não entende as coisas. Você apenas se acostuma com elas." - John von Neumann
2
@Clash Em que contexto? Acho que nunca precisei saber como as árvores RB funcionam em um ambiente profissional, mas isso pode variar de acordo com o que você deseja fazer. Eu diria que você está bem em ignorá-los até precisar deles.
Adam Lear
4
@Clash Me incomoda imensamente que você diga que é "trapaça" implementar qualquer coisa com orientação de uma fonte externa. O pseudocódigo existe por uma razão - eles eliminam a necessidade de fazê-lo da memória. Concordo plenamente com Winston: compreender e conhecer de memória são duas coisas diferentes mutuamente exclusivas. Memorizar! = Compreender e entender! = Memorizar.
Doppelgreener
3
Não há problema em não me importar com árvores RB - até que eu precise delas?
Steven A. Lowe
1
Talvez entenda QUANDO você deve usar árvores RB, de preferência a todos os outros tipos de implementação de árvore. Saiba quais problemas eles resolvem e todas as razões para escolher as árvores RB. Mas se você precisar implementar um (fora de um exame, é claro), poderá pesquisá-lo; Então, por que se preocupar em saber como fazê-lo de memória?
Dawood diz que restabelece Monica

Respostas:

13

Você parece equiparar a idéia de "entendimento" a "ser capaz de escrever o código sem olhar para o livro". Estas são duas coisas diferentes. Se você pode ver como a rotação dos nós da árvore reorganiza a árvore para manter o equilíbrio, você entende. Ser capaz de recordar imediatamente todos os casos para os quais as rotações se aplicam não é o objetivo.

Eu mesmo, provavelmente poderia descobrir as rotações se tivesse caneta / papel / várias horas para brincar. Mas eu certamente não poderia simplesmente escrever sem pensar. Se eu realmente tivesse que escrever um algoritmo desse tipo, procuraria para ter certeza de que estava obtendo todos os detalhes corretamente. Claro, em quase qualquer situação eu usaria código já escrito.

Onde tudo isso entra em uso é quando você se depara com uma situação que não se encaixa bem em nenhum dos algoritmos. Você nunca precisará escrever sua própria implementação em árvore. Mas você pode encontrar-se, digamos, precisando achatar uma herdeira de listas duplamente vinculadas. Nesse caso, ter entendido a idéia básica por trás da rotação pode ser muito útil.

Winston Ewert
fonte
2
Você parece equiparar a idéia de "entendimento" a "ser capaz de escrever o código sem olhar para o livro". Estas são duas coisas diferentes.' Err ... não. Se você está escrevendo isso, provavelmente significa que você não estudou matemática muito além de um ano ou dois da faculdade, mesmo que isso. Em algum momento, "entender" matemática (que, cortesia de Turing, equivale a computação), é apenas ser capaz de demonstrar o que você "entendeu". Não há solução alternativa ou ifs ou maybes ou foo ou bar ou baz. Nesse nível, se você não pode provar sua afirmação matemática, está brindando. (A menos que seu nome é Fermat.)
Denis de Bernardy
14
@ Dennis, eu tenho um MS em CS com uma quantidade acima da média de cursos de matemática para os principais. Receio que você não tenha entendido meu argumento. Ser capaz de provar ou demonstrar o que você entende é muito importante. Ser capaz de memorizar os detalhes de uma prova ou método não é. Você deve ser capaz de escrever o código. Mas não vejo nenhum uso de um requisito para poder escrever o código a partir de MEMORY.
Winston Ewert 29/05
2
Tenha cuidado com o que você procurar também - IIRC, alguns livros didáticos apresentam erros significativos em seus algoritmos de árvore vermelha e preta.
31330 Steve11
2
@ Steve314, você nem precisa entender RB para ser um autor de livros didáticos! ;)
Winston Ewert 30/05
Obrigado Winston, isso me deixa aliviado! Existem apenas algumas coisas que eu não entendi com o código que eu poderia postar no futuro próximo. Mas estou tão feliz que não há problema em entender (por entender, quero dizer, escrever o código sem trapacear) por que / como alguém notou os 3/6 casos para inserção e 4/8 casos para exclusão.
Bernardo Pires
4

Se você está familiarizado com a programação funcional, pode achar melhor essa abordagem para eles (Okasaki, 1999):

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

Caso contrário, pelo menos se anime com a frase de abertura:

Todo mundo aprende sobre as árvores de pesquisa binária equilibrada em suas aulas introdutórias de ciência da computação, mas até os mais tristes tremem com o pensamento de realmente implementar uma fera assim.

Ryan Culpepper
fonte
Hahah ryan! Isso me deixa aliviado! Muito obrigado! Hoje também notei que existem muito poucas perguntas sobre o SO sobre RB-Trees. Então, suponho que sejam realmente complicados.
Bernardo Pires
2
Eu acho que, além dos estudantes universitários de CS, eles são o tipo de coisa que é implementada aproximadamente uma vez por linguagem de programação. (. Ou menos eu acho que o código RB populares mais para Esquema foi portado do código RB para OCaml.)
Ryan Culpepper
O link está quebrado: espelho 1 , espelho 2 . Citação completa no caso de ambos os espelhos não estarem disponíveis em algum momento no futuro: Chris Okasaki, "Árvores Vermelho-Pretas em um Cenário Funcional", Journal of Functional Programming, 9 (4), pp471-477, julho de 1999.
Snowball
3

Você não precisa entender as rotações em detalhes. Você deve entender o relacionamento entre as árvores RB e as 2-3-4 (veja Sedgewick). Todas essas rotações loucas fazem muito mais sentido quando você pensa nelas como 2-3-4 árvores. Se o seu professor não ensinou as árvores RB como um detalhe de implementação para 2-3-4 árvores, você provavelmente deve ler algo sobre 2-3-4 árvores. (O tratamento de Sedgewick é muito bom; a Wikipedia não o possui.)

De um modo mais geral, entender os detalhes da implementação de por que um algoritmo funciona é apenas algumas vezes útil. Entender a lógica do porquê o algoritmo funciona é quase sempre útil. Ser capaz de criar o algoritmo você mesmo geralmente não é necessário, embora quanto mais algoritmos você entender, maior a chance de ter.

Rex Kerr
fonte
1

Se você precisar de "RB Trees By Heart" para o exame na próxima semana, precisará morder a bala e aprendê-las. Nesse caso, você deve reconsiderar seus métodos de aprendizado. Talvez tentar explicar as Árvores RB a um colega de classe o ajude mais do que mais uma noite de escrita de código solitária.

Se as Árvores RB são a base para o seu próximo curso após as férias, pule-as agora (sem ressentimentos) e concentre-se no curso deste semestre. Mas fique de olho nos tópicos que podem prepará-lo para uma segunda tentativa no RB Trees.

Se você honestamente achar que nunca precisará deles (cf. comentário de Anna Lear), dê um beijo de despedida sem se arrepender - ninguém sabe mais que uma gota no mar de conhecimento (que pena que os professores muitas vezes acham que essa queda é a mais importante).

Ekkehard.Horner
fonte
1

A chave para o sucesso da programação é nunca desistir :

Hoje suas árvores RB amanhã serão outra coisa. A lição maior é não desistir .

Para mim, essa é uma das essência da programação, não desistir ...

Eu sugiro que você continue tentando e, quando falhar, FAÇA NOVAMENTE .

"Até você chegar, até clicar, até rodar."

Porque uma vez que você supera as montanhas, o céu fica claro. Sua mente muda de entendimento, você está temporariamente elevado (até a próxima montanha) . Essa elevação temporal vale mais do que todo o dinheiro do mundo.

Noite escura
fonte
Obrigado, este foi exatamente o meu medo! Se eu desistir disso, o que está me impedindo de desistir da próxima coisa? É por isso que perdi quase um dia inteiro apenas para entender inserção e exclusão.
Bernardo Pires
Nunca é um desperdício, acredite em mim quando "clica" na elevação mais do que compensa todo o suor e lágrimas.
Darknight
0

A melhor maneira de entender é experimentá-lo :

  • Existem 3 ou 6 rotações. Pegue um pedaço de papel e anote-os um por um.
  • Depois de obtê-lo, vá e implemente uma Red Black Tree. Tudo bem se você precisar procurar algumas coisas.

Foi assim que fizemos na faculdade. E para o exame, precisamos explicar como parte disso funcionava.

Carra
fonte