– Aula 20 Adaptado por Reinaldo Fortes para o curso de

Slides:



Advertisements
Apresentações semelhantes
LISTAS Dilvan Moreira, parcialmente baseado em material do prof. Ricardo Campello.
Advertisements

Aula T10 – BCC202 Listas – Parte 2 Túlio Toffolo www. decom. ufop
Marco Antonio Montebello Júnior
Listas Lineares Estrutura que permite representar um conjunto de dados de forma a preservar a relação de ordem linear. Uma lista linear é composta de nós,
Estruturas de Dados Árvores Binárias
Listas encadeadas Prof. Rosana Palazon.
Estruturas de Dados Arvores
Listas duplamente encadeadas
Árvores Equilibradas Sumário Splay B-tree Vermelho-Preto AA e BB
Organização e Recuperação da Informação
Árvore Binária - altura máxima A: Inserção de 1, 2, 3, 4, 5, 6 e 7 Pior caso: O(n)
Árvores.

David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Estruturas de Dados I DECOM – UFOP
Pesquisa em Memória Primária
Pesquisa em Árvores Digitais
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Pesquisa em Memória Primária – Árvores AVL
David Menotti Estruturas de Dados I DECOM – UFOP
Pesquisa em Memória Primária – Árvores de Busca
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Pesquisa em Memória Primária – Árvores de Busca
Pesquisa em Memória Primária
David Menotti Estruturas de Dados I DECOM – UFOP
Árvores Introdução e Aplicações Árvores de Busca Binária Fundamentos
Árvores AVL.
Árvores Balanceadas (AVL)
Estruturas de Dados I Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Pesquisa em Memória Primária
Listas com Ponteiros Listas encadeadas Listas circulares.
Árvore Binária & AVL Equipe: Felipe Pontes Gustavo Márcio
Robson Godoi / Sandra Siebra
Listas Encadeadas.
Árvores Equilibradas Sumário Splay B-tree Vermelho-Preto AA e BB
ALGORITMOS E ESTRUTURAS DE DADOS
Listas Encadeadas Raquel O. Prates, Luiz Chaimowicz, Jussara Almeida
Pesquisa em memória primária: hashing
Pesquisa em Memória Primária
Árvores binárias de pesquisa com balanceamento
Árvores Binárias de Pesquisa
Algorítmos e estrutura de dados III
Algorítmos e estrutura de dados III Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Algoritmos e Estrutura de Dados III
Árvores Balanceadas Liliane Rose Benning Salgado.
Listas de Prioridades Em muitas aplicações, dados de uma coleção são acessados por ordem de prioridade A prioridade associada a um dado pode ser qualquer.
© Copyright 2007 Algoritmos e Estruturas de Dados - Todos os direitos reservados Átila Valgueiro Malta Moreira Juliana Medeiros de Lucena Rafael Alberto.
Árvore Binária de Busca
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática Disciplina: Estrutura de Dados Professor: Cheli dos S. Mendes da Costa Listas.
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Tabelas Hash Prof. Túlio Toffolo
Árvores Binárias Profa. Patrícia A. Jaques Luiz Gonzaga Jr
Estruturas de Dados Aula 15: Árvores
Aula 06 – 05/04 Árvores binárias.
Árvores Vermelho-Preto
Prof. Hilton Cardoso Marins Junior ÁRVORES BINÁRIAS.
Árvores AVL Balanceadas (Árvore Binária Balanceada)
© 2011 Pearson Prentice Hall. Todos os direitos reservados.slide 1 © 2011 Pearson Prentice Hall. Todos os direitos reservados.slide 1 © 2011 Pearson Prentice.
PROCESSAMENTO DIGITAL DE IMAGENS
Universidade do Vale do Rio dos Sinos - São Leopoldo -
Prof. Hilton Cardoso Marins Junior
Árvores Rubro-Negras São árvores balanceadas segundo um critério ligeiramente diferente do usado em árvores AVL A todos os nós é associada uma cor que.
Árvores AVL Algoritmos e Estruturas de Dados - IF672
AVL Árvores Equilibradas Sumário AVL Splay B Vermelho-Preto AA e BB Multidimensionais quaternárias k-d [Pesquisa Lexicográfica tries multivia tries binárias.
Introdução a Árvores e Árvores Binárias
Árvores Balanceadas (AVL)
Árvores e Árvores Binárias
BANCO DE DADOS II Árvore de Dados. FATEC - GUARATINGUETÁ Professor: Eduardo Barbosa Adiel Lemos Ana Renata Bruno Michael Jéssica Fernanda Layla Monique.
UNIVERSIDADE FEDERAL DE MINAS GERAIS Árvores Cristiano Arbex Valle Vinicius Fernandes dos Santos
Transcrição da apresentação:

2014-01 – Aula 20 Adaptado por Reinaldo Fortes para o curso de 2014-01 Arquivo original: 22._arvores_(parte_2) Árvores de Pesquisa (Parte II) Prof. Túlio Toffolo http://www.toffolo.com.br BCC202 – Aula 24 Algoritmos e Estruturas de Dados I

Pesquisa em Memória Primária Introdução - Conceitos Básicos Pesquisa Sequencial Pesquisa Binária Árvores de Pesquisa Árvores Binárias de Pesquisa Árvores AVL Transformação de Chave (Hashing)‏ Listas Encadeadas Endereçamento Aberto Hashing Perfeito

Árvores Binárias de Pesquisa Inserindo os nós 30, 20, 40, 10, 25, 35 e 50 nesta ordem, teremos: 30 40 20 25 10 35 50

Árvores Binárias de Pesquisa Inserindo os nós 10, 20, 30, 40 e 50 nesta ordem, teremos: 10 20 30 40 50

Árvores Binárias Balanceadas Existem ordens de inserção de nós que conservam o balanceamento de uma árvore binária. Na prática é impossível prever essa ordem ou até alterá-la.

Árvores Binárias Balanceadas A vantagem de uma árvore balanceada com relação a uma degenerada está em sua eficiência. Por exemplo: numa árvore binária degenerada de 10.000 nós são necessárias, em média, 5.000 comparações (semelhança com arrays ordenados e listas encadeadas). Numa árvore balanceada com o mesmo número de nós essa média reduz-se a 14 comparações.

ÁRVORE AVL PROGRAMAÇÃO DE TRIPULAÇÕES

* Os números próximos aos nós são suas alturas. Árvore AVL Árvore binária de busca tal que, para qualquer nó interno v, a diferença das alturas dos filhos de v é no máximo 1. Árvores AVL são balanceadas * Os números próximos aos nós são suas alturas.

AVL Algoritmo de balanceamento de árvores binárias. A origem da denominação AVL vem dos seus dois criadores: Adel’son-Vel’skii e Landis. Ano de divulgação: 1962.

TAD-Árvore AVL Estrutura de dados: typedef long TipoChave; Red-Black Trees 4/11/2017 10:09 PM TAD-Árvore AVL Estrutura de dados: typedef long TipoChave; typedef struct { TipoChave Chave; /* outros componentes */ } TItem; typedef struct No { TItem item; struct No *pEsq, *pDir; } TNo; typedef TNo *TArvoreAVL;

Árvores AVL Uma árvore binária balanceada é aquela na qual, para cada nó, as alturas de suas sub-árvores esquerda e direita se diferem de, no máximo, 1. Fator de balanceamento (FB) de um nó é a diferença entre a altura da sub-árvore esquerda em relação à sub-árvore direita. FB(p) = altura(sub-árvore esquerda de p) - altura(sub-árvore direita de p) Em uma árvore binária balanceada todos os FB de todos os nós estão no intervalo -1  FB  1

FB e Altura int Altura(TNo* pRaiz) { int FB (TNo* pRaiz) { int iEsq,iDir; if (pRaiz == NULL) return 0; iEsq = Altura(pRaiz->pEsq); iDir = Altura(pRaiz->pDir); if ( iEsq > iDir ) return iEsq + 1; else return iDir + 1; } int FB (TNo* pRaiz) { if (pRaiz == NULL) return 0; return Altura(pRaiz->pEsq) - Altura(pRaiz->pDir); }

AVL Inicialmente inserimos um novo nó na árvore normalmente. A inserção deste nó pode degenerar a árvore. A restauração do balanceamento é feita através de rotações na árvore no nó “pivô”. Nó “pivô” é aquele que, após a inserção, possui Fator de Balanceamento fora do intervalo.

AVL Primeiro caso: (rotação simples para a direita): FB > 1 (subárvore esquerda maior que subárvore direita). E a subárvore esquerda desta subárvore esquerda é maior que a subárvore direita dela. Então: realizar uma rotação simples para a direita. 3 2 1

AVL Primeiro caso: (rotação simples para a direita) 3 2 1 2 1 3

AVL Segundo caso: (rotação simples para a esquerda) FB < -1 (subárvore esquerda menor que subárvore direita). E a subárvore direita desta subárvore direita é maior que a subárvore esquerda dela. Então: realizar uma rotação simples para a esquerda. 1 2 3

AVL Segundo caso: (rotação simples para a esquerda) 1 2 3 2 1 3

AVL Terceiro caso: (rotação dupla para a direita) FB > 1 (subárvore esquerda maior que subárvore direita) E a subárvore esquerda desta subárvore esquerda é menor ou igual que a subárvore direita dela Então: realizar uma rotação dupla para a direita. 1 3 2

AVL Terceiro caso: (rotação dupla para a direita) 3 2 1 1 3 2 2 1 3

AVL Quarto caso: (rotação dupla para a esquerda) FB < -1 (subárvore esquerda menor que subárvore direita) E a subárvore direita desta subárvore direita é menor que a subárvore esquerda dela Então: realizar uma rotação dupla para a esquerda. 1 3 2

AVL Quarto caso: (rotação dupla para a esquerda) 1 3 2 1 2 3 2 1 3

Rotações Simples T Rotação Simples (esquerda) 1 3 2 Rotação Simples 1 3 2 Rotação Simples (esquerda) T 3 2 1 Rotação Simples (direita)

Rotações Simples T 1 3 2 T void RSE(TNo** ppRaiz) { TNo *pAux; pAux = (*ppRaiz)->pDir; (*ppRaiz)->pDir = pAux->pEsq; pAux->pEsq = (*ppRaiz); (*ppRaiz) = pAux; } void RSD(TNo** ppRaiz) { pAux = (*ppRaiz)->pEsq; (*ppRaiz)->pEsq = pAux->pDir; pAux->pDir = (*ppRaiz); T 1 3 2 T 3 2 1

Rotações Duplas (esquerda) a c b T Rotação Dupla (direita) 2 3 1 Rotação Dupla (direita) c b a T 2 1 3

Rotações Duplas (esquerda) a c b T Rotação Dupla 2 3 1 int BalancaEsquerda(TNo** ppRaiz) { int fbe = FB ( (*ppRaiz)->pEsq ); if ( fbe > 0 ) { RSD(ppRaiz); return 1; } else if (fbe < 0 ) { /* Rotação Dupla Direita */ RSE( &((*ppRaiz)->pEsq) ); RSD( ppRaiz ); /* &(*ppRaiz) */ } return 0; int BalancaDireita(TNo** ppRaiz) { int fbd = FB( (*ppRaiz)->pDir); if ( fbd < 0 ) { RSE (ppRaiz); return 1; } else if (fbd > 0 ) { /* Rotação Dupla Esquerda */ RSD( &((*ppRaiz)->pDir) ); RSE( ppRaiz ); /* &(*ppRaiz) */ } return 0; Rotação Dupla (esquerda) a b c T 2 3 1

Rotações Duplas Rotação Dupla (direita) c a b T int BalancaEsquerda(TNo** ppRaiz) { int fbe = FB ( (*ppRaiz)->pEsq ); if ( fbe > 0 ) { RSD(ppRaiz); return 1; } else if (fbe < 0 ) { /* Rotação Dupla Direita */ RSE( &((*ppRaiz)->pEsq) ); RSD( ppRaiz ); /* &(*ppRaiz) */ } return 0; int BalancaDireita(TNo** ppRaiz) { int fbd = FB( (*ppRaiz)->pDir); if ( fbd < 0 ) { RSE (ppRaiz); return 1; } else if (fbd > 0 ) { /* Rotação Dupla Esquerda */ RSD( &((*ppRaiz)->pDir) ); RSE( ppRaiz ); /* &(*ppRaiz) */ } return 0; Rotação Dupla (direita) c b a T 2 1 3

Balanceamento int Balanceamento(TNo** ppRaiz) { int fb = FB(*ppRaiz); if ( fb > 1) return BalancaEsquerda(ppRaiz); else if (fb < -1 ) return BalancaDireita(ppRaiz); else return 0; }

Inserção em uma Árvore AVL Inserção como em uma árvore binária de pesquisa Sempre feita expandindo um nó externo. Exemplo: Inserção do 54 44 17 78 32 50 88 48 62 44 17 78 32 50 88 48 62 54 c=z a=y b=x w antes da inserção depois da inserção

Reestruturação Trinodo x, y, z (filho, pai e avô) renomeados como a,b,c (percurso interfixado) rotações levam b para o topo caso 2: rotação dupla à esquerda (rotação simples à direita seguida de rotação simples à esquerda) (os outros dois casos são simétricos) c=y b=x a=z T0 T1 T2 T3 b=y a=z c=x T0 T1 T2 T3 b=y a=z c=x T0 T1 T2 T3 b=x c=y a=z T0 T1 T2 T3 caso 1: rotação simples à esquerda (em torno de a)

Exemplo de inserção (cont.) 88 44 17 78 32 50 48 62 2 5 1 3 4 54 T x y z desbalanceado 4 T 1 44 x 2 3 17 62 y z 1 2 2 32 50 78 1 1 1 balanceado 48 54 88 T 2 T T 1 T 3

Inserção else if ( (*ppRaiz)->item.chave < x->chave ) { int Insere(TNo** ppRaiz, Titem * x) { if (*ppRaiz == NULL) *ppRaiz = (TNo*)malloc(sizeof(TNo)); (*ppRaiz)->item = *x; (*ppRaiz)->pEsq = NULL; (*ppRaiz)->pDir = NULL; return 1; } else if ( (*ppRaiz)->item.chave > x->chave ) if ( Insere(&(*ppRaiz)->pEsq,x) ) if (Balanceamento(ppRaiz)) return 0; else else if ( (*ppRaiz)->item.chave < x->chave ) { if ( Insere(&(*ppRaiz)->pDir,x) ) if (Balanceamento(ppRaiz)) return 0; else return 1; } return 0; /* valor jah presente */

Remoção em uma árvore AVL Remoção começa como em uma árvore binária de busca  pode causar desbalanceamento Exemplo: Remoção do 32 44 17 78 32 50 88 48 62 54 44 17 62 50 78 48 54 88 Antes da remoção Depois da remoção

Rebalanceamento após uma remoção Seja z o primeiro nó desbalanceado encontrado acima de w. Seja y o filho de z com maior altura, e x o filho de y com maior altura. Executar a função Balanceamento para rebalancear z. Pode ocorrer desbalanceamento de outro nó acima  continuar verificação de balanceamento até à raiz. 62 a=z 44 44 78 w 17 62 b=y 17 50 88 50 78 c=x 48 54 48 54 88

Remoção int Remove (TNo** ppRaiz, TItem* pX) { if (*ppRaiz == NULL) return 0; else if ( (*ppRaiz)->item.chave == pX->chave) { *pX = (*ppRaiz)->item; Antecessor(ppRaiz, &((*ppRaiz)->pEsq)); /* registro mais à direita na subárvore esquerda */ Balanceamento(ppRaiz); return 1; } else if ( (*ppRaiz)->item.chave > pX->chave ) { if (Remove((*ppRaiz)->pEsq, pX)) { } else return 0; } else { if (Remove((*ppRaiz)->pDir, pX)) { }

ÁRVORE AVL ANÁLISE PROGRAMAÇÃO DE TRIPULAÇÕES

Complexidade de Tempo para árvores AVL uma única reestruturação é O(1) usando uma árvore binária implementada com estrutura ligada pesquisa é O(log n) altura de árvore é O(log n), não necesita reestruturação inserir é O(log n) busca inicial é O(log n) reestruturação para manter balanceamento é O(log n) remove é O(log n)

Verifica se uma árvore é AVL int EhArvoreArvl(TNo* pRaiz) { int fb; if (pRaiz == NULL) return 1; if (!EhArvoreArvl(pRaiz->pEsq)) return 0; if (!EhArvoreArvl(pRaiz->pDir)) return 0; fb = FB (pRaiz); if ( ( fb > 1 ) || ( fb < -1) ) return 0; else return 1; }

ÁRVORE BINÁRIA DE PESQUISA APLICAÇÕES PROGRAMAÇÃO DE TRIPULAÇÕES

Aplicações Para que servem as Árvores Binárias? Exemplos de aplicações: Redes de Comunicação de Dados Envio de pacotes ordenados e/ou redundantes Codificação de Huffman Compressão e Descompressão de arquivos

1) Redes de Comunicação A maioria dos protocolos de comunicação fragmenta as mensagens em pacotes que são numerados e enviados através da rede Não há garantia da chegada em ordem dos pacotes Perdas de pacotes geram novos envios e estes podem causar duplicatas dos mesmos

Reconstrução da Mensagem Como reconstruir a mensagem corretamente? Descartar os pacotes repetidos Ordenar os pacotes Como implementar tal algoritmo? Utilizando Árvores Binárias

Exemplo: Problemas: ordens e redundância dos pacotes P2 P3 P1 R R P3 P1 Ok P2 ? A P2 B P3 Ok R P2 P2 P1 R R Ordem de Chegada: Confirmação de envio: P1 e P3. P3 P1 P2 Reenvio de P2. Problemas: ordens e redundância dos pacotes

Algoritmo O primeiro pacote é colocado na raiz da árvore. Cada pacote sucessivo é comparado com o da raiz Se for igual, descarta-se a réplica. Se for menor ou maior, percorre-se os lados esquerdo ou direito da árvore Sub-árvore vazia implica inserção do novo pacote Sub-árvore não vazia implica comparação dos pacotes com a mesma

Problemas resolvidos? Problema da ordenação Problema da redundância A ordenação dos pacotes pode ser feita trivialmente com apenas uma chamada ao método inOrder() da árvore binária Problema da redundância Solucionado com o algoritmo de inserção na árvore, visto que o pacote, antes de ser inserido, é comparado com os demais que já se encontram na árvore binária

2) Codificação de Huffman Algoritmo utilizado para comprimir arquivos Todo o algoritmo é baseado na criação de uma Árvore Binária Programas como Winzip e WinRAR utilizam este algoritmo Criado por David Huffman em 1952

Códigos e Caracteres Caracteres são letras, números e símbolos Códigos são sequências de bits que podem representar de maneira ÚNICA um caracter b bits para representar c caracteres: Exemplos: c = 2 b ASCII (7 bits) Extended ASCII (8 bits) 2 = 128 caracteres 7 2 = 256 caracteres 8

Como comprimir arquivos? No código ASCII, todos os caracteres têm um número fixo de bits Números variáveis de bits implica menor capacidade de armazenamento Associações com bits variáveis podem comprimir consideravelmente o arquivo Como comprimir arquivos desta maneira? Utilizando a Codificação de Huffman!

Exemplo: Considere o arquivo com o seguinte texto: AAAAAAAAAABBBBBBBBCCCCCCDDDDDEE Freqüências: A = 10; B = 8; C = 6; D = 5; E = 2 Construção da Árvore Binária Comparação do número de bits Tamanho Fixo (8 bits)  Total = 248 bits Tamanho Variável  Total = 69 bits

Compressão Depois da geração da árvore, o arquivo é percorrido novamente e cada caracter do arquivo é substituído pelo código binário contido na árvore, gerando uma cadeia de bits Criação da tabela de caracteres e códigos binários O que é armazenado? Cadeia de bits gerada Tabela de caracteres e códigos

Descompressão Regeneração da árvore binária através da tabela de caracteres e códigos A cadeia de bits é percorrida e, à medida que uma sub-cadeia é encontrada na tabela de caracteres e códigos, a mesma é substituída pelo caracter correspondente

Conclusões As árvores binárias são uma das estruturas de dados mais importantes devido a grande aplicabilidade das mesmas. A maioria dos algoritmos das árvores binárias são de simples entendimento, facilitando sobremaneira o desenvolvimento de sistemas.

Perguntas?

Exercício Mostre (desenhe) uma árvore AVL após a inserção dos seguintes elementos, em ordem: 10, 20, 5, 8, 12, 22, 23, 24, 11, 13, 18 Mostre como ficará a árvore acima após a remoção dos seguintes elementos, na ordem abaixo: 22, 11, 5, 10