Você está na página 1de 92

rvores Balanceadas

AVL
Prof: Sergio Souza Costa

Sobre mim
Srgio Souza Costa
Professor - UFMA
Doutor em Computao Aplicada (INPE)
prof.sergio.costa@gmail.com

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

Introduo

As rvores binrias de busca permitem a


organizao da informao com o objetivo a
otimizar as buscas.

Introduo

As rvores binrias de busca permitem a


organizao da informao com o objetivo a
otimizar as buscas.
Ela permite o acesso mais rapido aos
elementos dado que os elementos esto
organizados na rvore, obedecendo uma
certa propriedade.

Esquerda so os menores que a raiz


Direita so os maiores que a raiz

Introduo

As rvores binrias de busca (ABB)


estudadas tm uma sria desvantagem
que pode afetar o tempo necessrio para
recuperar um item armazenado.

Introduo
Insiram os seguintes valores em uma rvore
binria de busca (ABB):
1, 2, 3, 4, 5, 6, 7

4, 6, 2, 5, 1, 7, 3

O que vocs concluem com isso ?

Introduo
A desvantagem que o desempenho da ABB depende
da ordem em que os elementos so inseridos.

Introduo
A desvantagem que o desempenho da ABB depende
da ordem em que os elementos so inseridos.
Idealmente, deseja-se que a rvore esteja balanceada,
para qualquer n p da rvore.

Introduo
A desvantagem que o desempenho da ABB depende
da ordem em que os elementos so inseridos.
Idealmente, deseja-se que a rvore esteja balanceada,
para qualquer n p da rvore.
Como saber se a rvore est balanceada ?

Introduo

A altura dos ns
um importante
A desvantagem que o desempenho dadado.
ABB depende
da ordem em que os elementos so inseridos.
Idealmente, deseja-se que a rvore esteja balanceada,
para qualquer n p da rvore.
Como saber se a rvore est balanceada ?

AVL

O nome AVL vem de seus criadores Adelson Velsky e Landis


(1962).

Uma rvore binria de pesquisa T denominada AVL se:

Para todos ns de T, as alturas de suas duas sub-rvores


diferem no mximo de uma unidade.
a)

b)

20

30

10

35

30

10

40

Qual AVL ? Que n


esta desbalanceado ?

20

35

40

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 relao 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 (diferena de
2 elementos) considerado desbalanceado e requer um
balanceamento.

AVL - Calculando o fator


Coloque as alturas de cada n

20

30

10

40
35

AVL - Calculando o fator


3

Coloque as alturas de cada n

20
2

0
30

10

1
-1

-1
-1

40

0
35

-1
-1

-1

AVL - Calculando o fator


3

Coloque as alturas de cada n

20
2

Calcule o fator de balanceamento

30

10

altura (SAE) - altura (SAD)

1
-1

-1
-1

40

0
35

-1
-1

-1

AVL - Calculando o fator


3

0 - 2 = -2

20
2

0
30

10

1
-1

-1
-1

40

0
35

-1
-1

-1

altura (SAE) - altura (SAD)

AVL - Calculando o fator


3 (-2)

0 - 2 = -2

20
2

0
30

10

1
-1

-1
-1

40

0
35

-1
-1

-1

altura (SAE) - altura (SAD)

AVL - Calculando o fator


3 (-2)
20

-1 - 1 = -2
2

0
30

10

1
-1

-1
-1

40

0
35

-1
-1

-1

altura (SAE) - altura (SAD)

AVL - Calculando o fator


3 (-2)
20

-1 - 1 = -2
2 (-2)

0
30

10

1
-1

-1
-1

40

0
35

-1
-1

-1

altura (SAE) - altura (SAD)

AVL - Calculando o fator


3 (-2)
20
2 (-2)

0 (0)
30

10

1 (1)
-1

-1
-1

40

0 (0)
35

-1
-1

-1

altura (SAE) - altura (SAD)

AVL - Calculando o fator


3 (-2)

Uma rvore binria de pesquisa T


denominada AVL se:

20
2 (-2)

0 (0)

Para todos ns de T, as alturas de

30

10

suas duas sub-rvores diferem no


mximo de uma unidade.

1 (1)
-1

-1
-1

40

0 (0)
35

-1
-1

-1

altura (SAE) - altura (SAD)

AVL - Calculando o fator


3 (-2)

Uma rvore binria de pesquisa T


denominada AVL se:

20
2 (-2)

0 (0)

Para todos ns de T, as alturas de

30

10

suas duas sub-rvores diferem no


mximo de uma unidade.

1 (1)
-1

-1
-1

40

0 (0)
35

-1
-1

-1

altura (SAE) - altura (SAD)

Atividades
Insira os seguintes valores em uma rvore
binria, coloque os fatores de balanceamento e
diga se ou no 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 ?
Atravs de operaes de
rotaes!!!!

Rotaes
Existem quatro operaes de rotaes:
Rotao simples Esquerda
Rotao simples Direita
Rotao Dupla Esquerda
Rotao Dupla Direita

Rotaes
Existem quatro operaes de

As duplas so
derivadas das
simples
rotaes:

Rotao simples Esquerda


Rotao simples Direita
Rotao Dupla Esquerda
Rotao Dupla Direita

Rotaes

Quando usar as Rotaes ?

Na insero de um elemento
e na remoo de um elemento

provado que no mximo uma rotao


suficiente para realizar o balanceamento de
uma rvore quando inserido ou removido
um elemento

Rotaes e balanceamento
Vamos ver primeiro as operaes de rotao e
depois usa-las para balanceamento.

Rotaes

Rotao a direita

Rotao a direita

Rotao a esquerda

Rotao a direita

Rotao a direita
30

20

10

Imagine a seguinte
rvore....

Rotao a direita

Imagine a seguinte
rvore....
20

30

20

10

10

30

Rotao a direita

Imagine a seguinte
rvore....
20

30

20

10

10

30

Rotao 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]

Rotao a esquerda

Rotao 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]

Rotao dupla a esquerda

Rotao 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]

Rotao dupla a direita

Rotao 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 rotaes para


manter uma rvore balanceada, ou
seja, uma AVL ?

Balanceamento
Ao inserir um novo elemento em uma rvore,
pode ser que um dos seus ns ascendentes se
torne desbalanceado, av, bisav ...

Balanceamento
Algoritmo:
A cada insero, checa-se os ns ascedentes.

Balanceamento
Algoritmo:
Aplica-se, o mesmo algoritmo de insero
da rvore binria de busca.
A cada insero, checa-se os ns
ascedentes.
Caso o n esteja desbalanceado, existem
quatro diferentes configuraes, como
veremos a seguir.
Para cada configrao, existe uma rotao indicada.

altura (SAE) - altura (SAD)

Exemplo
[

10

10, 20, 30]

altura (SAE) - altura (SAD)

Exemplo
[10,

10

FB: -1 - 0 = -1 OK
20

20, 30]

altura (SAE) - altura (SAD)

Exemplo
[10, 20,

10
20

30

30]

altura (SAE) - altura (SAD)

Exemplo
[10, 20,

30]

10
20

FB: -1 - 0 = -1 OK
30

altura (SAE) - altura (SAD)

Exemplo
[10, 20,

30]

FB: -1 - 1 = -2 Perigo: desbalanceado

10
20

30

altura (SAE) - altura (SAD)

Exemplo
[10, 20,

30]

FB: -1 - 1 = -2 Perigo: desbalanceado

10
20

30

Qual a rotao indicada


neste caso ?

altura (SAE) - altura (SAD)

Exemplo
[10, 20,

30]

FB: -1 - 1 = -2 Perigo: desbalanceado

10
20

30

Qual a rotao indicada


neste caso ?
Rotao simples a
esquerda.

altura (SAE) - altura (SAD)

Exemplo

[10, 20, 30]

20

10

30

altura (SAE) - altura (SAD)

Exemplo
[10, 20, 30,

20

10

30

40

40]

altura (SAE) - altura (SAD)

Exemplo
[10, 20, 30, 40

20

10

30

40

35

, 35]

altura (SAE) - altura (SAD)

Exemplo
[10, 20, 30, 40

, 35]

FB: -1 - 1 = -2 Perigo: desbalanceado

20

10

30

40

35

altura (SAE) - altura (SAD)

Exemplo
[10, 20, 30, 40

, 35]

FB: -1 - 1 = -2 Perigo: desbalanceado

20

10

30

Qual a rotao indicada


neste caso ?
40

35

altura (SAE) - altura (SAD)

Exemplo
[10, 20, 30, 40

, 35]

FB: -1 - 1 = -2 Perigo: desbalanceado

20

10

30

Qual a rotao indicada


neste caso ?
40

Rotao dupla a
esquerda.
35

altura (SAE) - altura (SAD)

Exemplo
[10, 20, 30, 40

20
rotao
direita
10

30

40

35

, 35]

altura (SAE) - altura (SAD)

Exemplo
[10, 20, 30, 40

20

10

30

35

40

, 35]

altura (SAE) - altura (SAD)

Exemplo
[10, 20, 30, 40

rotao
esquerda

20

10

30

35

40

, 35]

altura (SAE) - altura (SAD)

Exemplo
[10, 20, 30, 40

20

FB: 0 - 1 = -1 OK
continua a checagem com o no
ascendente.

35

10

30

, 35]

40

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]

Codificao
Transformando uma rvore binria de
busca em AVL ...

Codificao
Transformando uma rvore binria de
busca em AVL ...
baixem o seguinte cdigo:
https://sites.google.com/site/skosta/teaching/2011-2/sif120/arquivos/arvore_binaria.c?attredirects=0&d=1

Rotaes
Os algoritmos de rotao sero os primeiros a
serem codificados:
rotao a esquerda
rotao a diretia

Rotao a esquerda

BTNode* leftRotation (BTNode* r) {


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

Rotao a esquerda

BTNode* leftRotation (BTNode* r) {


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

10
20

30
15
40

Rotao a esquerda

BTNode* leftRotation (BTNode* r) {


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

10
20

30
15
40

Rotao a esquerda

BTNode* leftRotation (BTNode* r) {


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

aux
10
20

30
15
40

Rotao a esquerda

BTNode* leftRotation (BTNode* r) {


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

aux
10
20

30
15
40

Rotao a esquerda

BTNode* leftRotation (BTNode* r) {


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

aux
10

20
30
15
40

Rotao a esquerda

BTNode* leftRotation (BTNode* r) {


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

aux
10

20
30
15
40

Rotao a esquerda

BTNode* leftRotation (BTNode* r) {


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

30
10
40

15

Rotao a esquerda

BTNode* rightRotation (BTNode* r) {


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

Rotao a esquerda

Rotaes duplas
// rotao dupla a direita
BTNode* rightDoubleRotation (BTNode* r) {
setLeft(r, leftRotation(getLeft(r)));
return rightRotation (r);
}
// rotao 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 operaes de insero e


remoo
// insero
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 SRIO com


este nosso algoritmo ?

Qual o problema SRIO com


este nosso algoritmo ?

A operao que calcula a altura


da rvore no est eficiente.
Sua complexidade linear,
como torn-la constante ?

Uma verdadeira AVL


A codificao de uma AVL necessita que o
clculo da altura seja constante, caso contrrio
ela ser eficiente na busca porm MUITO
ineficiente nas inseres e remoes.

AVL

adiciona mais uma


variavel a estrutura

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;
a funo altura agora tem
}
complexidade constante

AVL
Contudo, teremos atualizar a altura para cada:
insero
remoo
rotaes

Atividades
Acessem

Você também pode gostar