• 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

 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

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

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-