Árvores Binárias de Busca

Documentos relacionados
Árvores Binárias de Busca

Introdução a AVL: teoria e prática. 22/11, 25/11 e 30/11

Árvores AVL (Balanceadas) Profª.Drª. Roseli Ap. Francelin Romero Fonte: Profa. Patrícia Marchetti Revisão: Gedson Faria

Árvores binárias de busca

Algoritmos e Estrutura de Dados II. Árvore AVL. Prof a Karina Oliveira. Fonte: Prof a Ana Eliza

Árvores binárias de busca

Estruturas de Dados com Jogos. Capítulo 9 Árvores Balanceadas

Árvores & Árvores Binárias

Algoritmos e Estruturas de Dados II Árvores - AVL. Prof. César Melo DCC/ICE/UFAM

Árvores Binárias de Busca

Árvores Binárias de Busca (ABB) 18/11

Árvores Binárias Balanceadas Estrutura de Dados I

ÁRVORE AVL. Problema do balanceamento

Árvores AVL e Árvores B. Jeane Melo

Árvores. Prof. César Melo ICOMP/UFAM

Árvores AVL. Nesta aula será apresentado o ADT árvore AVL que são árvores binárias de altura equilibrada. Algoritmos e Estruturas de Dados I

Estruturas de Dados. Aula 08. Árvores AVL II. Karina Mochetti

INF 1010 Estruturas de Dados Avançadas. Árvores binárias

Linguagem C: Árvores AVL

DAINF - Departamento de Informática

Estruturas de Dados. Árvores AVL: Partes I e II. Desempenho de ABBs (Revisão)

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

UNILASALLE Curso de Bacharelado em Ciência da Computação. Estrutura de Dados II Prof. Magalí T. Longhi. Árvores AVL*

ALGORITMOS AVANÇADOS. UNIDADE V Estruturas de dados dos tipos Árvore Binária e Árvore AVL. Luiz Leão

Árvore AVL A seguir estudaremos árvore AVL e árvore 234. Os slides que versão sobre as árvores retro aludidas foram baseados nos slides gerados pela

Árvores B. Prof. Márcio Bueno. / Fonte: Material da Prof a Ana Eliza Lopes Moura

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

Árvores. Estruturas de Dados. Prof. Vilson Heck Junior

Árvores Binárias de Busca (ABB) 18/11

Árvores Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação

ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Árvores AVL. O balanceamento da árvore pode ser realizado localmente se apenas uma porção da árvore for afetada por operações de inserção ou remoção.

Módulo 9. Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II C++ (Rone Ilídio)

Árvores. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo

Árvores Vermelho-Preto

ESTRUTURA DE DADOS E ALGORITMOS. Árvores Binárias de Busca. Cristina Boeres

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Árvores AVL. Prof. Robinson Alves

Árvores de Pesquisa. A árvore de pesquisa é uma estrutura de dados muito eficiente para armazenar informação.

INF1010 Lista de Exercícios 2

Arvores, Percursos não recursivos, Arvores heterogêneas. Aula 19

Dicionários. TAD Orientado a conteúdo

Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP

UNIVERSIDADE DE SÃO PAULO ICMC SCC 202 Algoritmos e Estrutura de Dados I - 2º Semestre 2010 Profa. Sandra Maria Aluísio;

Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio

Árvores. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Árvores-B (Parte I) SCC-503 Algoritmos e Estruturas de Dados II. Thiago A. S. Pardo Leandro C. Cintra M.C.F. de Oliveira

Uma árvore binária de busca não garante acesso em tempo logarítmico.

INE5408 Estruturas de Dados

Árvore Binária de Busca. Prof. César Melo

ÁRVORE BINÁRIA DE BUSCA

Árvores Binária de Busca. Prof. César Melo DCC/ICE/UFAM

Árvores Binárias. 9/11 e 11/11 Conceitos Representação e Implementação

1. Proponha algoritmos para: a. Calcular a altura dos nós de uma árvore binária dada, armazenando o valor da altura no nó.

Estruturas de Dados I

Árvores Binárias de Busca

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.

GGI026 - Árvore rubro-negra - Remoção

Exercícios: Árvores. Universidade Federal de Uberlândia - UFU Faculdade de Computação - FACOM Lista de exercícios de estrutura de dados em linguagem C

Edital de Seleção 024/2017 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Árvores Binárias e AVL Felipe Barros Pontes Gustavo Márcio de Morais Cunha Márcio de Medeiros Ribeiro

Árvores AVL. Estrutura de Dados II Jairo Francisco de Souza

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

Árvores Rubro-Negras. Árvores Rubro-Negras. (Vermelho-Preta) Estrutura da Árvore. Estrutura da Árvore

Transcrição:

Árvores AVL

Árvores Binárias de Busca Altura de uma árvore binária (AB): igual à profundidade, ou nível máximo, de suas folhas A eficiência da busca em árvore depende do seu balanceamento Algoritmos de inserção e remoção em ABB não garantem que a árvore gerada a cada passo seja balanceada Pergunta: Vale a pena balancear uma ABB de tempos em tempos? 10/05/2010 2/36

Árvore Binária de Busca Aleatória ABB aleatória Nós externos: potenciais descendentes dos nós folha (não estão, de fato, na árvore; representam potenciais posições de futuras inserções) Uma árvore A com n chaves possui n+1 nós externos Uma inserção em A é considerada aleatória se ela tem probabilidade igual de acontecer em qualquer uma das n+1 posições de inserção. Uma ABB aleatória com n chaves é uma árvore resultante de n inserções aleatórias sucessivas em uma árvore inicialmente vazia 10/05/2010 3/36

Árvore Binária de Busca Aleatória Para uma ABB aleatória, foi mostrado que o número esperado de comparações para recuperar um registro qualquer é cerca de 1,39*log 2 (n). ou seja, 39% pior do que o custo do acesso em uma árvore perfeitamente balanceada Isto é: o balanceamento a cada operação aumenta o tempo e garante um desempenho melhor que numa árvore aleatória de, no máximo, 39% (o pior caso é muito raro!) Essa estratégia é aconselhável apenas se o número de buscas for muito maior do que o de inserções. A conservação do balanceamento pode ser mais simples se relaxarmos a condição de perfeitamente balanceada para balanceada apenas. 10/05/2010 4/36

AB Balanceada versus AB Perfeitamente Balanceada Seja h b (n) a altura de uma AB balanceada. O seguinte resultado foi demonstrado: ~h pb (n) log 2 (n+1) h b (n) 1.4404 log 2 (n+2) 0.328 Ou seja: Uma AB Balanceada nunca terá altura superior a 45% da altura de sua correspondente Perfeitamente Balanceada. As operações numa AB Balanceada serão portanto da O(log 2 n). 10/05/2010 5/ 36

Árvores AVL Árvore AVL: ABB na qual as alturas das duas sub-árvores de todo nó nunca diferem em mais de 1. Ou seja, é uma ABB Balanceada. Seja o Fator de Balanceamento de um Nó (FB) a altura de sua sub-árvore direita menos a altura de sua sub-árvore esquerda Em uma árvore AVL todo nó tem FB igual a 1, -1 ou 0 10/05/2010 6/ 36

Árvores AVL Exemplo -1 1 0 B inserções mantêm árvore balanceada 0 0-1 1 0 0 B B 0 0 0 0 U1 U2 U3 U4 Un inserções não mantêm árvore balanceada B B B B 0 0 0 0 U5 U6 U7 U8 U9 U10 U11 U12 10/05/2010 7/ 36

Árvores AVL Desbalanceamento: Se NÓ inserido é descendente esquerdo de um nó que tinha FB = -1 (U1 a U8) OU Se NÓ inserido é descendente direito de um nó que tinha FB = 1 (U9 a U12) 10/05/2010 8/ 36

Árvores AVL Para manter uma árvore balanceada é necessário aplicar uma transformação na árvore tal que: 1. o percurso in-ordem na árvore transformada seja igual ao da árvore original (isto é, a árvore transformada continua sendo uma ABB); 2. a árvore transformada fique balanceada (todos os nós com FB= -1, 0 ou 1). 10/05/2010 9/ 36

Árvore AVL Numa AVL, a inserção é feita na posição adequada, e depois verifica-se se houve desbalanceamento. Veja o que pode acontecer a cada inserção: 2 4 6 FB=-1 8 As chaves 9 e 11 não violam o balanceamento (até melhoram!) 10 As chaves 1, 3, 5 ou 7 violam. 10/05/2010 10/ 36

AVL: 2 Casos de Rebalanceamento TIPO 1: a raiz de uma sub-árvore tem FB= 2 (ou 2) e tem um filho com FB = -1 (ou 1), i.e. FB com sinal oposto ao do pai. FB=1 4 8 FB=-2 10 Inserção de 5 2 6 FB=-1 Como rebalancear? 5 Solução: 2 Rotações: 1) Rotação à esquerda de 4 2) Rotação à direita de 8 10/05/2010 11/ 36

AVL: Exemplo Rotação Esquerda-Direita 1) Rotação à esquerda de 4 2 FB=-2 6 4 5 10 2) Rotação à direita de 8 8 FB=-2 6 4 8 FB=1 2 5 10 10/05/2010 12/ 36

Tipo 1: Resumo Requer uma rotação dupla: ESQUERDA- DIREITA ou DIREITA-ESQUERDA: 1. Rotacionar o nó com FB= -1 (ou 1) na direção apropriada, i.e., se FB negativo, para a direita; se positivo, para a esquerda. 2. Rotacionar o nó com FB= -2 (ou 2) na direção oposta. 10/05/2010 13/ 36

Casos de Rebalanceamento FB=1 Tipo 2: A raiz de uma subárvore tem FB= -2 (ou 2) e tem filho com FB = -1 (ou 1), i.e., com mesmo sinal do pai. 2 4 3 6 8 FB=-2 FB=-1 Inserção de 3 10 Solução: Uma Rotação simples à direita do nó 8 FB=1 10 10/05/2010 14/ 36 2 4 3 6 8

Tipo 2: Resumo Rotacionar uma única vez o nó de FB = -2 ou 2: se negativo: à direita; se positivo: à esquerda. 10/05/2010 15/ 36

Inserção em AVL: Resumo A cada inserção, verificar se balanceamento foi conservado. Em caso negativo (se algum nó ficou com FB igual a 2 ou 2), verificar qual caso se aplica (Tipo 1 ou Tipo 2). Efetuar as operações de rotação adequadas. 10/05/2010 16/ 36

Árvores AVL Rotação DIREITA FB=-2 50 160 DESBALANCEOU! 220 Percurso in-ordem 10, 12, 34, 40, FB=-1 34 100 190 250 12 40 175 193 230 260 10 168 188 255 280 ROTAÇÃO DIREITA 50 10/05/2010 17/ 36

Árvores AVL Rotação DIREITA 34 160 220 Percurso in-ordem 10, 12, 34, 40, 12 50 190 250 10 40 100 175 193 230 260 ROTAÇÃO DIREITA CONCLUÍDA 168 188 255 280 ÁRVORE NOVAMENTE BALANCEADA!!! 10/05/2010 18/ 36

Árvores AVL Rotação ESQUERDA 34 160 220 Percurso in-ordem 10, 12, 34, 40, 12 50 FB=2 DESBALANCEOU 190 250 FB=1 10 40 100 175 193 230 260 191 198 255 280 ROTAÇÃO ESQUERDA 190 200 10/05/2010 19/ 36

Árvores AVL Rotação ESQUERDA 34 160 220 Percurso in-ordem 10, 12, 34, 40, 12 50 193 250 10 40 100 190 198 230 260 ROTAÇÃO ESQUERDA CONCLUÍDA 175 191 200 255 280 ÁRVORE NOVAMENTE BALANCEADA!!! 10/05/2010 20/ 36

Árvores AVL Nos exemplos anteriores as regras foram mantidas: o percurso in-ordem na árvore transformada coincide com o da árvore original (a menos do nó inserido), i.e., a árvore transformada é uma ABB; a árvore transformada ficou balanceada 10/05/2010 21/ 36

Árvores AVL Para verificar qual rotação deve ser efetuada para rebalancear a árvore, é necessário calcular o Fator de Balanceamento do nó (p): FB(p) = h(subarv-direita) h(subarv-esquerda) Se FB positivo: rotações à esquerda Se FB negativo: rotações à direita Repare que o efeito das transformações é diminuir em 1 a altura da sub-árvore cuja raiz (p) tem FB = 2 após a inserção. Isso assegura o rebalanceamento de todos os ancestrais de p, e portanto, o rabalanceamento de toda a árvore. Considere um novo campo em cada nó bal que armazena o FB do nó. Ao ser inserido como folha, o campo bal deve ser inicializado com zero. 10/05/2010 22/ 36

bal info esq dir typedef struct no *pno; typedef struct no{ int bal; tipo_elem info; pno dir, esq; }no; typedef pno tree; tree raiz;

Árvores AVL Algoritmo de Rotação à direita FB= -1 q p 8 FB= -2 void rot_dir(pno p){ pno q, temp; } q = p->esq; temp = q->dir; q->dir = p; p->esq = temp; p = q; 10/05/2010 24/ 36 2 3 p 4 FB= 0 6 8 4 2 6 10 3 FB= 0 10 temp

Árvores AVL Algoritmo de Rotação à esquerda p 8 FB= 2 q void rot_esq(pno p){ pno q, temp; } q = p->dir; temp = q->esq; q->esq = p; p->dir = temp; p = q; FB= 0 15 10/05/2010 25/ 36 8 2 9 p 15 17 2 temp FB= 0 20 9 17 FB= 1 20

Árvores AVL Algoritmo de Rotação Esquerda-Direita void rot_esq_dir(pno p){ rot_esq(p->esq); rot_dir(p); } FB= 0 2 4 6 FB= 0 5 10/05/2010 26/ 36 8 FB= 1 10 FB= 1 4 8 2 6 5 p FB= -2 10

Árvores AVL Algoritmo de Rotação Direita-Esquerda void rot_dir_esq(pno p){ rot_dir(p->dir); rot_esq(p); } FB= -1 2 8 9 FB= 0 14 15 FB= 0 20 15 10/05/2010 27/ 36 2 p 8 9 FB= 2 14 FB= -1 20

Calculando o FB Numa próxima inserção, é preciso verificar o FB dos nós para saber se houve desbalanceamento ou não. Assim, a cada inserção e rebalanceamento, é necessário recalcular o valor de FB para os nós envolvidos nas rotações. 10/05/2010 28/ 36

Algoritmo Recursivo de Busca e Inserção em Árvore AVL ins_avl ( x, raiz, flag); chave de busca/inserção (E) raiz da árvore (E/S) auxiliar para propagar verificação de FB (E/S) 10/05/2010 29/ 36

void ins_avl(tipo_elem x, pno p, boolean *flag) { if (p == NULL) { /*árvore vazia: insere e sinaliza alteração de FB*/ aloca(p, x); *flag = TRUE; return; } if (x < p->info) { /*recursividade à esquerda*/ ins_avl(x, p->esq, flag); if (flag) /*inseriu: verificar balanceamento*/ switch (p->bal) { case 1: /*mais alto a direita*/ p->bal = 0; /*balanceou com ins. esq*/ *flag = FALSE; /*interrompe propagação*/ break; case 0: p->bal = -1; /*ficou maior à esq.*/ break; /*... */ 10/05/2010 30/ 36

} } return; case -1: /*FB(p) = -2*/ CASO1(p); /*p retorna balanceado*/ *flag = FALSE; break; /*não propaga mais*/ if (x > p->info) { /*recursiva a direita*/ ins_avl(x, p->dir, flag); if (flag) /*inseriu: verificar balanceamento*/ switch (p->bal) { case -1: /*era mais alto à esq.: zera FB*/ p->bal = 0; *flag = FALSE; break; case 0: p->bal = 1; break; /*direita fica maior: propaga verificação*/ case 1: /*FB(p) = 2 e p retorna balanceado*/ CASO2(p); *flag = FALSE; break; } return; } /* else if (x = p->info) nada a fazer; pare!*/ } 31/ 36

void aloca (pno p, tipo_elem x){ /*insere nó p com conteúdo x, como nó folha*/ p = malloc(sizeof(no)); p->esq = NULL; p->dir = NULL; p->info = x; p->bal = 0; } 10/05/2010 32/ 36

void CASO1 (pno p){ /*x foi inserido à esq. de p e causou FB= -2*/ pno u; u = p->esq; if (u->bal == -1) /*caso sinais iguais e negativos: rotação à direita*/ rot_dir(p); else /*caso sinais trocados: p (-2) rotação dupla u + p*/ rot_esq_dir(p); u (1) u (-1) p (-2) } p->bal = 0; 10/05/2010 33/ 36

void CASO2 (pno p){ /*x foi inserido à direta de p e causou FB=2*/ pno u; u = p->dir; if (u->bal == 1) /*caso sinais iguais e positivos: rotação à esquerda*/ rot_esq(p); p (2) else /*caso sinais trocados: rotação dupla u + p*/ rot_dir_esq(p); u (-1) p (2) u (1) } p->bal = 0; 10/05/2010 34/ 36

Refazendo as rotações duplas para ajustar FB void rot_esq_dir(pno p){ p -2 pno u, v; u = p->esq; v = u->dir; u->dir = v->esq; v->esq = u; p->esq = v; v->dir = p; rot_dir(p) rot_esq(u) 1 u v {-1 ou 1} } /*atualizar FB de u e p em função de FB de v - a nova raiz*/ if (v->bal == -1) { /*antes: u^.bal=1 e p^.bal=-2*/ u->bal = 0; p->bal = 1; v } else { p->bal =0; u->bal = -1; } p = v; u p

Refazendo as rotações duplas para ajustar FB void rot_dir_esq(pno p){ 2 p pno z, v; z = p->dir; v = z->esq; z->esq = v->dir; v->dir = z; p->dir = v->esq; v->esq = p; rot_esq(p) rot_dir(z) {-1 ou1} v z -1 } /*atualizar FB de z e p em função de FB de v a nova raiz*/ if (v->bal == 1) { p->bal = -1; z->bal = 0; v } else { p->bal = 0; z->bal = 1; } p = v; p z

Eliminação em AVL Operações análogas à da ABB, porém, como podem desbalancear a árvore, requerem a verificação dos valores de Fatores de Balanceamento e acionamento das rotações adequadas, quando for o caso.

AVL Como fazer a remoção de elementos da AVL? Tentar pensar no caso oposto: quando se remove um elemento, é como se um elemento tivesse sido inserido

AVL: remoção Exemplos R R 23 23 15 29 15 25 12 12 19 29 remoção de 29 = inserção de 12 10 remoção de 29 = inserção de 10 Como balancear?

AVL: remoção Exemplos R R 23 23 15 25 15 29 12 19 12 19 10 16 29 remoção de 29 = inserção de 12 ou19 remoção de 29 = inserção de 10 ou16 Como balancear? Rotação simples em R

AVL: remoção Primeiro caso Rotação simples em R (FB=2 ou -2) com filho com fator de balanceamento de mesmo sinal (1 ou -1) ou zero Se R negativo, rotaciona-se para a direita; caso contrário, para a esquerda

AVL: remoção Exemplos 23 R 23 R 15 29 19 remoção de 29 = inserção de 19 15 25 12 19 29 16 remoção de 29 = inserção de 16 Como balancear?

AVL: remoção Exemplos 23 R 23 R 15 25 12 19 29 20 remoção de 29 = inserção de 20 15 25 12 19 29 16 20 remoção de 29 = inserção de 16 ou 20 Como balancear? Rotação dupla: filho de R e R

AVL: remoção Segundo caso Rotação dupla quando R (FB=2 ou -2) e seu filho (1 ou -1) tem fatores de balanceamento com sinais opostos Rotaciona-se o filho para o lado do desbalanceamento do pai Rotaciona-se R para o lado oposto do desbalanceamento

AVL: remoção Questão: como remover um nó intermediário em vez de um nó folha? É necessário balancear? R R 23 23 15 25 15 25 12 19 29 12 19 29 20 16 20

AVL: remoção Questão: como remover um nó intermediário em vez de um nó folha? É necessário balancear? 23 R 15 25 12 19 29 20

AVL Exercício para casa Implementar sub-rotina de remoção de elemento de uma AVL