• Nenhum resultado encontrado

E STRUTURAS DED ADOSE A LGORITMOS Á RVOREB

N/A
N/A
Protected

Academic year: 2019

Share "E STRUTURAS DED ADOSE A LGORITMOS Á RVOREB"

Copied!
23
0
0

Texto

(1)

E

STRUTURASDE

D

ADOS E

A

LGORITMOS

Á

RVORE

B

ALANCEADA

AVL

Adalberto Cajueiro

Departamento de Sistemas e Computação Universidade Federal de Campina Grande 1

ÁRVORE BINÁRIA

Qual o tempo das operações de inserção e busca

em uma BST?

O que acontece quando uma BST possui uma

topologia que

pesa

muito para um dos lados?

Seria possível uma árvore se reorganizar

dinamicamente para garantir operacoes em

tempo O(log n)?

6 2 1

8 6

2

(2)

ÁRVORE BINÁRIA BALANCEADA (AVL)

Origem:

A

delson-

V

elskii, G.; E. M.

L

andis (1962).

"

An algorithm for the organization of

information

".

Proceedings of the USSR

Academy of Sciences

146: 263

266. (Russian)

English translation by Myron J. Ricci in

Soviet Math. Doklady

, 3:1259

1263, 1962.

AVL (Adelson-Velskii e Landis)

3

ÁRVORE BINÁRIA BALANCEADA (AVL)

É uma árvore binária de busca (BST) cujo

objetivo é remover o problema do pior caso

onde a altura é O(n).

Uso de invariante:

Balanceamento: a altura das sub-árvores

diferem no máximo em 1.

(3)

EXEMPLO

altura

5

EXERCÍCIO

Quais destas árvores são AVL?

42

88 15

94

6 63

71 57 27

20

42

88 15

63

71 57 27

20 42

(4)

EXERCÍCIO

Quais destas árvores são AVL?

7 42

88 15

94

6 63

71 57 27 20 Árvore AVL 42 88 15 63 71 57 27 20

Não é árvore AVL!

42

88 28

94 6 27 63

Não é árvore AVL!

ÁRVORE BINÁRIA BALANCEADA (AVL)

Buscas, insercoes e remocoes possuem

complexidade O(log n).

Insercoes e remocoes podem requerer o

rebalanceamento

da árvore.

O fator de balanceamento é dado pela diferença:

height(left)-height(right)

e indica para onde a

árvore pesa:

-1: a árvore pesa para a direita

0: nao pesa pra nenhum lado

1 a arvore pesa para a esquerda

Operacoes de rotação reajustam a arvore.

(5)

ÁRVORE BINÁRIA BALANCEADA (AVL)

A busca realizada em uma árvore AVL é

igual

a

realizada em uma

árvore binária de busca

9

ALTURA: TEOREMA

A altura de uma árvore AVL com N nós internos

sempre está entre:

(6)

ÁRVORE BINÁRIA BALANCEADA (AVL)

Inserçoes

 As insercoes funcionam exatamente como na árvore binaria de busca

Entretanto

 Insercoes podem desbalancear a árvore!

Como resolver?

 Usando operações de rotacao

 O fator de balanceamento diz quando aplicar rotação

11

ÁRVORE BINÁRIA BALANCEADA (AVL)

Rotação

 Operação sobre arvores binarias que muda as estruturas sem interferir na ordem dos elementos.

 Move um nó pra cima e um nó para baixo

Quais os efeitos imediatos de uma rotação?

(7)

ÁRVORE BINÁRIA BALANCEADA (AVL)

Rotação

 Operação sobre arvores binarias que muda as estruturas sem interferir na ordem dos elementos.

 Move um nó pra cima e um nó para baixo

Quais os efeitos imediatos de uma rotação?

 A altura de uma sub-árvore diminui enquanto a altura da outra aumenta.

 Garante uma árvore proxima do preenchimento completo (melhor caso).

 Operações de inserção e busca em O(log n).

13

ÁRVORE BINÁRIA BALANCEADA (AVL)

Rotação

Simples: ocorre quando um nó está

desbalanceado e seu filho estiver

inclinado

no

mesmo sentido (ou sem inclinação).

Dupla ocorre quando um nó estiver

(8)

ROTACAO SIMPLES

15

ROTACAO SIMPLES

(9)

ROTACAO

Generalizacao da rotacao:

 Root – nó pai das subarvores a serem rotacionadas

 Pivot – o nó que será o novo pai

 RS – filho do mesmo lado da rotacao (rotation side)

 OS – filho do lado oposto da rotacao (opposite side)

Pseudo-código:

Pivot = Root.OS Root.OS = Pivot.RS

Pivot.RS = Root Root = Pivot

17

ROTACAO

Generalizacao da rotacao:

 Root – nó pai das subarvores a serem rotacionadas

 Pivot – o nó que será o novo pai

 RS – filho do mesmo lado da rotacao (rotation side)

 OS – filho do lado oposto da rotacao (opposite side)

Pseudo-código:

Pivot = Root.OS Root.OS = Pivot.RS Pivot.RS = Root

Root = Pivot

root

Q

(10)

ROTACAO

Generalizacao da rotacao:

 Root – nó pai das subarvores a serem rotacionadas

 Pivot – o nó que será o novo pai

 RS – filho do mesmo lado da rotacao (rotation side)

 OS – filho do lado oposto da rotacao (opposite side)

Pseudo-código:

Pivot = Root.OS Root.OS = Pivot.RS

Pivot.RS = Root Root = Pivot

root

Q

P C

A B 19

ROTACAO

Generalizacao da rotacao:

 Root – nó pai das subarvores a serem rotacionadas

 Pivot – o nó que será o novo pai

 RS – filho do mesmo lado da rotacao (rotation side)

 OS – filho do lado oposto da rotacao (opposite side)

Pseudo-código:

root

pivot Q

P C

A B

Pivot = Root.OS Root.OS = Pivot.RS Pivot.RS = Root

Root = Pivot

(11)

ROTACAO

Generalizacao da rotacao:

 Root – nó pai das subarvores a serem rotacionadas

 Pivot – o nó que será o novo pai

 RS – filho do mesmo lado da rotacao (rotation side)

 OS – filho do lado oposto da rotacao (opposite side)

Pseudo-código:

root

pivot Q

P C

A B

Pivot = Root.OS Root.OS = Pivot.RS

Pivot.RS = Root Root = Pivot

21

ROTACAO

Generalizacao da rotacao:

 Root – nó pai das subarvores a serem rotacionadas

 Pivot – o nó que será o novo pai

 RS – filho do mesmo lado da rotacao (rotation side)

 OS – filho do lado oposto da rotacao (opposite side)

Pseudo-código:

root

pivot Q

P C

Pivot = Root.OS Root.OS = Pivot.RS Pivot.RS = Root

(12)

ROTACAO

Generalizacao da rotacao:

 Root – nó pai das subarvores a serem rotacionadas

 Pivot – o nó que será o novo pai

 RS – filho do mesmo lado da rotacao (rotation side)

 OS – filho do lado oposto da rotacao (opposite side)

Pseudo-código:

root

pivot Q

P C

A B

Pivot = Root.OS Root.OS = Pivot.RS Pivot.RS = Root Root = Pivot

23

ROTACAO

Generalizacao da rotacao:

 Root – nó pai das subarvores a serem rotacionadas

 Pivot – o nó que será o novo pai

 RS – filho do mesmo lado da rotacao (rotation side)

 OS – filho do lado oposto da rotacao (opposite side)

Pseudo-código:

root

pivot Q

P C

A B

Pivot = Root.OS Root.OS = Pivot.RS

Pivot.RS = Root

Root = Pivot

(13)

ROTACAO

Generalizacao da rotacao:

 Root – nó pai das subarvores a serem rotacionadas

 Pivot – o nó que será o novo pai

 RS – filho do mesmo lado da rotacao (rotation side)

 OS – filho do lado oposto da rotacao (opposite side)

Pseudo-código:

root

pivot Q

P C

A B

Pivot = Root.OS Root.OS = Pivot.RS Pivot.RS = Root Root = Pivot

25

ROTACAO

Generalizacao da rotacao:

 Root – nó pai das subarvores a serem rotacionadas

 Pivot – o nó que será o novo pai

 RS – filho do mesmo lado da rotacao (rotation side)

 OS – filho do lado oposto da rotacao (opposite side)

Pseudo-código:

root

P Pivot = Root.OS

Root.OS = Pivot.RS Pivot.RS = Root Root = Pivot

(14)

ROTACAO

Generalizacao da rotacao:

 Root – nó pai das subarvores a serem rotacionadas

 Pivot – o nó que será o novo pai

 RS – filho do mesmo lado da rotacao (rotation side)

 OS – filho do lado oposto da rotacao (opposite side)

Pseudo-código:

root Q P C A B Pivot = Root.OS

Root.OS = Pivot.RS Pivot.RS = Root Root = Pivot

pivot

Qual a ordem de complexidade da rotacao?

27

ROTACAO: ANALISE DE CASOS

Representacao

Casos: Left-Left e Right-Right

 Resolvidos com rotacao SIMPLES no sentido contrário da inclinacao

 Left-Left: raiz pesa pra esquerda e filho esquerdo pesa pra esquerda ou esta balanceado: rotação pra direita na raiz

 Right-right: raiz pesa pra direita e filho pesa pra direita ou esta balanceado: rotação pra esquerda na raiz

1

0

2 -2

-1 0 0 0 2 0 -2 0 0 0

LL RR

(15)

ROTACAO: ANALISE DE CASOS

Representacao

Casos: Left-Right e Right-Left

 Resolvidos rotação DUPLA seguindo o mesmo sentido do caso aplicando primeiro no filho e depois no pai

 Left-Right: raiz pesa pra esquerda e filho esquerdo

pesa pra direita: rotacao esquerda no filho e direita no pai

 Right-Left: raiz pesa pra direita e filho direito pesa

pra esquerda: rotacao direita no filho e esquerda no pai

-1

0

2 -2

1

0

LR RL

29

(16)

OPERAÇÕES SOBRE ARVORE AVL

Inserções:

 Insere normalmente e depois reajusta a árvore (se necessário) para deixá-la balanceada novamente

Remoções:

 Remove o nó normalmente como na BST depois reajusta a árvore (se necessário) para deixá-la balanceada novamente

Fazem uso de rotações convenientes em nós

desbalanceados: simples (LL,RR) ou dupla (RL,

LR)

Abordagem recursiva é mais simples para ambas

as operações

31

ARVORE AVL

Questoes de implementacao

 Como seria implementada uma arvore AVL em Java?

 É possível usar herança na implementação de AVL?

(17)

ARVORE AVL

Questoes de implementacao

 Como seria implementada uma arvore AVL em Java?

 É possível usar herança na implementação de AVL?

public interface AVLTree<T extends Comparable<T>> extends BST<T>{

}

33

ARVORE AVL

Que métodos precisam ser redefinidos?

public interface AVLTreeImpl<T extends Comparable<T>> extends BSTImpl<T>{

public boolean isEmpty(); public int height();

public boolean search(T element); public void insert(T element); public T maximum();

public T minimum();

public void remove(T element); public T[] preOrder();

(18)

ARVORE AVL

Que métodos precisam ser redefinidos?

public interface AVLTreeImpl<T extends Comparable<T>> extends BSTImpl<T>{

public boolean isEmpty(); public int height();

public boolean search(T element); public void insert(T element); public T maximum();

public T minimum();

public void remove(T element); public T[] preOrder();

public T[] order(); public T[] postOrder(); public int size();

}

35

ARVORE AVL

Como seria a redefinição da inserção?

Insert (T element){

Insert-recursive(root,element); }

Insert-recursive(BSTNode node, T element){ ...

}

(19)

ARVORE AVL

Como seria a redefinição da inserção?

Insert-recursive(BSTNode node, T element){ if(node=NIL){

node.data = element node.left = NIL node.right = NIL }else{

if(element < node.data){

Insert-recursive (node.left, element) }else if (element > node.data){

Insert-recursive (node.right, element) }

rebalance(node) }

} 37

ARVORE AVL

Como seria a redefinição da remoção?

remove (T element){

BSTNode<T> found = search(element); remove-recursive(found);

}

Remove-recursive(BSTNode node){ ...

(20)

ARVORE AVL

Como seria a redefinição da remoção?

node = NIL

rebalanceUp(node)

}else if (node has one child){

if node != root if(node is left child){ if(node.left != NIL)

node.left is left child of node.parent else

node.right is left child of node.parent else //node is right child

if(node.left != NIL)

node.left is right child of parent else

node.right is right child of parent else

root = not NIL child rebalanceUp(node)

}else{

BSTNode sucessor = sucessor(node); node.data = sucessor.data

Remove-recursive (sucessor); } } } 39

ARVORE AVL

Como seria a redefinição da remoção?

Remove-recursive(BSTNode node) {

if(node != NIL){ if(node is leaf){ node = NIL

rebalanceUp(node)

}else if (node has one child){ if node != root

if(node is left child){ if(node.left != NIL)

node.left is left child of node.parent else

node.right is left child of node.parent else //node is right child

if(node.left != NIL)

node.left is right child of parent else

node.right is right child of parent else

root = not NIL child rebalanceUp(node) }else{

BSTNode sucessor = sucessor(node); node.data = sucessor.data;

Remove-recursive (sucessor); }

}

rebalanceUp(BSTNode<T> node) { BSTNode parent = node.parent while (parent != null) {

rebalance(parent); parent = parent.parent; }

}

(21)

ARVORE AVL

Que métodos auxilares a AVL precisa ter?

public interface AVLTreeImpl<T extends Comparable<T>> extends BSTImpl<T>{

public void insert(T element); public void remove(T element);

}

41

ARVORE AVL

Que métodos auxilares a AVL precisa ter?

public interface AVLTreeImpl<T extends Comparable<T>> extends BSTImpl<T>{

public void insert(T element); public void remove(T element);

private int calculateBalance(BSTNode<T> node)

private void rebalance(BSTNode<T> node) private void rebalanceUp(BSTNode<T> node) private void leftRotation(BSTNode<T> node) private void rightRotation(BSTNode<T> node)

(22)

ARVORE AVL

Como seria o método calcular o balance de uma

árvore AVL?

int calculateBalance(BSTNode<T> node) { if node != NIL

return height (node.left) – height (node.right) }

43

ARVORE AVL

Como seria o rebalanceamento de uma arvore?

void rebalance(BSTNode<K,V> node){ balance = calculateBalance(node) se |balance| > 1

determina o caso de balanceamento aplica a rotacao adequada (LL,RR,LR,RL) }

(23)

ARVORE AVL

Como seriam os métodos de rotacao a esquerda e

a direita?

É só implementar o algoritmo genérico

Uma implementacao é o espelho (inverso) da outra

Pivot = Root.OS

Root.OS = Pivot.RS

Pivot.RS = Root

Root = Pivot

45

REFERÊNCIAS

Seção 7.4

Referências

Documentos relacionados

Estudo do Meio (Descoberta das inter-relações entre espaços: o contacto entre a terra e o mar.. Exemplo de abordagem Articulação com conteúdos

da quem praticasse tais assaltos às igrejas e mosteiros ou outros bens da Igreja, 29 medida que foi igualmente ineficaz, como decorre das deliberações tomadas por D. João I, quan-

hands of the judiciary, a sort of way to apply effectively regulated justice, not an extension of justice, it is not king acting through its apparatus of justice, the king is

 Cada elemento (nó) da lista contém um dado armazenado e um apontador para o próximo elemento da lista?.  Estrutura recursiva com

 Para algumas aplicações, skip lists são mais naturais que árvore e levam a algoritmos mais simples e fáceis de implementar..  Performance melhorada por um fator constante em

 Alguns conjuntos dinamicos pressupoem que existe uma relação de ordem entre as chaves.. Isso permite falar do próximo elemento ao invés de um elemento

 Chaves que colidam precisam ter seu hash code “recalculado” para encontrar um slot vazio?.  Todas as chaves estão em

 A alocação dinâmica é muito utilizada em problemas de estrutura de dados como por exemplo, listas encadeadas, pilhas, filas, arvores binárias e grafos ...  O interessante