Árvores balanceadas - AVL
Upcoming SlideShare
Loading in...5
×
 

Árvores balanceadas - AVL

on

  • 694 views

 

Statistics

Views

Total Views
694
Views on SlideShare
690
Embed Views
4

Actions

Likes
0
Downloads
23
Comments
0

1 Embed 4

https://mj89sp3sau2k7lj1eg3k40hkeppguj6j-a-sites-opensocial.googleusercontent.com 4

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Árvores balanceadas - AVL Árvores balanceadas - AVL Presentation Transcript

  • Árvores Balanceadas AVL Prof: Sergio Souza Costa
  • Sobre mim Sérgio Souza Costa Professor - UFMA Doutor em Computação 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
  • 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 altura dos nós é um importante A desvantagem é que o desempenho da ABB depende dado. 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 ?
  • 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. 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 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 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 0 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 binária de pesquisa T é denominada AVL se: 20 2 (-2) 0 (0) ○ Para todos nós de T, as alturas de 30 10 suas duas sub-árvores diferem no máximo 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 binária de pesquisa T é denominada AVL se: 20 2 (-2) 0 (0) ○ Para todos nós de T, as alturas de 30 10 suas duas sub-árvores diferem no máximo 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 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 As duplas são derivadas das simples rotações: Rotação simples à Esquerda Rotação simples à Direita Rotação Dupla à Esquerda Rotação Dupla à Direita
  • 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 Imagine a seguinte árvore.... 20 30 20 10 10 30
  • Rotação a direita Imagine a seguinte árvore.... 20 30 20 10 10 30
  • 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.
  • 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 rotação indicada neste caso ?
  • altura (SAE) - altura (SAD) Exemplo [10, 20, 30] FB: -1 - 1 = -2 Perigo: desbalanceado 10 20 30 Qual a rotação indicada neste caso ? Rotação 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 rotação 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 rotação indicada neste caso ? 40 Rotação dupla a esquerda. 35
  • altura (SAE) - altura (SAD) Exemplo [10, 20, 30, 40 20 rotação 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 rotação 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]
  • 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/sif120/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; } r 10 20 5 30 15 40 Rotação a esquerda
  • BTNode* leftRotation (BTNode* r) { BTNode* aux = getRight(r); setRight(r, getLeft(aux)); setLeft(aux, r); return aux; } r 10 20 5 30 15 40 Rotação a esquerda
  • BTNode* leftRotation (BTNode* r) { BTNode* aux = getRight(r); setRight(r, getLeft(aux)); setLeft(aux, r); return aux; } r aux 10 20 5 30 15 40 Rotação a esquerda
  • BTNode* leftRotation (BTNode* r) { BTNode* aux = getRight(r); setRight(r, getLeft(aux)); setLeft(aux, r); return aux; } r aux 10 20 5 30 15 40 Rotação a esquerda
  • BTNode* leftRotation (BTNode* r) { BTNode* aux = getRight(r); setRight(r, getLeft(aux)); setLeft(aux, r); return aux; } r aux 10 5 20 30 15 40 Rotação a esquerda
  • BTNode* leftRotation (BTNode* r) { BTNode* aux = getRight(r); setRight(r, getLeft(aux)); setLeft(aux, r); return aux; } r aux 10 5 20 30 15 40 Rotação a esquerda
  • BTNode* leftRotation (BTNode* r) { BTNode* aux = getRight(r); setRight(r, getLeft(aux)); setLeft(aux, r); return aux; } aux 20 r 30 10 40 5 15 Rotação a esquerda
  • 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 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 função altura agora tem } complexidade constante
  • AVL Contudo, teremos atualizar a altura para cada: ● inserção ● remoção ● rotações
  • Atividades Acessem