Árvores AVL e o mundo REAL

14

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!

rrazd
fonte
7
É útil em entrevistas, se isso conta como o mundo real.
Kevin
Esse é o mesmo argumento que algumas pessoas fazem sobre o aprendizado de trigonometria na escola "Sheesh! Quando é que vou usar isso na vida real?", E a resposta é "pensei que você pensasse em como analisar e resolver uma classe inteira de problemas" . Nesse dia, você quer cortar uma árvore e seu parceiro pergunta: "Tem certeza de que isso não vai atingir a casa?" Gatilho para o resgate!
Binary Worrier

Respostas:

13

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.

Macneil
fonte
Artigo interessante, mas não vejo como as árvores AVL teriam ajudado o Friendster.
Eratóstenes
Eu gostaria de ver um exemplo, como as árvores B + são usadas para indexação de banco de dados.
Luca Fülbier 20/03
5

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, comostd::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.

Steve314
fonte
1
+1 para aumentar a estrutura de dados, embora seja algo raro de se fazer. A maioria dos programadores não precisa se esforçar para obter desempenho (caso contrário, todos estaríamos usando C ++ / C / Fortran / Assembly).
Matthieu M.
@ Matthieu - Eu acredito que é comum, mas apenas em certos tipos de ambientes de desenvolvimento. Isso não é uma contradição, honesto, porque ... hummm, bem ...
Steve314
Eu concordo plenamente! : D
Matthieu M.
5

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.

Steven A. Lowe
fonte