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)
fonte
Respostas:
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.
fonte
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:
fonte
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.
fonte
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).
fonte
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 .
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.
fonte
A melhor maneira de entender é experimentá-lo :
Foi assim que fizemos na faculdade. E para o exame, precisamos explicar como parte disso funcionava.
fonte