Árvores AVL - 0.5cmSCC0202 - Algoritmos e Estruturas de ... · Árvores AVL Rotação Direita...

Post on 05-Dec-2018

218 views 0 download

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/~paulovicpaulovic@icmc.usp.br

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