Árvores balanceadas - AVL

skosta 7,768 views 92 slides Jan 23, 2014
Slide 1
Slide 1 of 92
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77
Slide 78
78
Slide 79
79
Slide 80
80
Slide 81
81
Slide 82
82
Slide 83
83
Slide 84
84
Slide 85
85
Slide 86
86
Slide 87
87
Slide 88
88
Slide 89
89
Slide 90
90
Slide 91
91
Slide 92
92

About This Presentation

No description available for this slideshow.


Slide Content

Árvores Balanceadas
AVL
Prof: Sergio Souza Costa

Sobre mim
Sérgio Souza Costa
Professor - UFMA
Doutor em Computação Aplicada (INPE)


[email protected]
https://sites.google.com/site/profsergiocosta/home
https://twitter.com/profsergiocosta
http://gplus.to/sergiosouzacosta
http://www.slideshare.net/skosta/presentations?order=popular

Introdução
●As árvores binárias de busca permitem a
organização da informação com o objetivo a
otimizar as buscas.

Introdução
●As árvores binárias de busca permitem a
organização da informação com o objetivo a
otimizar as buscas.
●Ela permite o acesso mais rapido aos
elementos dado que os elementos estão
organizados na árvore, obedecendo uma
certa propriedade.
■Esquerda são os menores que a raiz
■Direita são os maiores que a raiz

Introdução
●As Árvores binárias de busca (ABB)
estudadas têm uma séria desvantagem
que pode afetar o tempo necessário para
recuperar um item armazenado.

Introdução
Insiram os seguintes valores em uma árvore
binária de busca (ABB):
1, 2, 3, 4, 5, 6, 7 4, 6, 2, 5, 1, 7, 3

O que vocês concluem com isso ?

Introdução
A desvantagem é que o desempenho da ABB depende
da ordem em que os elementos são inseridos.

Introdução
A desvantagem é que o desempenho da ABB depende
da ordem em que os elementos são inseridos.

Idealmente, deseja-se que a árvore esteja balanceada,
para qualquer nó p da árvore.

Introdução
A desvantagem é que o desempenho da ABB depende
da ordem em que os elementos são inseridos.

Idealmente, deseja-se que a árvore esteja balanceada,
para qualquer nó p da árvore.

Como saber se a árvore está balanceada ?

Introdução
A desvantagem é que o desempenho da ABB depende
da ordem em que os elementos são inseridos.

Idealmente, deseja-se que a árvore esteja balanceada,
para qualquer nó p da árvore.

Como saber se a árvore está balanceada ?







A altura dos nós
é um importante
dado.

AVL
●O nome AVL vem de seus criadores Adelson Velsky e Landis
(1962).
●Uma árvore binária de pesquisa T é denominada AVL se:
○Para todos nós de T, as alturas de suas duas sub-árvores
diferem no máximo de uma unidade.

20
30
10
40
35
20
30
10
4035
Qual é AVL ? Que nó
esta desbalanceado ?
a) b)

AVL
●Como saber se a árvore está
desbalanceada?

AVL
●Como saber se a árvore está
desbalanceada?
○Verificando se existe algum nodo “desregulado”.

AVL
●Como saber se a árvore está
desbalanceada?
○Verificando se existe algum nodo “desbalanceado”.

●Como saber se um nodo está
desbalanceado ?

AVL
●Como saber se a árvore está
desbalanceada?
○Verificando se existe algum nodo “desbalanceado”.

●Como saber se um nodo está
desbalanceado ?
○Subtraindo-se as alturas das suas sub-árvores.

Fator de balanceamento
●O fator de balanceamento é dado por:
○altura (SAE) – altura(SAD)
●Ou,
○altura (SAD) – altura(SAE)

Fator de balanceamento
●O fator de balanceamento é dado por:
○altura (SAE) – altura(SAD)
●Ou,
○altura (SAD) – altura(SAE)
●O fator de balanceamento de um nodo é dado pelo seu
peso em relação a sua sub-árvore.
○Um nodo pode ter um fator balanceado de 1, 0, ou -1.
○Um nodo com fator de balanceamento -2 ou 2 (diferença de
2 elementos) é considerado desbalanceado e requer um
balanceamento.

AVL - Calculando o fator
20
30
10
40
35


Coloque as alturas de cada nó

AVL - Calculando o fator
20
30
10
40
35
0
1


Coloque as alturas de cada nó
2
3
0
-1
-1
-1
-1
-1
-1

AVL - Calculando o fator
20
30
10
40
35
0
1

Coloque as alturas de cada nó

Calcule o fator de balanceamento

altura (SAE) - altura (SAD)
2
3
0
-1
-1
-1
-1
-1
-1

AVL - Calculando o fator
20
30
10
40
35
0
1


altura (SAE) - altura (SAD)
2
3
0
-1
-1
-1
-1
-1
-1
0 - 2 = -2

AVL - Calculando o fator
20
30
10
40
35
0
1


altura (SAE) - altura (SAD)
2
3 (-2)
0
-1
-1
-1
-1
-1
-1
0 - 2 = -2

AVL - Calculando o fator
20
30
10
40
35
0
1


altura (SAE) - altura (SAD)
2
3 (-2)
0
-1
-1
-1
-1
-1
-1
-1 - 1 = -2

AVL - Calculando o fator
20
30
10
40
35
0
1


altura (SAE) - altura (SAD)
2 (-2)
3 (-2)
0
-1
-1
-1
-1
-1
-1
-1 - 1 = -2

AVL - Calculando o fator
20
30
10
40
35
0 (0)
1 (1)


altura (SAE) - altura (SAD)
2 (-2)
3 (-2)
0 (0)
-1
-1
-1
-1
-1
-1

AVL - Calculando o fator
20
30
10
40
35
0 (0)
1 (1)


altura (SAE) - altura (SAD)
2 (-2)
3 (-2)
0 (0)
-1
-1
-1
-1
-1
-1
Uma árvore binária de pesquisa T é
denominada AVL se:
○Para todos nós de T, as alturas de
suas duas sub-árvores diferem no
máximo de uma unidade.

AVL - Calculando o fator
20
30
10
40
35
0 (0)
1 (1)


altura (SAE) - altura (SAD)
2 (-2)
3 (-2)
0 (0)
-1
-1
-1
-1
-1
-1
Uma árvore binária de pesquisa T é
denominada AVL se:
○Para todos nós de T, as alturas de
suas duas sub-árvores diferem no
máximo de uma unidade.

Atividades
Insira os seguintes valores em uma árvore
binária, coloque os fatores de balanceamento e
diga se é ou não uma AVL e qual nó esta
desbalanceado:

a) [30,15, 50, 5,10, 20]
b) [ 80, 40, 100, 120, 90, 30]
c) [10, 50, 4, 90, 20, 8]

Como balancear ?

Como balancear ?
Através de operações de
rotações!!!!

Rotações
Existem quatro operações de rotações:

Rotação simples à Esquerda
Rotação simples à Direita
Rotação Dupla à Esquerda
Rotação Dupla à Direita

Rotações
Existem quatro operações de rotações:

Rotação simples à Esquerda
Rotação simples à Direita
Rotação Dupla à Esquerda
Rotação Dupla à Direita

As duplas são
derivadas das
simples

Rotações
●Quando usar as Rotações ?
○Na inserção de um elemento
○e na remoção de um elemento

●É provado que no máximo uma rotação é
suficiente para realizar o balanceamento de
uma árvore quando é inserido ou removido
um elemento

Rotações e balanceamento
Vamos ver primeiro as operações de rotação e
depois usa-las para balanceamento.

Rotações
Rotação a direita
Rotação a direita


Rotação a esquerda

Rotação a direita

Rotação a direita
30
20
10
Imagine a seguinte
árvore....

Rotação a direita
30
20
10
30
20
10
Imagine a seguinte
árvore....

Rotação a direita
30
20
10
30
20
10
Imagine a seguinte
árvore....

Rotação a direita
Atividades
Insiram os seguintes valores e depois rotacione
para a direita a partir da raiz:

a) [40,30, 20]
b) [40, 30, 20, 35]
c) [40, 50, 30, 20, 35]

Rotação a esquerda

Rotação a esquerda
Atividades
Insiram os seguintes valores e depois rotacione
para a esquerda a partir da raiz:

a)[40, 50, 60]
b) [40, 50, 10, 60]
c) [40, 20, 10, 50, 60, 70]

Rotação dupla a esquerda

Rotação dupla a esquerda
Atividades
Insiram os seguintes valores e depois rotacione
dupla a esquerda a partir da raiz:

a)[20, 40, 30]
b) [20, 40, 30, 50]
c) [20, 10, 40, 30, 50, 12]

Rotação dupla a direita

Rotação dupla a direita
Atividades
Insiram os seguintes valores e depois rotacione
dupla a direita a partir da raiz:

a) [40, 20, 30]
b) [40, 20, 30, 50]
c) [40, 20, 30, 10,50, 80]

Como usar as rotações para
manter uma árvore balanceada, ou
seja, uma AVL ?

Balanceamento
Ao inserir um novo elemento em uma árvore,
pode ser que um dos seus nós ascendentes se
torne desbalanceado, avô, bisavô ...

Balanceamento
Algoritmo:

A cada inserção, checa-se os nós ascedentes.

Balanceamento
Algoritmo:

●Aplica-se, o mesmo algoritmo de inserção
da árvore binária de busca.
●A cada inserção, checa-se os nós
ascedentes.
●Caso o nó esteja desbalanceado, existem
quatro diferentes configurações, como
veremos a seguir.
○Para cada configração, existe uma rotação indicada.

Exemplo
10
altura (SAE) - altura (SAD)
[10, 20, 30]

Exemplo
10
20
FB: -1 - 0 = -1 OK
altura (SAE) - altura (SAD)
[10, 20, 30]

Exemplo
10
20
altura (SAE) - altura (SAD)
[10, 20, 30]
30

Exemplo
10
20
altura (SAE) - altura (SAD)
[10, 20, 30]
30
FB: -1 - 0 = -1 OK

Exemplo
10
20
altura (SAE) - altura (SAD)
[10, 20, 30]
30
FB: -1 - 1 = -2 Perigo: desbalanceado

Exemplo
10
20
altura (SAE) - altura (SAD)
[10, 20, 30]
30
FB: -1 - 1 = -2 Perigo: desbalanceado
Qual a rotação indicada
neste caso ?

Exemplo
10
20
altura (SAE) - altura (SAD)
[10, 20, 30]
30
FB: -1 - 1 = -2 Perigo: desbalanceado
Qual a rotação indicada
neste caso ?

Rotação simples a
esquerda.

Exemplo
10
20
altura (SAE) - altura (SAD)
[10, 20, 30]
30

Exemplo
10
20
altura (SAE) - altura (SAD)
[10, 20, 30, 40]
30
40

Exemplo
10
20
altura (SAE) - altura (SAD)
[10, 20, 30, 40, 35]
30
40
35

Exemplo
10
20
altura (SAE) - altura (SAD)
[10, 20, 30, 40, 35]
30
40
35
FB: -1 - 1 = -2 Perigo: desbalanceado

Exemplo
10
20
altura (SAE) - altura (SAD)
[10, 20, 30, 40, 35]
30
40
35
FB: -1 - 1 = -2 Perigo: desbalanceado
Qual a rotação indicada
neste caso ?

Exemplo
10
20
altura (SAE) - altura (SAD)
[10, 20, 30, 40, 35]
30
40
35
FB: -1 - 1 = -2 Perigo: desbalanceado
Qual a rotação indicada
neste caso ?

Rotação dupla a
esquerda.

Exemplo
10
20
altura (SAE) - altura (SAD)
[10, 20, 30, 40, 35]
30
40
35
rotação
direita

Exemplo
10
20
altura (SAE) - altura (SAD)
[10, 20, 30, 40, 35]
30
35
40

Exemplo
10
20
altura (SAE) - altura (SAD)
[10, 20, 30, 40, 35]
30
35
40
rotação
esquerda

Exemplo
10
20
altura (SAE) - altura (SAD)
[10, 20, 30, 40, 35]
35
30
40
FB: 0 - 1 = -1 OK
continua a checagem com o no
ascendente.

Atividades
A partir de uma árvore AVL, insiram os
seguintes valores:

a) [10, 20,15,45,67,81,91,10]
b) [1, 5,80,20,67,91,8,10]
c) [10,20,30, 50, 5, 15, 30]

Codificação
Transformando uma árvore binária de
busca em AVL ...

Codificação
Transformando uma árvore binária de
busca em AVL ...
baixem o seguinte código:

https://sites.google.com/site/skosta/teaching/2011-2/sif-
120/arquivos/arvore_binaria.c?attredirects=0&d=1

Rotações
Os algoritmos de rotação serão os primeiros a
serem codificados:

●rotação a esquerda
●rotação a diretia

Rotação a esquerda

BTNode* leftRotation (BTNode* r) {
BTNode* aux = getRight(r);
setRight(r, getLeft(aux));
setLeft(aux, r);
return aux;
}


Rotação a esquerda

BTNode* leftRotation (BTNode* r) {
BTNode* aux = getRight(r);
setRight(r, getLeft(aux));
setLeft(aux, r);
return aux;
}


Rotação a esquerda
r
10
20
30
5
40
15

BTNode* leftRotation (BTNode* r) {
BTNode* aux = getRight(r);
setRight(r, getLeft(aux));
setLeft(aux, r);
return aux;
}


Rotação a esquerda
r
10
20
30
5
40
15

BTNode* leftRotation (BTNode* r) {
BTNode* aux = getRight(r);
setRight(r, getLeft(aux));
setLeft(aux, r);
return aux;
}


Rotação a esquerda
r
10
20
30
5
40
15
aux

BTNode* leftRotation (BTNode* r) {
BTNode* aux = getRight(r);
setRight(r, getLeft(aux));
setLeft(aux, r);
return aux;
}


Rotação a esquerda
r
10
20
30
5
40
15
aux

BTNode* leftRotation (BTNode* r) {
BTNode* aux = getRight(r);
setRight(r, getLeft(aux));
setLeft(aux, r);
return aux;
}


Rotação a esquerda
r
10
20
30
5
40
15
aux

BTNode* leftRotation (BTNode* r) {
BTNode* aux = getRight(r);
setRight(r, getLeft(aux));
setLeft(aux, r);
return aux;
}


Rotação a esquerda
r
10
20
30
5
40
15
aux

BTNode* leftRotation (BTNode* r) {
BTNode* aux = getRight(r);
setRight(r, getLeft(aux));
setLeft(aux, r);
return aux;
}


Rotação a esquerda
r
10
20
30
5
40
15
aux

BTNode* rightRotation (BTNode* r) {
BTNode* aux = getLeft(r);
setLeft(r, getRight(aux));
setRight(aux, r);
return aux;
}



Rotação a esquerda

Rotações duplas
// rotação dupla a direita
BTNode* rightDoubleRotation (BTNode* r) {
setLeft(r, leftRotation(getLeft(r)));
return rightRotation (r);
}

// rotação dupla a esquerda
BTNode* leftDoubleRotation (BTNode* r) {
setRight(r, rightRotation(getRight
(r)));
return leftRotation (r);
}

BTNode* balance (BTNode* r) {
int fb;
if (r == NULL) return NULL;
fb = height (getLeft(r)) - height (getRight(r));
if (fb < -1) {
if (height( getRight (getRight(r))) > height( getLeft (getRight(r))))
return leftRotation (r);
else
return leftDoubleRotation (r);
}else if (fb > 1) {
if (height( getLeft (getLeft(r))) > height( getRight (getLeft(r))))
return rightRotation (r);
else
return rightDoubleRotation (r); }
return r;
}

Como usar o algoritmo de
balanceamento ?

Nas operações de inserção e
remoção
// inserção
BTNode *BSTinsert (BTNode *r, int x) {
if (r == NULL)
r = Node (x, NULL, NULL);
else if (x < getElement(r) )
setLeft( r, BSTinsert(getLeft(r), x ) );
else
setRight( r, BSTinsert(getRight(r), x ) );
return balance(r);
}

Qual o problema SÉRIO com
este nosso algoritmo ?

Qual o problema SÉRIO com
este nosso algoritmo ?
A operação que calcula a altura
da árvore não está eficiente.

Sua complexidade é linear,
como torná-la constante ?

Uma verdadeira AVL
A codificação de uma AVL necessita que o
cálculo da altura seja constante, caso contrário
ela será eficiente na busca porém MUITO
ineficiente nas inserções e remoções.

AVL
typedef struct AVL {
int e;
int height;
struct AVL *l;
struct AVL *r;
} AVL;

int height (AVL* r) {
if ( r == NULL ) return -1;
else return r->height;
}

adiciona mais uma
variavel a estrutura
a função altura agora tem
complexidade constante

AVL
Contudo, teremos atualizar a altura para cada:

●inserção
●remoção
●rotações

Atividades
Acessem