Árvores AVL - 0.5cmSCC0202 - Algoritmos e Estruturas de ... · Árvores AVL Rotação Direita...
-
Upload
nguyentram -
Category
Documents
-
view
218 -
download
0
Transcript of Árvores AVL - 0.5cmSCC0202 - Algoritmos e Estruturas de ... · Árvores AVL Rotação Direita...
Árvores AVL
Árvores AVL
SCC0202 - Algoritmos e Estruturas de Dados I
Prof. Fernando V. Paulovich*Baseado no material do Prof. Gustavo Batista
http://www.icmc.usp.br/[email protected]
Instituto de Ciências Matemáticas e de Computação (ICMC)Universidade de São Paulo (USP)
4 de novembro de 2010
Árvores AVLConceitos Introdutórios
Sumário
1 Conceitos Introdutórios
2 Rotação Direita
3 Rotação Esquerda
4 Rotações Simples
5 Rotações Duplas
6 Qual Rotação Usar
7 Implementação
8 Inserção em Árvores AVL
Árvores AVLConceitos Introdutórios
Sumário
1 Conceitos Introdutórios
2 Rotação Direita
3 Rotação Esquerda
4 Rotações Simples
5 Rotações Duplas
6 Qual Rotação Usar
7 Implementação
8 Inserção em Árvores AVL
Árvores AVLConceitos Introdutórios
Árvores Binárias de Busca
Altura de uma árvore binária (AB): igual à profundidade,ou nível máximo, de suas folhasA eficiência da busca em árvore depende do seubalanceamentoAlgoritmos de inserção e remoção em ABB não garantemque a árvore gerada a cada passo seja balanceada
Árvores AVLConceitos Introdutórios
Árvores AVL
Árvore AVL: ABB na qual as alturas das duas sub-árvoresde todo nó nunca diferem em mais de 1
Fator de balanceamento de nó: a altura de sua sub-árvoreesquerda menos a altura de sua sub-árvore direita
FB(p) = h(TE(p))− h(TD(p))
Em uma árvore AVL todo nó tem fator de balanceamentoigual a 1, −1 ou 0
Árvores AVLConceitos Introdutórios
Árvores AVL
Árvores AVLConceitos Introdutórios
Árvores AVL
O problema das árvores AVL e das árvores balanceadas deuma forma geral é como manter a estrutura balanceadaapós operações de inserção e remoçãoAs operações de inserção e remoção sobre ABBs nãogarantem o balanceamento
Árvores AVLConceitos Introdutórios
Árvores AVL
As seguintes inserções tornam a árvore desbalanceada
Árvores AVLConceitos Introdutórios
Árvores AVL
As seguintes situações podem levar ao desbalaceamentode uma árvore AVL
O nó inserido é descendente esquerdo de um nó quetinha FB = 1 (U1 e U8)O nó inserido é descendente direito de um nó que tinhaFB = −1 (U9 e U12)
Árvores AVLConceitos Introdutórios
Árvores AVL
Para manter uma árvore balanceada é necessário aplicaruma transformação na árvore tal que
1 O percurso em-ordem na árvore transformada seja igualao da árvore original (isto é, a árvore transformadacontinua sendo uma ABB)
2 A árvore transformada fique balanceada
Árvores AVLConceitos Introdutórios
Árvores AVL
A transformação que mantém a árvore balanceada échamada de rotaçãoA rotação pode ser feita à esquerda ou à direita,dependendo do desbalanceamento a ser tratadoA rotação deve ser realizada de maneira a respeitar asregras 1 e 2 definidas no slide anteriorDependendo do desbalanceamento a ser tratado, umaúnica rotação pode não ser suficiente
Árvores AVLRotação Direita
Sumário
1 Conceitos Introdutórios
2 Rotação Direita
3 Rotação Esquerda
4 Rotações Simples
5 Rotações Duplas
6 Qual Rotação Usar
7 Implementação
8 Inserção em Árvores AVL
Árvores AVLRotação Direita
Árvores AVL - Rotação Direita
Árvores AVLRotação Direita
Árvores AVL - Rotação Direita
Árvores AVLRotação Direita
Árvores AVL - Rotação Direita
A rotação direita consiste em subir o nó B para o lugar de A. A desce para sersub-árvore direita de B
Árvores AVLRotação Direita
Árvores AVL - Rotação Direita
A rotação direita tem formatogeral ilustrado à direitaT1, T2 e T3 podem sersub-árvores de qualquertamanho, inclusive 0A é o nó mais jovem a setornar desbalanceado
Árvores AVLRotação Direita
Árvores AVL - Rotação Direita
A rotação direita tem formatogeral ilustrado à direitaT1, T2 e T3 podem sersub-árvores de qualquertamanho, inclusive 0A é o nó mais jovem a setornar desbalanceado
Árvores AVLRotação Direita
Árvores AVL - Rotação Direita
Árvores AVLRotação Direita
Árvores AVL - Rotação Direita
Árvores AVLRotação Direita
Árvores AVL - Rotação Direita
ExercícioInsira em uma árvore AVL a seqüência de valores:5, 4, 3, 2, 1. Na ordem que os valores foram listados
Árvores AVLRotação Esquerda
Sumário
1 Conceitos Introdutórios
2 Rotação Direita
3 Rotação Esquerda
4 Rotações Simples
5 Rotações Duplas
6 Qual Rotação Usar
7 Implementação
8 Inserção em Árvores AVL
Árvores AVLRotação Esquerda
Árvores AVL - Rotação Esquerda
Árvores AVLRotação Esquerda
Árvores AVL - Rotação Esquerda
Árvores AVLRotação Esquerda
Árvores AVL - Rotação Esquerda
Árvores AVLRotação Esquerda
Árvores AVL - Rotação Esquerda
A rotação esquerda temformato geral ilustrado àdireitaT1, T2 e T3 podem sersub-árvores de qualquertamanho, inclusive 0A é o nó mais jovem a setornar desbalanceado
Árvores AVLRotação Esquerda
Árvores AVL - Rotação Esquerda
A rotação esquerda temformato geral ilustrado àdireitaT1, T2 e T3 podem sersub-árvores de qualquertamanho, inclusive 0A é o nó mais jovem a setornar desbalanceado
Árvores AVLRotação Esquerda
Árvores AVL - Rotação Esquerda
Árvores AVLRotação Esquerda
Árvores AVL - Rotação Esquerda
Árvores AVLRotação Esquerda
Árvores AVL - Rotação Esquerda
ExercícioInsira em uma árvore AVL a seqüência de valores:1, 2, 3, 4, 5. Na ordem que os valores foram listados
Árvores AVLRotações Simples
Sumário
1 Conceitos Introdutórios
2 Rotação Direita
3 Rotação Esquerda
4 Rotações Simples
5 Rotações Duplas
6 Qual Rotação Usar
7 Implementação
8 Inserção em Árvores AVL
Árvores AVLRotações Simples
Rotações Simples
Tanto para a rotação direitaquanto para a rotaçãoesquerda, a sub-árvoreresultante tem como altura amesma altura a sub-árvoreoriginalIsso significa que o fator debalanceamento de nenhum nóacima de A é afetado
Árvores AVLRotações Simples
Rotações Simples
Quando se deve utilizar arotação direita ou esquerda?
Quando o fator debalanceamento do nó A épositivo, a rotação édireita. Se for negativo arotação é esquerda
Árvores AVLRotações Simples
Rotações Simples
Quando se deve utilizar arotação direita ou esquerda?
Quando o fator debalanceamento do nó A épositivo, a rotação édireita. Se for negativo arotação é esquerda
Árvores AVLRotações Duplas
Sumário
1 Conceitos Introdutórios
2 Rotação Direita
3 Rotação Esquerda
4 Rotações Simples
5 Rotações Duplas
6 Qual Rotação Usar
7 Implementação
8 Inserção em Árvores AVL
Árvores AVLRotações Duplas
Rotações Duplas
Será que as rotações simplessolucionam todos os tipos dedesbalanceamento?
Infelizmente, nãoExistem situações nas quais énecessário uma rotação dupla
Árvores AVLRotações Duplas
Rotações Duplas
Árvores AVLRotações Duplas
Árvores AVL - Rotação Esq./Dir.
A rotação duplaesquerda/direita tem formatogeral ilustrado à direitaT1, T2, T3 e T4 podem sersub-árvores de qualquertamanho, inclusive 0A é o nó mais jovem a setornar desbalanceado
Árvores AVLRotações Duplas
Árvores AVL - Rotação Esq./Dir.
Passo 1: rotação esquerda emBA princípio a rotaçãoesquerda parece deixar aárvore ainda maisdesbalanceadaEntretanto...
Árvores AVLRotações Duplas
Árvores AVL - Rotação Esq./Dir.
Passo 2: rotação direita em ARepare que a altura final dasub-árvore é n+ 2Funciona também se o novonó tivesse sido inserido em T3
Árvores AVLRotações Duplas
Árvores AVL - Rotação Esq./Dir.
A rotação dupladireita/esquerda tem formatogeral ilustrado à direitaT1, T2, T3 e T4 podem sersub-árvores de qualquertamanho, inclusive 0A é o nó mais jovem a setornar desbalanceado
Árvores AVLRotações Duplas
Árvores AVL - Rotação Dir./Esq.
Passo 1: rotação direita em BA princípio a rotação direitaparece deixar a árvore aindamais desbalanceadaEntretanto...
Árvores AVLRotações Duplas
Árvores AVL - Rotação Dir./Esq.
Passo 2: rotação esquerda emARepare que a altura final dasub-árvore é n+ 2Funciona também se o novonó tivesse sido inserido em T2
Árvores AVLQual Rotação Usar
Sumário
1 Conceitos Introdutórios
2 Rotação Direita
3 Rotação Esquerda
4 Rotações Simples
5 Rotações Duplas
6 Qual Rotação Usar
7 Implementação
8 Inserção em Árvores AVL
Árvores AVLQual Rotação Usar
Como decidir qual rotação usar?
Se o sinal do nó A e do nó Bforem iguais então a rotaçãoé simplesSe o fator de balanceamentonó A (nó mais jovem a setornar desbalanceado) forpositivo, então a rotação édireita
Árvores AVLQual Rotação Usar
Como decidir qual rotação usar?
Se o sinal do nó A e do nó Bforem iguais então a rotaçãoé simplesSe o fator de balanceamentonó A (nó mais jovem a setornar desbalanceado) fornegativo, então a rotação éesquerda
Árvores AVLQual Rotação Usar
Como decidir qual rotação usar?
Se o sinal do nó A e do nó Bforem diferentes então arotação é duplaSe o fator de balanceamentonó A (nó mais jovem a setornar desbalanceado) forpositivo, então a rotação éesquerda/direita
Árvores AVLQual Rotação Usar
Como decidir qual rotação usar?
Se o sinal do nó A e do nó Bforem diferentes então arotação é duplaSe o fator de balanceamentonó A (nó mais jovem a setornar desbalanceado) fornegativo, então a rotação édireita/esquerda
Árvores AVLImplementação
Sumário
1 Conceitos Introdutórios
2 Rotação Direita
3 Rotação Esquerda
4 Rotações Simples
5 Rotações Duplas
6 Qual Rotação Usar
7 Implementação
8 Inserção em Árvores AVL
Árvores AVLImplementação
Definição de Tipos
1 typedef struct {2 int chave;3 int valor;4 } INFO;56 typedef struct NO {7 INFO info;8 int fb; //fator de balanceamento9 struct NO *pai; //ponteiro para o pai
10 struct NO *fesq; //ponteiro para o filho da esquerda11 struct NO *fdir; //ponteiro para o filho da direita12 } NO;1314 typedef struct {15 NO *raiz;16 } ARVORE_AVL;
Árvores AVLImplementação
Algoritmo - Rotação Direita
1 NO *rot_dir(NO *no) {2 NO *aux = no->fesq;34 if (no->pai) { //verifica se no não é a raiz5 if (no->pai->fesq == no)6 no->pai->fesq = aux;7 else8 no->pai->fdir = aux;9 }
1011 aux->pai = no->pai;12 no->fesq = aux->fdir;13 if (no->fesq) no->fesq->pai = no;14 aux->fdir = no;15 no->pai = aux;1617 return(aux);18 }
Árvores AVLImplementação
Algoritmo - Rotação Esquerda
1 NO *rot_esq(NO *no) {2 NO *aux = no->fdir;34 if (no->pai) { //verifica se no não é a raiz5 if (no->pai->fesq == no)6 no->pai->fesq = aux;7 else8 no->pai->fdir = aux;9 }
1011 aux->pai = no->pai;12 no->fdir = aux->fesq;13 if (no->fdir) no->fdir->pai = no;14 aux->fesq = no;15 no->pai = aux;1617 return(aux);18 }
Árvores AVLImplementação
Algoritmo - Rotação Esq./Dir.
1 NO *rot_esq_dir(NO *no) {2 rot_esq(no->fesq);3 return(rot_dir(no));4 }
Árvores AVLImplementação
Algoritmo - Rotação Dir./Esq.
1 NO *rot_dir_esq(NO *no) {2 rot_dir(no->fdir);3 return(rot_esq(no));4 }
Árvores AVLInserção em Árvores AVL
Sumário
1 Conceitos Introdutórios
2 Rotação Direita
3 Rotação Esquerda
4 Rotações Simples
5 Rotações Duplas
6 Qual Rotação Usar
7 Implementação
8 Inserção em Árvores AVL
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
Utilizando as rotinas de rotação pode-se definir umalgoritmo de inserção em árvores AVLNessa operação é importante saber
O balanceamento de cada nó da árvoreO nó ancestral mais jovem do nó inserido que pode setornar desbalanceadoA inserção é feita em dois passos: o primeiro é umainserção em ABBs e o segundo é o rebalanceamento, senecessário
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
Vamos supor que um novo nó será inserido na posiçãomarcada em vermelho
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
Um ponteiro p marca a posição que se está procurando...
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
E q aponta para o ancestral mais jovem que possuibalanceamento diferente de 0...
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
E q aponta para o ancestral mais jovem que possuibalanceamento diferente de 0...
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
E q aponta para o ancestral mais jovem que possuibalanceamento diferente de 0...
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
O balanceamento entre q e p é atualizado...
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
A rotação apropriada é realizada, os fatores debalanceamento são atualizados
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
Vamos supor que um novo nó será inserido na posiçãomarcada em vermelho
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
Um ponteiro p marca a posição que se está procurando...
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
E q aponta para o ancestral mais jovem que possuibalanceamento diferente de 0...
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
E q aponta para o ancestral mais jovem que possuibalanceamento diferente de 0...
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
E q aponta para o ancestral mais jovem que possuibalanceamento diferente de 0...
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
O balanceamento entre q e p é atualizado...
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
Não há necessidade de ajustar o fator de balanceamentoacima de q (porque?)
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
Como não houve desbalanceamento, o algoritmo termina
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
1 void inserir_arvore_avl(ARVORE_AVL *arv, INFO info) {2 arv->raiz = inserir_arvore_avl_aux(arv->raiz, info);3 }45 struct NO *inserir_arvore_avl_aux(NO *raiz, INFO info) {6 if (raiz == NULL) {7 raiz = (NO *) malloc(sizeof(NO));8 raiz->fesq = raiz->fdir = raiz->pai = NULL;9 raiz->info = info;
10 raiz->fb = 0;11 } else {12 if (raiz->info.chave > info.chave) { //desce pela esquerda13 raiz->fesq = inserir_arvore_avl_aux(raiz->fesq, info);14 raiz->fesq->pai = raiz;1516 //adicionar as rotações...17 } else { //desce pela direita18 raiz->fdir = inserir_arvore_avl_aux(raiz->fdir, info);19 raiz->fdir->pai = raiz;2021 //adicionar as rotações...22 }23 }2425 return(raiz);26 }
Árvores AVLInserção em Árvores AVL
Algoritmo de Inserção
1 void inserir_arvore_avl(ARVORE_AVL *arv, INFO info) {2 int atualiza_fb = 0;3 arv->raiz = inserir_arvore_avl_aux(arv->raiz, info, &atualiza_fb);4 }56 struct NO *inserir_arvore_avl_aux(NO *raiz, INFO info, int *←↩
atualiza_fb) {7 if (raiz == NULL) {8 //...9 *atualiza_fb = 1; //inseriu, atualiza os fbs
10 } else {11 if (raiz->info.chave > info.chave) { //desce pela esquerda12 raiz->fesq = inserir_arvore_avl_aux(raiz->fesq, info, ←↩
atualiza_fb);13 raiz->fesq->pai = raiz;1415 if (*atualiza_fb) {16 //...17 }18 } else { //desce pela direita19 raiz->fdir = inserir_arvore_avl_aux(raiz->fdir, info, ←↩
atualiza_fb);20 raiz->fdir->pai = raiz;2122 if (*atualiza_fb) {23 //...24 }25 }26 }2728 return(raiz);29 }
Árvores AVLInserção em Árvores AVL
Remoção em AVLs
Para eliminar um nó de uma árvore AVL, o algoritmo éum pouco mais complicadoEnquanto que a inserção pode requerer no máximo umarotação (simples ou dupla), a remoção pode requerermais de uma rotação
No pior caso, pode-se fazer uma rotação a cada nível daárvoreOu seja, no pior caso O(log n) rotaçõesNa prática, são necessárias apenas 0, 214 rotação poreliminação, em média
Árvores AVLInserção em Árvores AVL
Complexidade das AVLs
A altura máxima de uma ABB AVL é 1, 44 log2 n
Dessa forma, uma pesquisa nunca exige mais do que 44%mais comparações que uma ABB totalmente balanceada.
Na prática, para n grande, os tempos de busca são porvolta de log2 n + 0, 25Na média, é necessária uma rotação em 46, 5% dasinserções
Árvores AVLInserção em Árvores AVL
Exercícios
Simule a inserção da seguinte seqüência de valores emuma árvore AVL: 10, 7, 20, 15, 17, 25, 30, 5, 1Em cada opção abaixo, insira as chaves na ordemmostrada de forma a construir uma arvore AVL. Sehouver rebalanceamento de nós, mostre qual oprocedimento a fazer
1 a, z, b, y, c, x2 a, z, b, y, c, x, d, w, e, v, f3 a, v, l, t, r, e, i, o, k4 m, te, a, z, g, p
Árvores AVLInserção em Árvores AVL
Exercícios
Escreva uma função que retorna a altura da árvore AVL.Qual é a complexidade da operação implementada? Ela émais eficiente que a implementação para ABBs?Implemente o TAD AVL com as operações de inserção ebusca e demais operações auxiliares
Árvores AVLInserção em Árvores AVL
Exercícios
Mostre a árvores AVL gerada passo-a-passo pelasinserções das seguintes chaves na ordem fornecida
10, 5, 20, 1, 3, 4, 8, 30, 40, 35, 50, 45, 55, 51, 100