Grupo
1: Helisson Oliveira
João Rolemberg
Lucas Wagner
1- árvores rubro-negras também são arvores binárias
balanceadas, onde a principal diferença é a utilização de um sistema de cores
preto e vermelho para o balanceamento. Elas também utilizam rotações para
corrigir o balanço dos seus nós.
2- struct NO{
int
valor;
struct
NO *esquerdo;
struct
NO *direito;
int
cor;
};
Grupo
2: Edilson Leite (líder)
Micael Jordy
Rodrigo dos Santos
Micael Jordy
Rodrigo dos Santos
3- o custo das operações na arvore Rubro-negra é
semelhante à arvore AVL: O(n) pra busca total e O(log n) pra inserção, remoção
e busca especifica.
4- a escolha do tipo de arvore a ser usada depende da
função a ser executada; enquanto a arvore Rubro-negra tem maior eficiência em
guardar Uma grande quantidade de dados, a AVL e mais útil para leitura de dados
Grupo 3: Gabriel Thiago (Líder)
Reinaldo Lima
Wesley Alves
Jeremias dos Santos
5-
O uso de ponteiro para ponteiro na raiz da árvore rubro-negra, permite, caso
seja necessária alguma operação na árvore, como uma rotação, a alteração do nó
da raiz com uma maior facilidade.
6-
Uma árvore rubro-negra é uma árvore binária, de busca e balanceada em que cada
nó é constituído dos seguintes campos:
·
Cor: vermelho ou preto;
·
Dado: valor armazenado;
·
Esquerda, direita: ponteiros que apontam
para a subárvore esquerda e direita, respectivamente;
·
Pai: ponteiro para o nó pai.
Porém, há algumas
propriedades adicionais:
·
O campo pai da raiz aponta para nil;
·
Todo nó da árvore é vermelho ou é preto;
·
A raiz é preta;
·
Toda folha é preta;
·
Se um nó é vermelho, então ambos os filhos
serã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
4- Arthur Matheus
José Vitor
Wesley Brasil
7- Porque há uma propriedade em árvore rubro
– negra em que nós vermelhos só podem ter filhos pretos, no entanto nós pretos
podem possuir filhos pretos e vermelhos. E com base nessa propriedade, os nós
nulos devem possuir a cor preta, para que possam ter filhos pretos e vermelhos.
8- Sim, porque seria menos complicado de se trabalhar com 1 bit do que um char ou
string, e o uso de 1 bit como booleano economizaria espaço na memória.
Grupo 5- Gabriel Carvalho
Erick
Sousa
9-
10-
Não, pois o filho esquerdo (5) da raiz (8) deveria ser
vermelho, mas não é.
CORREÇÃO
1. Questão 1 - Correta e completa.
2. Questão 2 - Correta e completa.
3. Questão 3 - Correta e completa.
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 e completa.
6. Questão 6 - Correta e completa. Colocou o ponteiro para o nó pai na definição, que não é obrigatório na implementação, mas não a torna errada.
7. Questão 7 - Incorreta. Pareceu entender o motivo de dar cor para as folhas (null) mas não soube como dizer. Se atrapalhou ao escrever que "os nós nulos devem possuir a cor preta, para que possam ter filhos pretos e vermelhos", mas creio que o motivo seja para que o pai sempre tenha dois filhos (no caso o null esquerdo e o null direito) e a cor deve ser preta para que o pai possa ser um nó vermelho se necessário.
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.
Este comentário foi removido pelo autor.
ResponderExcluirQuando um nó não possui um filho (esquerdo ou direito), ao invés de apontar para nil, ele aponta para um nó fictício, que será uma folha da árvore. Assim, todos os nós internos contêm valores e todas as folhas são nós fictícios. Para economizar espaço, todos os ponteiros nil podem apontar para uma única folha, chamada nó sentinela, que impedirá a representação de todas as folhas separadamente.
ResponderExcluirEste comentário foi removido pelo autor.
ResponderExcluirEste comentário foi removido pelo autor.
ResponderExcluirOs nós vermelhos não podem ter filhos vermelhos porque a maior distância entre a raiz e uma folha não pode ser maior que o dobro da menor distância entre a raiz e uma folha.
ResponderExcluirNa questão 10, qual a explicação para que o nó 5 seja terminantemente de cor vermelha?
ResponderExcluirUm fato interessante sobre as árvores rubro-negras, é que para n nós que a árvore possuir, sua altura será O(log n).
ResponderExcluirReferente a questão 3. Podemos fazer busca, inserção e exclusão com custo de tempo de execução O(log n).
ResponderExcluirNa questão 7 podemos adicionar: que pode ser usado apenas um nó folha ( nil ) para representar todas as folhas que haveriam na árvore, neste caso todas as referências dos nós internos para as folhas que haveriam ali será para o mesmo nó folha, o único.
ResponderExcluirComo foi dito no trabalho tanto as árvores rubro-negra quanto as AVL's possuem mesmo custo em suas operações. Porém, complementando, as AVL's são melhores para busca, porque elas são um pouco mais balanceadas do que as rubro-negras. No entanto, quando se trata de inclusão e remoção na rubro-negra isso é resolvido com apenas três rotações na árvore. Daí o motivo da AVL ser melhor na busca e a rubro-negra melhor na inserção e remoção.
ResponderExcluirUma maneira interessante de construir uma árvore AVL sem ter que reorganizar seus nos a cada insercai seria, caso todos as chaves a serem inseridas estejam disponíveis e em ordem crescente, seria inserir os nos num processo semelhante ao de uma busca binária, onde começamos pelo elemento do meio, depois adicionamos o do meio da metade pro começo, e depois da metade pro final, repetindo o processo até terminar a árvore. Isso faz sentido porque, em uma busca binária, o vetor pode ser visto como uma árvore, onde sua raiz é o elemento do meio(n/2 para um vetor de tamanho n), seu filho esquerdo seria o elemento na posição n/4, e seu filho esquerdo o elemento
ResponderExcluirn-n/4. Repetindo esse processo para as subarvores temos uma AVL.
É possível armazenar uma árvore rubro-negra em arquivo? E se for, é mais viável fazer isso ou apenas salvar em arquivo seus itens em ordem crescente/decrescente?
ResponderExcluirComo a arvore AVL, a arvore rubro-negra é também um tipo de arvore binária balanceada. A professora mencionou no slides de AVL, pagina 36, um exemplo de uma busca numa agenda assim: "Podem ser aplicadas, por exemplo, para otimizar o processo de consulta aos dados de uma agenda de contatos. Os dados são mantidos em arquivo e, durante a execução, são armazenados em árvore binária de pesquisa, chave de busca e endereço de cada contato. Terminado a execução, os dados são atualizados em arquivo. Assim aproveitasse o melhor das duas memórias: a capacidade de armazenamento da secundária e a velocidade de processamento da primária."... Não sei se lhe ajudou Carlos.
ExcluirNa questão nove como seria a implementação da árvore?
ResponderExcluirCitando uma mudança em relação à árvore AVL, a altura. Na árvore AVL media-se a maior distância da raiz até a folha, já na árvore rubro-negra possui dois modos. 1: pode medir a maior distância a partir da raiz até a folha, sendo apenas os nós pretos, mas sem contar o NIL. 2: medir a maior distância até o NIL, mas sem a raiz, sendo apenas os nós pretos.
Árvores rubro-negras são usadas para garantir uma complexidade O (log N) para inserção, exclusão, pesquisa e outras operações importantes.
ResponderExcluirPara realmente entender a importância deste tipo de estrutura, imagine que você tem 1 milhão itens, 1 milhão para esta estrutura é igual a 19, que é um número muito, muito pequeno quando comparado com o nosso número de itens que 1 milhão é. Isso significa que você pode inserir, excluir ou pesquisar qualquer um dos elementos por meras 19 comparações
Árvores Rubro-Negras são comumente encontradas no Kernel Linux e são muito eficientes em controlar os segmentos de memória virtual de um processo.
As Árvores rubro-negras, através de suas ferramentas e propriedades, como por exemplo o sistema de diferenciamento de cores, que torna também a interpretação e criação da lógica de um sistema mais fácil e prático, demonstram um grande apoio aos programadores na criação e desenvolvimento tanto de algoritmos simples, como também de alguns mais complexos.
ResponderExcluirAo considerar o pior caso, a altura de uma árvore binária de busca pode ser O(n). Já em um caso médio, a altura será O(log n). Todas as árvores deste tipo buscam os dados
ResponderExcluirarmazenados na memória principal (RAM). Isso se aplica a arvores do tipo Rubro-negras, já que elas são árvores de busca binária com algumas mais características ditas no post.
Em relação a questão 3 , o resultado imediato de uma inserção ou remoção pode violar as propriedades de uma árvore rubro-negra. Restaurar as propriedades rubro-negras requer um pequeno número (O(log n) ou O(1)) de modificações de cores (que na prática são muito rápidas) e não mais do que três rotações de árvore (duas para a inserção).Nas operações de inserção e remoção seus tempos permanecem O(log n).
ResponderExcluirJá na questão 6 , outra definição de árvore rubro negra pode ser citada como um tipo de árvore binária de busca balanceada, uma estrutura de dados usada em ciência da computação, tipicamente para implementar vetores associativos.
ResponderExcluirSobre a questao 4, isso se justifica, pois pela arvore AVL ter um balanceamento mais rígido que a rubro-negra, sua operaçao de busca torna-se mais rapida enquanto as operaçoes de inserçao e exclusão tem seu custo aumentado.
ResponderExcluirAo meu ver, as AVL sao mais simples a nível de implementação, por um menor número de propriedades, além de serem mais balanceadas, cabe só decidir se as vantagens da rubro negra, inclusão e remoção, não irar valer mais na situação.
ResponderExcluirEste comentário foi removido pelo autor.
ResponderExcluirComplementado sobre nós (NULL) folhas da arvore rubro-negra, como todo nó folha termina com dois ponteiros para NULL, eles podem ser ignorados na representação da árvore, para fins didáticos.(BACKES, Andre Ricardo. Estruturas de dados descomplicada: em linguagem C. 1.ª edição. Rio de Janeiro: Elsevier, 2016. Cap. 11, p. 386.)
ResponderExcluirHá autores que relatam também que nas árvores rubro-negras, os nós folhas não são relevantes e não contém dados. Estas folhas não precisam ser mantidas em memória de computador - basta apenas um ponteiro para nulo para identificá-las, mas algumas operações em árvores rubro-negras são simplificadas se os nós folha forem explicitados. Para economizar memória, algumas vezes um nó sentinela interpreta o papel de todos os nós folha; todas as referências dos nós internos para os nós folha apontam para o nó sentinela. (WIKIPEDIA. Disponível e acesso em: 15 de junho de 2018.)
Com relação a questão 4, é melhor usar uma arvore AVL se sua aplicação realiza de forma intensa a operação de busca, e se adota uma arvore rubro-negra se a operação mais usada for a inserção ou a remoção.
ResponderExcluirApesar de um AVL ser prática em questão de busca, não se pode valer o mesmo em questão de remoção de um elemento já que pode requerer a execução de muitas operações de reestruturação (rotações). Diferente das AVLs, as Arvores Rubro Negras não apresenta esses problemas pois exige que sejam permitidas somente alterações estruturais O(1) após uma atualização, visando manter o balanceamento.
ResponderExcluirConsiderando o que foi descrito na questão 4, podemos concluir que uma ótima aplicação para a árvore rubro-negra seria um programa que realizasse vários registros e poucas consultas, já uma AVL seria ideal para um sistema que já possui muito dados e recebe muitas solicitações de consulta, como por exemplo um sistema de leitor de código de barras de um supermercado, onde varias pessoas podem consultar os preços dos produtos em diferentes pontos do mercado.
ResponderExcluirComparação com a árvore de AVL
ResponderExcluirAs árvores AVL são mais equilibradas em comparação com as árvores de rubro-negras, mas podem causar mais rotações durante a inserção e supressão. Assim se sua aplicação envolve muitas inserções e exclusões frequentes, a seguir as árvores rubro-negras devem ser preferidas. E se as inserções e as exclusões são menos frequentes e a busca é uma operação mais frequente, a seguir a árvore de AVL deve ser preferida sobre a árvore rubro-negras.
Este comentário foi removido pelo autor.
ResponderExcluirBom trabalho, só gostaria de acrescentar uma coisa. Existe também as árvores BST, uma BST rubro-negra é uma BST cujos links são negros e rubros e têm as seguintes propriedades:
ResponderExcluirlinks rubros se inclinam para a esquerda;
nenhum nó incide em dois links rubros;
balanceamento negro perfeito: todo caminho da raiz até um link null tem o mesmo número de links negros. (mandei errado antes, não disse o nome e não conseguia apagar)