A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Universidade do Vale do Rio dos Sinos - São Leopoldo -

Apresentações semelhantes


Apresentação em tema: "Universidade do Vale do Rio dos Sinos - São Leopoldo -"— Transcrição da apresentação:

1 Universidade do Vale do Rio dos Sinos - São Leopoldo -
Programação II Prof. Mateus Raeder Transparências baseadas nos originais da profa. Renata Galante da II/UFRGS Universidade do Vale do Rio dos Sinos - São Leopoldo -

2 Árvores Binárias de Pesquisa
Apresentam uma relação de ordem A ordem é definida pela chave Operações: inserir consultar excluir 500 300 800 150 400 600 900 Programação II – Prof. Mateus Raeder 2

3 Programação II – Prof. Mateus Raeder
Problemas com ABP Exemplo: Inserção: 10, 5, 15, 20, 25, 30, 35 Inserção: 1, 13, 24, 27, 56 10 5 15 20 25 30 35 Programação II – Prof. Mateus Raeder 3

4 Problemas com ABP Solução: Árvores AVL (Árvores Balanceadas)
Desbalanceamento progressivo Exemplo: inserção: 1, 13, 24, 27, 56 1 Solução: Árvores AVL (Árvores Balanceadas) 13 24 27 56 Programação II – Prof. Mateus Raeder 4

5 Balanceamento de Árvores
Distribuição equilibrada dos nós otimizar as operações de consulta diminuir o número médio de comparações Distribuição uniforme não uniforme chaves mais solicitadas mais perto da raiz Programação II – Prof. Mateus Raeder 5

6 Programação II – Prof. Mateus Raeder
Por Frequência Por frequência de acesso Pressupõe distribuição não uniforme de acessos 500 800 400 900 600 550 50% 12% 25% 4% 5% Balanceamento por distribuição de acessos! Programação II – Prof. Mateus Raeder 6

7 Programação II – Prof. Mateus Raeder
Árvores AVL Adelson-Velskii e Landis (1962) Fator de um nó Fator = (altura_subarv_esq) – (altura_subarv_dir) Programação II – Prof. Mateus Raeder

8 Programação II – Prof. Mateus Raeder
Árvores AVL Relembrando: NÍVEL de um nó: número de nós entre ele e a raiz (contando ele próprio) ALTURA (ou Profundidade) da árvore: é o seu maior nível A Nível 1 B C Nível 2 ALTURA = 4 D E Nível 3 F G Nível 4 Programação II – Prof. Mateus Raeder

9 Árvores AVL Adelson-Velskii e Landis (1962) Fator de um nó A B C D E G
Fator = (altura_subarv_esq) – (altura_subarv_dir) A B C D E G H I J Qual o fator dos nós da árvore ao lado? Programação II – Prof. Mateus Raeder

10 Programação II – Prof. Mateus Raeder
Árvores AVL Uma árvore AVL é uma árvore binária de pesquisa (ABP) construída de tal modo que a altura de sua subárvore direita difere da altura da subárvore esquerda de no máximo 1 ou seja, o fator de nó deve ser -1, 0, 1. Também chamada de árvore balanceada. A B C D E G H I J +3 -2 -1 Não é árvore AVL Programação II – Prof. Mateus Raeder 10

11 Programação II – Prof. Mateus Raeder
Exercício: Verifique quais das ABP são AVL: 120 130 100 130 100 150 80 200 80 200 110 120 110 150 Programação II – Prof. Mateus Raeder 11

12 Programação II – Prof. Mateus Raeder
Exercício: Resposta Verifique quais das ABP são AVL: 120 -1 130 +1 100 130 -2 -1 100 150 -1 +1 80 110 200 +1 80 120 200 110 150 AVL Não AVL Programação II – Prof. Mateus Raeder 12

13 Programação II – Prof. Mateus Raeder
Exercício Verifique quais das ABP são AVL: 42 42 15 88 15 88 6 27 63 94 27 63 20 57 71 20 57 71 42 15 88 6 27 63 94 Programação II – Prof. Mateus Raeder 13

14 Programação II – Prof. Mateus Raeder
Exercício: Resposta Verifique quais das ABP são AVL: 42 42 -1 15 88 +1 -2 15 88 +2 +1 6 27 63 94 27 +1 63 20 57 71 20 57 71 AVL Não AVL 42 15 88 AVL: completamente balanceada 6 27 63 94 Programação II – Prof. Mateus Raeder 14

15 Programação II – Prof. Mateus Raeder
Operações por exemplo: INSERÇÃO deve ser preservada a propriedade AVL Reestruturar a árvore Programação II – Prof. Mateus Raeder 15

16 Programação II – Prof. Mateus Raeder
Operações Como manter uma árvore AVL sempre balanceada após uma inserção ou exclusão? Através de uma operação de ROTAÇÃO Característica da operação preserva a ordem das chaves basta uma execução da operação de rotação para tornar a árvore AVL novamente Programação II – Prof. Mateus Raeder 16

17 Programação II – Prof. Mateus Raeder
AVLNode public class AvlNode { protected int height; protected int key; protected AvlNode left, right; public AvlNode ( int theElement ) { this( theElement, null, null ); } public AvlNode ( int theElement, AvlNode lt, AvlNode rt ) { key = theElement; left = lt; right = rt; height = 0; public int getHeight() { return height; public void setHeight(int height) { this.height = height; Programação II – Prof. Mateus Raeder

18 Programação II – Prof. Mateus Raeder
AVLNode public int getKey() { return key; } public void setKey(int key) { this.key = key; public AvlNode getLeft() { return left; public void setLeft(AvlNode left) { this.left = left; public AvlNode getRight() { return right; public void setRight(AvlNode right) { this.right = right; Programação II – Prof. Mateus Raeder

19 Balanceamento de Árvore AVL com Rotação
Rotação Simples à direita à esquerda Rotação Dupla à direita à esquerda Programação II – Prof. Mateus Raeder 19

20 ROTAÇÃO SIMPLES À DIREITA
Toda vez que uma subárvore fica com um fator: positivo e sua subárvore da esquerda também tem um fator positivo ROTAÇÃO SIMPLES À DIREITA Programação II – Prof. Mateus Raeder 20

21 Programação II – Prof. Mateus Raeder
Rotação Direita 120 110 150 100 130 200 80 Programação II – Prof. Mateus Raeder 21

22 Programação II – Prof. Mateus Raeder
Rotação Direita 120 +1 +2 110 150 +1 100 130 200 80 Programação II – Prof. Mateus Raeder 22

23 Programação II – Prof. Mateus Raeder
Rotação Direita 120 +1 ? Rotação Direita +2 110 150 +1 100 130 200 80 Programação II – Prof. Mateus Raeder 23

24 Programação II – Prof. Mateus Raeder
Rotação Direita 120 120 +1 Rotação Direita 100 110 150 +2 150 80 110 130 200 +1 100 130 200 80 Programação II – Prof. Mateus Raeder 24

25 Balanceamento de Árvore AVL com Rotação
Rotação Simples à direita k2 k1 x y z Nó k2 é a raiz de transformação X, Y e Z são subárvores (vazias ou não) Programação II – Prof. Mateus Raeder 25

26 Programação II – Prof. Mateus Raeder
Métodos auxiliares public class AvlTree { private AvlNode root = null; /** Retorna a altura da árvore */ private static int height ( AvlNode t ) { if(t == null) return 0; return t.height; //return t == null ? 0 : t.height; } /** Retorna o maior valor ente lhs e rhs. */ private static int max ( int lhs, int rhs ) { if(lhs > rhs) return lhs; return rhs; //return lhs > rhs ? lhs : rhs; /** Retorna o fator de balanceamento da árvore com raiz t */ private int getFactor (AvlNode t) { return height( t.left ) - height( t.right ); Programação II – Prof. Mateus Raeder

27 Programação II – Prof. Mateus Raeder
Rotação Direita k2 k1 Rotação Direita k1 z x k2 x y y z private static AvlNode doRightRotation( AvlNode k2 ) { AvlNode k1 = k2.left; k2.left = k1.right; k1.right = k2; k2.height = max( height( k2.left ), height( k2.right ) ) + 1; k1.height = max( height( k1.left ), k2.height ) + 1; return k1; } Programação II – Prof. Mateus Raeder 27

28 Programação II – Prof. Mateus Raeder
Rotação Direita 42 +1 42 15 88 6 27 +2 +1 4 15 88 Incluir 4 6 27 Programação II – Prof. Mateus Raeder 28

29 Programação II – Prof. Mateus Raeder
Rotação Direita 15 6 42 4 27 +1 88 Ajustado! 42 +2 Rotação Direita 15 +1 88 6 27 +1 4 Programação II – Prof. Mateus Raeder 29

30 Rotação Simples ESQUERDA
Toda vez que uma subárvore fica com um fator: negativo e sua subárvore da direita também tem um fator negativo ROTAÇÃO SIMPLES À ESQUERDA Programação II – Prof. Mateus Raeder 30

31 Rotação Simples ESQUERDA
120 -1 100 130 -2 80 110 150 -1 200 Programação II – Prof. Mateus Raeder 31

32 Rotação Simples ESQUERDA
120 -1 ? Rotação Esquerda 100 130 -2 80 110 150 -1 200 Programação II – Prof. Mateus Raeder 32

33 Rotação Simples ESQUERDA
120 120 Rotação Esquerda 100 150 100 130 80 110 130 200 80 110 150 200 Programação II – Prof. Mateus Raeder 33

34 Rotação Simples ESQUERDA
k2 k1 Rotação Esquerda k1 z x k2 x y y z Programação II – Prof. Mateus Raeder 34

35 Rotação Simples ESQUERDA
k2 k1 Rotação Esquerda k1 z x k2 x y y z private static AvlNode doLeftRotation( AvlNode k1 ) { AvlNode k2 = k1.right; k1.right = k2.left; k2.left = k1; k1.height = max( height( k1.left ), height( k1.right ) ) + 1; k2.height = max( height( k2.right ), k1.height ) + 1; return k2; } Programação II – Prof. Mateus Raeder 35

36 Rotação Simples ESQUERDA
42 15 88 94 67 -2 -1 1 90 42 -1 15 Incluir 90 88 67 94 Programação II – Prof. Mateus Raeder 36

37 Rotação Simples ESQUERDA
Ajustado! 42 -2 88 Rotação Esquerda 15 88 -1 42 94 +1 67 94 15 1 67 90 90 Programação II – Prof. Mateus Raeder 37

38 Rotação Dupla à Direita
Toda vez que uma subárvore fica com um fator: positivo e sua subárvore da esquerda tem um fator negativo ROTAÇÃO DUPLA À DIREITA Programação II – Prof. Mateus Raeder 38

39 Rotação Dupla à Direita
120 +1 110 +2 150 80 130 200 -1 100 Programação II – Prof. Mateus Raeder 39

40 Rotação Dupla à Direita
120 +1 Rotação Dupla Direita ? 110 +2 150 80 130 200 -1 100 Programação II – Prof. Mateus Raeder 40

41 Rotação Dupla à Direita
120 110 150 100 80 130 200 120 110 150 80 100 130 200 DIREITA ESQUERDA 120 100 150 80 110 130 200 Programação II – Prof. Mateus Raeder 41

42 Rotação Dupla à Direita
k3 k3 Rotação Esquerda k2 d k1 d 1 k1 c a k2 a b k2 b c k1 k3 Rotação Direita a b c d 2 Programação II – Prof. Mateus Raeder 42

43 Rotação Dupla à Direita
k3 k2 Rotação Dupla Direita k1 d k1 k3 a k2 a b c d b c private static AvlNode doDoubleRightRotation( AvlNode k3 ) { k3.left = doLeftRotation( k3.left ); return doRightRotation( k3 ); } Programação II – Prof. Mateus Raeder 43

44 Rotação Dupla à Direita
42 +1 42 15 88 27 6 +2 -1 34 15 Incluir 34 88 6 27 Programação II – Prof. Mateus Raeder 44

45 Rotação Dupla à Direita
PASSO 1 Rotação Esquerda 42 27 88 34 15 +2 +1 6 Rotação Dupla Direita 42 +2 15 -1 88 6 27 -1 34 Programação II – Prof. Mateus Raeder 45

46 Rotação Dupla à Direita
PASSO 2 Rotação Direita Rotação Dupla Direita 27 42 +2 15 +1 42 27 +1 88 6 34 88 +1 15 34 6 Programação II – Prof. Mateus Raeder 46

47 Rotação Dupla ESQUERDA
Toda vez que uma subárvore fica com um fator: negativo e sua subárvore da direita tem um fator positivo ROTAÇÃO DUPLA À ESQUERDA Programação II – Prof. Mateus Raeder 47

48 Rotação Dupla ESQUERDA
120 -1 100 130 -2 80 110 200 +1 150 Programação II – Prof. Mateus Raeder 48

49 Rotação Dupla ESQUERDA
120 -1 Rotação Dupla Esquerda ? 100 130 -2 80 110 200 +1 150 Programação II – Prof. Mateus Raeder 49

50 Rotação Dupla ESQUERDA
120 100 130 200 150 80 110 120 100 130 150 200 80 110 ESQUERDA DIREITA 120 100 150 80 110 130 200 Programação II – Prof. Mateus Raeder 50

51 Rotação Dupla ESQUERDA
120 120 Rotação Dupla Esquerda 100 150 100 130 80 110 130 200 80 110 200 150 Programação II – Prof. Mateus Raeder 51

52 Rotação Dupla ESQUERDA
DIREITA k1 k2 b c a k3 d k1 a k3 k2 d k2 k3 c d k1 a b ROTAÇÃO ESQUERDA b c Programação II – Prof. Mateus Raeder 52

53 Rotação Dupla ESQUERDA
k1 k2 a k3 Rotação Dupla Esquerda k1 k3 k2 d a b c d b c private static AvlNode doDoubleLeftRotation (AvlNode k1) { k1.right = doRightRotation( k1.right ); return doLeftRotation( k1 ); } Programação II – Prof. Mateus Raeder 53

54 Programação II – Prof. Mateus Raeder
Resumo: Rotações positivo e f. e. positivo negativo e f. d. negativo k1 k2 k1 k2 Rotação Esquerda Rotação Direita x k2 k1 z k1 z k2 x x y y z y z x y positivo e f. e. negativo negativo e f. d. positivo k1 Rotação Dupla Direita Rotação Dupla Esquerda k3 a k3 k2 k2 k1 d d k1 k2 k1 k3 k3 a k2 a b c d b c a b c d b c Programação II – Prof. Mateus Raeder

55 Exemplos de Rotação (Esquerda e Direita)
Considere a árvore abaixo, no qual 12 está entre 9 e 15. Fazendo a rotação direita em 9, onde ficará 12? Terminada a rotação a direita, tente agora a rotação a esquerda em 15. 15 9 15 DIREITA ESQUERDA 9 22 4 15 9 22 4 12 12 22 4 12 Programação II – Prof. Mateus Raeder 55

56 Inserção em Árvores AVL
220 120 300 100 150 260 400 80 110 130 200 250 270 350 500 Inserir 140 Programação II – Prof. Mateus Raeder 56

57 Inserção de nodos em árvores AVL Alguns Problemas
Percorre-se a árvore verificando se a chave já existe ou não Em caso positivo, encerra a tentativa de inserção Caso contrário, a busca encontra o local correto de inserção do novo nó Verifica-se se a inclusão tornará a árvore desbalanceada Em caso negativo, o processo termina Caso contrário, deve-se efetuar o balanceamento da árvore Descobre-se qual a operação de rotação a ser executada Executa-se a rotação Programação II – Prof. Mateus Raeder 57

58 Programação II – Prof. Mateus Raeder
Inserção em Árvore AVL private AvlNode insert (int x, AvlNode t) { if( t == null ) t = new AvlNode( x, null, null ); else if( x<t.key ) t.left = insert( x, t.left ); else if( x>t.key) t.right = insert( x, t.right ); if ( getFactor(t) == 2 ) { if (getFactor (t.left)>0) t = doRightRotation( t ); else t = doDoubleRightRotation( t ); } else if ( getFactor(t) == -2 ) { if ( getFactor(t.right)<0 ) t = doLeftRotation( t ); else t = doDoubleLeftRotation( t ); t.height = max( height( t.left ), height( t.right ) ) + 1; return t; Programação II – Prof. Mateus Raeder

59 Programação II – Prof. Mateus Raeder
Inserção em Árvore AVL public boolean insert (int x) { // se chave já existe na árvore retorna false if (search (x)!=null) return false; // insere chave na árvore root = insert (x, root); return true; } Programação II – Prof. Mateus Raeder

60 Remoção de nodos em árvores AVL
Caso parecido com as inclusões. No entanto, nem sempre se consegue solucionar com uma única rotação... Remover elemento e retornar do pai do nó removido até a raiz, verificando se cada nó do caminho precisa ser balanceado Programação II – Prof. Mateus Raeder 60

61 Programação II – Prof. Mateus Raeder
Remoção em Árvore AVL -1 32 -1 -1 16 48 -1 8 -1 24 40 56 28 36 44 52 60 58 62 deletando 8 Programação II – Prof. Mateus Raeder

62 Programação II – Prof. Mateus Raeder
Remoção em Árvore AVL -1 32 -2 -1 16 48 -1 -1 24 40 56 28 36 44 52 60 rotação simples à esquerda 58 62 faz balanceamento de nó pai de nó deletado Programação II – Prof. Mateus Raeder

63 Remoção em Árvore AVL -2 32 rotação simples à esquerda -1 24 48 -1 16 28 40 56 36 44 52 60 58 62 volta recursivamente até a raiz, balanceando todos os nós que se encontrarem desbalanceados Programação II – Prof. Mateus Raeder

64 Programação II – Prof. Mateus Raeder
Remoção em Árvore AVL 48 -1 32 56 24 40 52 60 16 28 36 44 58 62 Programação II – Prof. Mateus Raeder

65 Programação II – Prof. Mateus Raeder
Árvores AVL Applet que simula árvore AVL: Programação II – Prof. Mateus Raeder 65


Carregar ppt "Universidade do Vale do Rio dos Sinos - São Leopoldo -"

Apresentações semelhantes


Anúncios Google