na escola, aprendemos como equilibrar uma árvore AVL com uma inserção ou exclusão.
Como esse tipo de conhecimento será realmente útil no mundo real? Alguém pode dar um exemplo de quando esse tipo de conhecimento seria realmente útil?
Pelo que vi, no local de trabalho esses detalhes quase nunca surgem ...
Eu posso ver como o conhecimento detalhado sobre algoritmos e algumas estruturas de dados pode ser importante, mas não detalhes como rotações em árvore AVL (e conceitos detalhados semelhantes).
obrigado!
algorithms
data-structures
rrazd
fonte
fonte
Respostas:
O estudo das árvores AVL pode ser útil pelos seguintes motivos:
É uma boa prática para raciocinar sobre dados abstratos. Você não precisa pensar em uma árvore em particular, deve considerar todas as possibilidades. A prática com esse tipo de raciocínio também pode ajudar em casos mais simples.
É uma boa prática para entender predicados e contratos. Garantir que uma árvore seja equilibrada e as ferramentas usadas para provar que cada operação preserva o equilíbrio pode, por exemplo, ser aplicada a questões de segurança e a códigos paralelos.
Ele permite que você escreva suas próprias variantes ou mesmo crie tipos totalmente novos de estruturas de dados.
Você pode ter que implementar uma árvore AVL para uma nova biblioteca ou plataforma.
Você pode debater os méritos particulares de aprender cada tipo de algoritmo de classificação ou cada tipo de árvore balanceada. Realmente não importa quais você acaba aprendendo, mas certifique-se de obter uma cobertura completa dos tópicos mais importantes.
Se você quiser ver o quão importante é o algoritmo de conhecimento no mundo real, leia " Como matar uma ótima idéia! ", Um artigo da Inc sobre a queda do Friendster e como a menor aplicação de princípios fundamentais para melhorar a eficiência poderia ajudá-los.
fonte
Além dos pontos Macneils ...
Árvores preto-vermelho talvez sejam mais úteis diretamente, porque existem operações eficientes úteis que não são amplamente suportadas em implementações de bibliotecas padrão, como o C ++
std::map
(pelo menos AFAIK). As árvores vermelho-preto podem suportar "dividir" (cortar uma árvore em duas, uma contendo chaves menos do que uma chave especificada e uma contendo chaves maiores) e "join" (ao contrário, combinando uma árvore de chaves grandes com uma árvore de pequenas) chaves) podem ser feitas no tempo O (log n), mas se elas forem suportadas em bibliotecas de contêiner padrão, parece ser uma coisa bem oculta.No entanto, "aumentar" estruturas de dados é comum. Um exemplo simples é adicionar informações de tamanho da subárvore aos nós em quase qualquer estrutura de dados em árvore para suportar a subscrição O (log n). Exemplos mais sofisticados incluem árvores de intervalo.
Depois de ter a idéia de aumentar as estruturas de dados, há muitas variações que podem ser úteis para aplicativos específicos - e muito poucas estão disponíveis pré-empacotadas como uma biblioteca. Estruturas de dados da biblioteca padrão existentes (por exemplo, como
std::map
) não podem ser aumentadas com a cópia do código-fonte e a modificação direta - você não pode aumentá-las usando parâmetros de modelo.Obviamente, para desenvolver uma estrutura de dados aumentada, você precisa entender a estrutura de dados não aumentada subjacente.
As árvores AVL podem ser mais rápidas que as árvores vermelho-preto se você fizer muito mais pesquisas do que inserções / exclusões (e desde que você não precise dessas operações de divisão / junção), portanto, dependendo do aplicativo, elas podem ser uma boa base para aumentando.
fonte
Não
Realmente não é útil no mundo real ...
Exceto para fazer você pensar .
O mundo real tem problemas muito mais difíceis , muitos dos quais ainda não têm soluções conhecidas.
fonte