As árvores AVL e Red black são auto-equilibradas, exceto as cores vermelha e preta nos nós. Qual é a principal razão para escolher Red black trees em vez de árvores AVL? Quais são as aplicações de Red black trees?
108
As árvores AVL e Red black são auto-equilibradas, exceto as cores vermelha e preta nos nós. Qual é a principal razão para escolher Red black trees em vez de árvores AVL? Quais são as aplicações de Red black trees?
Respostas:
As árvores red-black e as árvores AVL são as árvores de pesquisa binárias balanceadas mais comumente usadas e oferecem suporte para inserção, exclusão e consulta garantida
O(logN) time
. No entanto, existem os seguintes pontos de comparação entre os dois:O(N)
espaço extra. Porém, se sabemos que as chaves que serão inseridas na árvore sempre serão maiores que zero, podemos usar o bit de sinal das chaves para armazenar as informações de cor de uma árvore vermelho-preto. Assim, em tais casos, a árvore vermelho-preto não ocupa espaço extra.Árvores vermelho-pretas são de uso mais geral. Eles se saem relativamente bem em adicionar, remover e pesquisar, mas as árvores AVL têm pesquisas mais rápidas ao custo de adicionar / remover mais lentamente. A árvore vermelho-preto é usada no seguinte:
java.util.TreeMap
,java.util.TreeSet
fonte
In general, the rotations for an AVL tree are harder to implement and debug than that for a Red-Black tree.
não é verdade.std:: map
e amigos usam qualquer estrutura particular. Isso é deixado para a implementação, embora libstdc ++ e Dinkumware pelo menos usem árvores vermelhas e pretas, e parece que você está certo na prática.Tente ler isto artigo
Ele oferece alguns bons insights sobre diferenças, semelhanças, desempenho, etc.
Aqui está uma citação do artigo:
Pelo que entendi, as árvores AVL e as árvores RB não estão muito distantes em termos de desempenho. Uma árvore RB é simplesmente uma variante de uma árvore B e o balanceamento é implementado de forma diferente de uma árvore AVL.
fonte
Nossa compreensão das diferenças de desempenho melhorou ao longo dos anos e agora o principal motivo para usar árvores vermelhas e pretas sobre AVL seria não ter acesso a uma boa implementação de AVL, uma vez que são um pouco menos comuns, talvez porque não são cobertos pelo CLRS.
Ambas as árvores são agora consideradas formas de árvores equilibradas, mas as vermelho-pretas são consistentemente mais lentas em cerca de 20% nos testes do mundo real . Ou até 30-40% mais lento quando os dados sequenciais são inseridos .
Portanto, as pessoas que estudaram árvores vermelho-pretas, mas não árvores AVL, tendem a escolher árvores vermelho-pretas. Os principais usos para árvores vermelho-pretas são detalhados na entrada da Wikipedia para eles .
fonte
Outras respostas aqui resumem bem os prós e contras das árvores RB e AVL, mas achei essa diferença particularmente interessante:
Fonte: Mehlhorn & Sanders (2008) (seção 7.4)
Assim, enquanto ambas as árvores RB e AVL garantem O (log (N)) tempo de pior caso para pesquisa, inserção e exclusão, restaurar a propriedade AVL / RB após inserir ou excluir um nó pode ser feito em O (1) tempo amortizado para árvores vermelho-pretas.
fonte
Os programadores geralmente não gostam de alocar memória dinamicamente. O problema com a árvore avl é que para "n" elementos você precisa de pelo menos log2 (log2 (n)) ... (height-> log2 (n)) bits para armazenar a altura da árvore! Portanto, quando você está lidando com dados enormes, não pode ter certeza de quantos bits alocar para armazenar a altura em cada nó.
Por exemplo, se você usar 4 bytes int (32 bits) para armazenar a altura. A altura máxima pode ser: 2 ^ 32 e, portanto, o número máximo de elementos que você pode armazenar na árvore é 2 ^ (2 ^ 32) - (parece ser muito grande, mas nesta era de dados nada é muito grande, eu acho). Portanto, se você ultrapassar esse limite, terá que alocar dinamicamente mais espaço para armazenar a altura.
Esta é uma resposta sugerida por um professor da minha universidade que me pareceu razoável! Espero que eu faça sentido.
Edições: As árvores AVL são mais equilibradas em comparação com Red Black Trees, mas podem causar mais rotações durante a inserção e exclusão. Portanto, se o seu aplicativo envolve muitas inserções e exclusões frequentes, então as árvores Red Black devem ser preferidas. E se as inserções e exclusões são menos frequentes e a pesquisa é a operação mais frequente, então a árvore AVL deve ser preferida em vez da árvore Red Black. --Fonte GEEKSFORGEEKS.ORG
fonte
you need need atleast log2(log2(n))...(height->log2(n)) bits to store the height of [an AVL] tree
Eu não preciso da altura de qualquer nó em uma árvore AVL para implementá-lo. Você precisa de um bit de informação extra para cada nó ( EU SOU O MAIOR (o irmão com a subárvore mais alta))); é mais conveniente, bem como convencional, ter dois bits extras (a criança é mais alta para a esquerda e a direita), conforme apresentado por AV & L.O reequilíbrio da árvore AVL deve atender à propriedade abaixo. (Referência Wiki - Árvore AVL )
Portanto, isso implica que a altura geral da árvore AVL não pode enlouquecer, ou seja, as pesquisas serão melhores com Árvores AVL. E uma vez que operações adicionais (rotações) devem ser feitas para não deixar a altura enlouquecer, as operações de modificação da árvore podem ser um pouco caras.
fonte