terça-feira, 17 de julho de 2018

Grupo B - Árvores Rubro-Negras - Aula Invertida

Grupo 6 – Marcelo Carvalho, Filipe Nascimento Almeida, Marcel Reinan, João Manoel Fidelis Santos:

1.
 Qual a relação entre as arvores AVL e as arvores rubro-negras?

 Ambas são um tipo de árvore binária balanceada, a diferença é que a árvore AVL usa a altura de suas sub-árvores, e a árvore rubro-negra utiliza um esquema de coloração de nós para manter o balanceamento da árvore.
2. Escreva a declaracao do registro, em C, para composicao de arvores rubro-negras?

struct no{
            int info;
            struct no *esq;
            struct no *dir;
 int cor;
};


Grupo 7 – Iury Patrick Góis Santos, Letícia Aragão de Freitas, Thiago Santos França, Vitor Neves Varjão:

3. Qual o custo das operações sobre arvores rubro-negras? (a) em inserções (b) em remoções (c) em consulta especifica (d) em consulta total.

O custo de todas as operações são Log(n), exceto a consulta total que é linear o(n)


4. Que 
critério usar para decidir se aplicar AVL ou rubro-negra numa aplicação? Justifique.

Se o objetivo for armazenamento de dados usa-se rubro negra, se for busca, usa-se AVL.

Grupo 8 – Glenio Andrade, Cristiano Lima, João Victor Andrade Rodrigues, Brenda Martins Barros de Almeida. 

5. Por que usar ponteiro para ponteiro para manter a raiz da arvore rubro-negra? Justifique.



O uso de um ponteiro para ponteiro é para o caso em que a raiz necessitar ser alterada, como nos processos de rebalanceamento.


6. Qual a definição de arvore rubro-negra?


É uma árvore binária de busca que contém um bit adicional em sua estrutura, o que indica a cor.

As propriedades são:


  • Todo nó da árvore é vermelho ou preto;
  • A raiz é preta;
  • Toda folha (nil) é preta;
  • Se um nó é vermelho, então ambos os filhos são pretos;
  • Para todo nó, todos os caminhos do nó até as folhas descendentes contêm o mesmo número de nós pretos.

Grupo 9 – Mateus Cardoso da Silva, Natanael Oliveira Gois, Osni Mario Vieira Araujo:

7. Na implementação de arvore rubro-negra, por que definir a cor das folhas (null), ou seja, apontadores aterrados.

Devido a todo nó folha (null) ser preto, sendo esta terceira propriedade da árvore rubro negra que satisfaz e todos os caminhos a partir da raiz até qualquer folha passa pelo mesmo número de nós pretos.


8. A melhor forma de se implementar o campo cor na implementação dos nos de composição de arvores rubro-negras e por meio do tipo boolean? Justifique.

Sim, pois a função de mudança de cor trabalha com inversões constantemente, com uso de um tipo boolean esta operação de inversão torna-se bem mais fácil.



Grupo 10 – Carlos Gabriel Santos de Melo, Wendel Lima Oliveira, Dayvid Wesley Lopes dos Santos, 
Lucas Santana de Oliveira.

9. Apresentar a construção da arvore rubro-negra composta pelos itens 13 – 23 – 35 – 43 – 52 – 63 – 99.

Insere o nó 13 que é a raiz. Insere nó 23 a direita da raiz. Insere nó 35 a direita do nó 13.








10. A arvore dada eh rubro-negra? Justifique sua resposta.
Não pois o nó s, filho esquerdo da raiz é preto, mas deveria ser vermelho. 

CORREÇÃO:
1. Questão 1 - Correta e completa.
2. Questão 2 - Correta e completa.
3. Questão 3 - Contém erro. Apresentou a notação de forma incorreta (usou Log(n) quando deveria ser O(log n)), mas considerando como um erro ao digitar, a resposta foi correta.
4. Questão 4 - Correta mas poderia ser mais detalhada. Poderia ter explicado o porque da Rubro negra ser mais eficiente em inserção/remoção e a AVL mais eficiente em consultas.
5. Questão 5 - Correta mas poderia ser mais detalhada. Poderia ter dito o porque usar o ponteiro para ponteiro para essa alteração da raiz.
6. Questão 6 - Correta e completa.
7. Questão 7 - incorreta. A resposta foi confusa e usou um dos critérios para justificar a folha (null) ser preta, mas a árvore pode ser abstraída de forma a desconsiderar os ponteiros aterrados e sendo assim a resposta não justifica o motivo.
8. Questão 8 - Correta e completa. Considerando uma linguagem que tenha o tipo booleano.
9. Questão 9 - Incorreta. Já na raiz quebra o critério que diz que "para todo nó, todos os caminhos do nó até as folhas descendentes contêm o mesmo número de nós pretos".

10. Questão 10 - Incorreta. Tornando o filho esquerdo da raiz um nó vermelho (como sugerido) o critério de que todo caminho de um nó até uma folha deve ter o mesmo número de nós pretos, seria quebrado.


12 comentários:

  1. Já que não serão realizadas operações aritméticas com a cor há economia de tamanho caso o tipo usado para este dado seja char, em vez de int.

    ResponderExcluir
  2. A aplicação do tipo boolean em C é basicamente duas opções de int "0" ou "1" sendo assim, acredito que haja pouca diferença se dermos algum define para limitar as cores em vermelho caso 1 e preto caso 0, mas como Reinaldo comentou, o tipo char se mostra a melhor opção caso não ajam operações aritméticas com a cor.

    ResponderExcluir
  3. Achei a árvore rubro-negra uma estrutura melhor de se trabalhar no quesito complexidade, na AVL a todo momento
    o programador tem que se preocupar com cálculo de balanços por nó e balanço geral da árvore, já na rubro-negra aparenta ser
    algo mais direto com a atribuição das cores vermelho e preto.

    ResponderExcluir
  4. Sobre a questão 8:
    De fato, como já comentado, em C não existe um tipo primitivo boolean. Mas levando em conta que na questão 8 nenhuma linguagem específica é citada, creio que a maior vantagem de se usar boolean não está nas inversões, mas sim no espaço utilizado, uma vez que um boolean ocupa apenas 1 bit.

    ResponderExcluir
  5. Realmente parece ser mais simples de se trabalhar do que as árvores AVL. Mostra-se uma boa alternativa para situações em que a prioridade é o armazenamento de dados. O fato de fazermos no máximo 3 rotações para balancear a árvore é uma vantagem.

    ResponderExcluir
    Respostas
    1. Apesar dessa maior facilidade em haver a rotação, também é preciso se atentar ao fato de que pode ser necessário mudar a cor dos nós durante o processo para manter a árvore dentro das propriedades (pode acontecer, por exemplo, de numa rotação o nó vermelho ficar com um filho também vermelho, tendo assim que mudar suas cores)

      Excluir
  6. É interessante ressaltar que apesar de possuir bons "pior-caso", as implementações e a compreensão de como funciona uma árvore rubro-loira não são tarefas triviais.
    Pensando nisso, existe uma variante desta árvore que é a "árvore rubro-negra caída para esquerda". Esta variante possui as mesmas complexidades e obedece as mesmas regras da árvore rubro-negra padrão, com a regra adicional de que todo nó vermelho é sempre filho esquerdo de seu pai. Esse aspecto desta árvore torna a implementação das funções de remoção e inserção mais fácil.

    ResponderExcluir
  7. A altura máxima da arvore é dada pela operação:
    Hmax= máximo de nós pretos + máximo de nós vermelhos
    =Log2 (n+1)+ Log2 (n+1)
    = 2 Log2 (n+1)
    O que mostra que a altura máxima é Olog(n) em que n é o número total de nós.(Obs: n é determinado pela operação n=2^(k+1)-1 sendo (k+1) a profundidade do nó da árvore que se trata do número de ancestrais do nó pai que o nó possui).

    ResponderExcluir
  8. A arvore AVL por serem "mais equilibradas" podemos afirma que ela é mais rápida para busca , já arvore rubro-negra é mais rápida para inserção e remoção por que precisaria fazer no máximo 3 rotações , enquanto a AVL faria O(Log n).

    ResponderExcluir
  9. Este comentário foi removido pelo autor.

    ResponderExcluir
  10. Em relação as propriedades descritas na questão 6, podemos perceber por que elas garantem que a árvore seja balanceada, basta observar que nenhum caminho pode ter dois nós vermelhos sucessivos, devido à propriedade 4. O caminho mais curto possível tem todos os nós pretos, e o caminho mais longo possível alterna entre nós vermelhos e pretos. Desde que todos os caminhos máximos tenham o mesmo número de nós pretos, pela propriedade 5, isto mostra que nenhum caminho é mais do que duas vezes mais longo que qualquer outro caminho.

    ResponderExcluir
  11. Além dos ponteiros tornarem menos complexos os processos de balanceamento, eles permitem que a árvore, independente de ser rubro negra ou AVL não tenham limite teórico de tamanho, o que torna, principalmente a rubro negra, ideal para inserções, uma boa estrutura de dados.

    ResponderExcluir