Anda di halaman 1dari 17

INF0208 Estruturas de Dados Profa.

: Helena Graziottin Ribeiro

RVORES BALANCEADAS O tempo de acesso a um n, em uma estrutura sob a forma de rvore, proporcional quantidade de comparaes realizadas at encontr-lo. Quanto menor este tempo, maior a eficincia no seu acesso. Uma rvore que mantm seus ns de forma ordenada, como a rvore binria de pesquisa, permite otimizar os acessos, uma vez que a busca direcionada pela ordenao do n pesquisado em relao aos demais (> ou <), evitando a procura na rvore inteira. A eficincia no acesso a um n est relacionada a dois fatores: - freqncia de acesso a cada n; - organizao da rvore. A freqncia de acesso determinada pela quantidade de vezes que um n procurado. Assim, se todos os smbolos forem igualmente procurados essa freqncia uniforme. Quanto organizao da rvore, pode-se verificar que a quantidade de comparaes necessrias numa rvore ordenada para localizar um n est relacionada com a distncia entre este n e a raiz da rvore. Assim, quanto mais perto da raiz estiverem os ns da rvore, mais depressa eles podem ser encontrados. Se a distncia de cada um dos ns em relao raiz for igual ou bastante prxima mdia das distncias dos ns em relao raiz, o tempo de acesso a cada um deles ser prximo aos dos demais. J se uma sub-rvore A1 da rvore A tiver muitos nveis e outra sub-rvore A2 poucos nveis, procurar um n em A1 poder levar muito mais tempo do que procurar um outro n em A2, principalmente se em ambos os casos os ns procurados forem folhas. Uma rvore que esteja organizada de forma que, para qualquer n, o comprimento da sua sub-rvore mais esquerda seja igual ou com uma diferena mnima em relao aos comprimentos das suas demais sub-rvores, denominada de rvore balanceada. H diferentes propostas de estruturao de rvores balanceadas, como rvores AVL, rvores 2-3, rvores-B e rvores B+. No caso das rvores binrias, a ordem na qual os smbolos so instalados na rvore que vai determinar a eficincia da localizao dos mesmos. E no possvel pr-determinar a ordem em que eles sero inseridos, para que se possa obter uma rvore balanceada. Dois casos bastante desfavorveis so: a) smbolos instalados na ordem de classificao (exemplo: 2-3-4-5-6-7-8-9); b) smbolos instalados em ziguezague: o primeiro, o ltimo, o segundo, o penltimo, o terceiro, o antepenltimo, etc. (exemplo: 2-9-3-8-4-7-5). Estas situaes geram rvores degeneradas, nas quais o tempo de acesso a cada elemento seria o mesmo para uma representao por listas.

rvores AVL (AVL-Trees) As rvores binrias de pesquisa tm uma sria desvantagem que pode afetar o tempo necessrio para recuperar um item armazenado, j que a estrutura da rvore depende da ordem em que os elementos so inseridos. Se os elementos forem inseridos j em ordem, a estrutura da rvore ser igual a de uma lista encadeada e o tempo mdio para recuperar uma informao da rvore aumenta. Uma maneira de corrigirmos esta deficincia das ABP controlar a montagem da estrutura da rvore. Idealmente queremos que a rvore esteja balanceada, ou seja, para um nodo p qualquer a altura da subrvore esquerda aproximadamente igual altura da subrvore direita. Obviamente h um custo extra de processamento para manter a rvore balanceada, mas que compensado quando os dados armazenados precisam ser recuperados muitas vezes. A idia de manter uma rvore binria balanceada dinamicamente, ou seja, enquanto os nodos esto sendo inseridos foi proposta em 1962 por 2 soviticos chamados Adelson-Velskii e Landis. Este tipo de rvore ficou ento conhecida como rvore AVL, pelas iniciais dos nomes dos seus inventores. Pertencem ao grupo das rvores balanceadas pela altura (height-balanced trees). So rvores binrias de pesquisa nas quais, para qualquer n, o comprimento de sua sub-rvore da esquerda no pode ser diferente do comprimento de sua sub-rvore da direita em mais de um n ( ou seja, a diferena no mximo de 1 n). Nos exemplos abaixo, (a) e (c) so rvores balanceadas, e (b) no, por causa do n marcado com o asterisco.

a) b c *

Aps a INSERO ou REMOO de 1 n, a rvore poder ficar desbalanceada (por um nvel). Por isso, sempre que uma destas operaes for realizada, ser necessrio verificar o balanceamento. Se a rvore estiver desbalanceada, ser necessrio aplicar uma funo de reestruturao da rvore, a qual, se for preciso, far uma relocao de todos os ns para que a rvore permanea ordenada e balanceada. Por definio uma rvore AVL uma rvore binria de pesquisa onde a diferena em altura entre as subrvores esquerda e direita no mximo 1 (positivo ou negativo). Assim, para cada nodo podemos definir um fator de balanceamento (FB), que vem a ser um nmero inteiro igual a
FB(nodo p) = altura(subrvore direita p) - altura(subrvore esquerda p)

A seguir exemplos de rvores AVL e rvores no-AVL. Os nmeros nos nodos representam o FB para cada nodo. Para uma rvore ser AVL os fatores de balanceamento devem ser necessariamente -1, 0, ou 1.

Exemplos de rvores AVL

Exemplos de rvores NO-AVL

O balanceamento de uma rvore envolve basicamente operaes de: rotao direita, rotao esquerda, rotao dupla direita e rotao dupla esquerda [5]. BALANCEAMENTO DE RVORES AVL

Como fazemos ento para manter uma rvore AVL balanceada? Inicialmente inserimos um novo nodo na rvore normalmente. A insero deste novo nodo pode ou no violar a propriedade de balanceamento. Caso a insero do novo nodo no viole a propriedade de balanceamento podemos ento continuar inserindo novos nodos. Caso contrrio precisamos nos preocupar em restaurar o balano da rvore. A restaurao deste balano efetuada atravs do que denominamos ROTAES na rvore. As operaes de rotao so melhor entendidas atravs de exemplos. Inicialmente vamos considerar a seguinte rvore (os nmeros ao lado dos nodos so o FB de cada nodo):

A rvore acima est balanceada, como podemos observar pelos FB de cada nodo. Os casos possveis de desbalanceamento so 2. Veremos cada um deles. Tipo 1 - ROTAO DUPLA Suponha que agora queremos inserir o nmero 5 na rvore acima. A insero produziria a seguinte rvore:

Observe que o nodo 8 tem FB -2 e tem um filho com FB +1. Neste caso o balanceamento atingido com duas rotaes, tambm denominada ROTAO DUPLA. Primeiro rotaciona-se o nodo com FB 1 para a esquerda. A rvore ficaria:

A seguir rotaciona-se o nodo que tinha FB -2 na direo oposta (direita neste caso). A rvore ficaria:

Observe que os FB nos nodos voltaram a ficar dentro do esperado das rvores AVL. O caso simtrico ao explicado acima acontece com os sinais de FB trocados, ou seja, um nodo com FB +2 com um filho com FB -1. Tambm utilizariamos uma rotao dupla, mas nos sentidos contrrios, ou seja, o nodo com FB -1 seria rotacionado para a direita e o nodo com FB +2 seria rotacionado para a esquerda.

Tipo 2 - ROTAO SIMPLES

Suponha que queremos inserir o nodo 3 na rvore inicial. A insero produziria a seguinte rvore:

A insero do nodo 3 produziu um desbalano no nodo 8 verificado pelo FB -2 neste nodo. Neste caso, como os sinais dos FB so os mesmos (nodo 8 com FB -2 e nodo 4 com FB -1) significa que precisamos fazer apenas uma ROTAO SIMPLES direita no nodo com FB -2. No caso simtrico (nodo com FB 2) faramos uma rotao simples esquerda. Aps a rotao simples a rvore ficaria:

Observe mais uma vez que os FB esto dentro do esperado para mantermos a propriedade de balanceamento de rvores AVL.

CONSTRUINDO UMA RVORE AVL

A descrio acima pode ser resumida no seguinte algoritmo em pseudocdigo para construo de uma rvore AVL: 1. Insira o novo nodo normalmente (ou seja, da mesma maneira que inserimos numa ABP); 2. Iniciando com o nodo pai do nodo recm-inserido, teste se a propriedade AVL violada neste nodo, ou seja, teste se o FB deste nodo maior do que abs(1). Temos aqui 2 possibilidades: 2.1 A condio AVL foi violada 2.1.1 Execute as operaes de rotao conforme for o caso (Tipo1ou Tipo 2) 2.1.2 Volte ao passo 1 2.2 A condio AVL no foi violada. Teste pela condio AVL o pai do nodo testado por ltimo (ou seja, retorne ao passo 2). Se o nodo recmtestado no tem pai, ou seja, o nodo raiz da rvore, volte para inserir novo nodo (Passo 1)

O importante a observar neste algoritmo que o teste por desbalano inicia com o ltimo nodo inserido, e no com o nodo raiz! Vamos ver um exemplo de construo de uma rvore AVL com os seguintes nmeros: <10,20,30,25,27>. A insero dos 3 primeiros nmeros resulta na seguinte rvore:

Aps a insero do elemento 30 a rvore fica desbalanceada. O caso acima do Tipo 2. Fazemos uma rotao para a esquerda no nodo com FB 2. A rvore resultante fica:

O passo seguinte inserir os nodos 25 e 27. A rvore fica desbalanceada apenas aps a insero do nodo 27, exemplificado abaixo:

Este caso do Tipo 1. O nodo 30 tem FB -2 e o seu nodo filho tem FB 1. Precisamos efetuar uma rotao dupla, ou seja, uma rotao simples esquerda do nodo 25, resultando

seguida de uma rotao simples direita do nodo 30, resultando:

e a rvore est balanceada.

rvores-B (B-Trees) Estrutura proposta por R. Bayer e E. Mc Creight (o B de B-Tree vem de Bayer), em 1970 bastante utilizada para manipulao de registros em arquivos pelo seu bom desempenho. Uma B-Tree uma rvore de pesquisa M-ria que possui as seguintes caractersticas: - a raiz ou uma folha ou possui ao menos dois filhos; - cada n intermedirio, com exceo da raiz, possui entre M e 2M elementos; - o caminho entre a raiz e qualquer folha possui o mesmo comprimento; - um n intermedirio com k elementos (sendo k, no mximo, igual a 2M) possui k+1 filhos. Uma rvore-B pode ser de dois tipos, com relao distribuio dos elementos na sua estrutura: 1) os elementos esto distribudos na estrutura da rvore (ns intermedirios e folhas), neste caso temos uma rvore B; 2) os elementos esto apenas nas folhas, e nos ns intermedirios tem-se ndices para acessar as folhas, neste caso temos uma rvore B+. Exemplo de rvore B+ Exemplo de uma rvore-B+ de ordem 2 (M=2), com elementos apenas nas folhas (e com ndices de acesso aos elementos nos ns intermedirios):

18

10 4 6 8 10

12

22

28

34

38

12 14 16

18 20 22 24 26

28 30 32 34 36

38 40 42

Figura 1 - Exemplo de rvore B+ de ordem 2 Neste exemplo, a capacidade mxima do n intermedirio de 4 elementos (2M=4): um n intermedirio com 2 elementos (k elementos) possui 3 filhos (k+1), um n intermedirio com 3 elementos (k elementos) possui 4 filhos (k+1), um n intermedirio com 4 elementos (k elementos) possui 5 filhos (k+1). Em uma rvore balanceada pode-se definir as folhas e os ns intermedirios com capacidades diferentes, utilizando a rvore como estrutura intermediria de acesso (as folhas poderiam representar um bloco, ou alguma outra estrutura em memria secundria, por exemplo). A rvore poderia servir apenas para otimizar o

acesso, como uma estrutura auxiliar. A rvore B+ um exemplo tpico de estrutura auxiliar, utilizada como ndice. No exemplo anterior (figura 1) tem-se um caso destes, e pode-se observar que os elementos esto todos nas folhas, sendo que nos ns intermedirios tem-se apenas chaves de acesso s folhas (por isso alguns deles esto repetidos nos ns intermedirios). Em cada um dos ns intermedirios, o primeiro elemento (do n) contm o menor valor acessado atravs do seu segundo filho, o segundo elemento contm o menor valor acessado atravs do seu terceiro filho, o terceiro elemento contm o menor valor acessado atravs do seu quarto filho, e assim por diante. Maiores detalhes sobre este tipo de estrutura podero ser encontradas no item sobre B+ Trees. Estrutura dos ns da rvores B Considerando que os ns intermedirios armazenaro os elementos (ou apenas as chaves dos elementos, como na figura 1) (e) e apontadores para os filhos (a), cada n de uma rvore-B possui a seguinte estrutura:
a0

e1 a1 e2 a2 ...

an-1

en an

As chaves dos elementos (e) esto ordenadas: e1<e2...<en , e as chaves de cada um dos filhos, apontados por a0,a1,...,an, tambm, sendo que os elementos (ou as chaves) existentes no filho apontado por a0 so menores que os do filho apontado por a1, que so menores que os do filho apontado por a2, e assim respectivamente. - OPERAES: as operaes a seguir (consulta, insero e remoo) so vlidas para as rvores-B com elementos distribudos na estrutura da rvore. Para as operaes em rvores-B com elementos s nas folhas, ver a explicao das rvores 2-3. a) CONSULTA: para pesquisar um elemento x (ou de chave x), compara-se x com os ns: se x<e1, deve-se continuar a pesquisa atravs de a0; se e1 <= x < e2, deve-se continuar a pesquisa atravs de a1, e assim sucessivamente. b) INSERO: aps ser verificado que o elemento a ser inserido no pertence rvore, preciso inseri-lo em um n folha, de forma a preservar a ordenao da rvore. Exemplo: inserir o 16, considerando que os elementos ficam distribudos em toda a estrutura da rvore (no somente nos nodos folha, mesmo que inicialmente eles sejam inseridos sempre nas folhas).

15

15

10

20 30 40

10

16 20 30 40

Se no houver mais espao para a insero em um n (overflow), necessrio dividi-lo em dois (SPLIT). O elemento que possuir o valor mdio do n movido para o seu n-pai (n antecessor). Exemplo: inserir o 22
22 o valor mdio do n dividido 15 15 22

10

16 20 30 40

10 16 20

30 40

Eventualmente a insero de um elemento no seu n antecessor pode causar a diviso dele tambm, ocasionando uma propagao de divises. Em um caso extremo, esta propagao poderia atingir a raiz da rvore, causando sua diviso. Depois do 22, foram inseridos: 6, 11, 13 (split, sobe o 10), 60, 70, 50 (split, sobe o 50), 43, 44. Exemplo: inserir o 45
10 15 22 50

6 11 13

16 20

60 70 30 40 43 44 10 15 22

43 50

- sobe para o nvel anterior o 43, o que causa a diviso da raiz.


5 6 11 13 16 20 30 40 44 45 60 70

A diviso da raiz determina a criao de uma nova raiz, e em tal situao a rvore cresce um nvel. Uma rvore-B cresce ento das folhas em direo raiz. b) REMOO: a remoo de um elemento pode se enquadrar em um de dois casos: 1. o elemento a ser removido est em um n folha;

2. o elemento no est em um n folha. Neste caso ele deve ser substitudo por um elemento adjacente que esteja em uma folha. Em qualquer caso, deve ser verificado se no h violao da condio de que todo n, com exceo da raiz, deve ter entre M e 2M elementos. Em uma remoo, muitas vezes um n fica com menos que M elementos (underflow). Neste caso, necessrio juntar (MERGE) ns para manter a integridade da B-Tree. Elemento adjacente: o processo para encontr-lo semelhante ao da remoo em rvore binria. Pode-se, a partir do ponteiro esquerda do elemento a ser removido, descer pelos ponteiros mais direita em direo a uma folha e fazer a substituio pelo elemento mais direita (no exemplo, substituir o 25 pelo 24), ou , a partir do ponteiro da direita, descer pelos ponteiros mais esquerda e fazer a substituio pelo elemento mais esquerda (no exemplo, substituir o 25 pelo 26).

25

24

26

No caso de underflow em um n: 1 caso) existem ns irmos e possvel anexar um elemento de um deles sem causar novo underflow. Neste caso, preciso redistribuir os elementos entre os ns-irmos e o n-pai para manter a ordenao. Exemplo: remover o 25
25 10 18 24

10 20

8 13 15 18

22 24

. . . .

8 13 15

20 22

. . . .

o elemento a substituir o 25 o 24, o que causa underflow no n. H um rebalanceamento entre os ns irmos e o n pai

2 caso) existem ns irmos e a anexao de um elemento de um deles causaria um novo underflow. Neste caso, preciso juntar (MERGE) os dois ns (o n com underflow e seu irmo mais prximo), adicionando tambm o elemento mdio que est no n-pai entre os elementos agora em um mesmo n. Exemplo: remover o 24

24

10 18

30 40

o 22 ocuparia o lugar do 24, causando um underflow no n folha. preciso juntar o n folha com um outro n, incluindo no n resultante o 18, que o elemento mdio do n pai 42 45 46 32 35 38

8 13 15

20 22

26 27

h um novo underflow, sendo necessrio juntar os ns irmos

22 30 40

10

8 13 15 18 20

26 27 32 35 38

42 45 46

10 22 30 40

8 13 15 18 20

26 27 32 35 38

42 45 46

O underflow em um n pode se propagar em direo raiz, podendo causar o surgimento de uma nova raiz com a consequente diminuio da altura da rvore em um nvel (conforme apresentado no exemplo acima).

rvores 2-3 (2-3 Trees) So rvores-B+ de ordem 1, com as seguintes propriedades: - cada n tem 2 ou 3 filhos (grau mximo igual a 3; ordem igual a 1); - o comprimento de um caminho da raiz at qualquer folha o mesmo; - os elementos ficam armazenados nas folhas, os ns intermedirios possuem apenas "chaves" de acesso (aqui considerado desta forma, mas h uma outra abordagem de rvores 2-3 que mantm os elementos inteiros nos ns intermedirios); - mantido o critrio de ordenao: se um elemento a est esquerda de um elemento b, ento a<b. Em cada n que no folha, guarda-se a chave do menor elemento descendente do segundo filho deste n. Se este n tiver um terceiro filho, guarda-se tambm a chave do menor elemento descendente do terceiro filho deste n. No exemplo a seguir, os ns intermedirios so identificados por retngulos e as folhas por crculos: 7 16

12

19 -

12

16

19

Operaes: a) INSERO: o elemento deve ser inserido se ele ainda no estiver na rvore. Podero ocorrer as seguintes situaes: - se o n intermedirio que ser seu pai tiver apenas 2 filhos, basta inseri-lo como terceiro filho, na ordem adequada, e atualizar o n intermedirio-pai acresentando o segundo ndice. - se o n intermedirio j tiver 3 filhos (folhas), no possvel inserir um quarto. Neste caso, necessrio dividir (split) o n intermedirio em dois. Um deles ficar com dois elementos (dois dos trs filhos j existentes) e o outro ficar com os outros dois (o terceiro dos trs filhos j existentes mais o elemento a ser inserido). Os ns intermedirios antecessores tero que refletir essas mudanas nos ndices que guardam. Isso poder implicar tambm a diviso dos ns intermedirios, chegando inclusive at a uma diviso da raiz da rvore. b) REMOO: ao remover uma folha, possvel deixar seu n-pai com apenas um filho (o que no pode acontecer, uma vez que cada n pode ter no mnimo 2 filhos). Neste caso, necessrio reestruturar a rvore: - se este n-pai que ficou com apenas um filho for a raiz, ela deve ser removida e este filho se tornar a raiz; - se no for a raiz:

a) caso o n-pai tenha um irmo (tambm n intermedirio) com trs filhos, passa-se um destes para o n-pai com apenas um filho, e cada um deles ficar com dois filhos; b) caso o n-pai tenha um irmo com apenas dois filhos, transfere-se o filho nico para este irmo, e remove-se o n-pai. Se este irmo agora tornar-se filho nico, repete-se a seqncia de procedimentos acima, recursivamente, para o pai do n-pai (removido). c) CONSULTA: compara-se x, a chave do elemento a ser consultado, com y, a chave guardada por um n intermedirio. Se x<y, segue-se a pesquisa pelo seu a1 primeiro filho; se x>y ou x=y e este n intermedirio s tiver dois filhos, segue-se a pesquisa pelo seu segundo filho; se x>y ou x=y e houver um terceiro filho, comparase x com z, a 2a chave guardada pelo n intermedirio. Neste caso, se x<z segue-se a pesquisa pelo segundo filho e se x>z ou x=z, segue-se a pesquisa pelo terceiro filho.

rvores-B* (B*-Trees) uma rvore-B, cujos ns tm que possuir no mnimo 2/3 de sua ocupao total (ao invs de metade de sua ocupao total, na rvore-B). Isto significa que, ao invs de dividir um n completamente preenchido em dois ns preenchidos pela metade, preciso possuir dois ns completamente preenchidos para ento dividi-los em trs novos ns, cada um preenchido em 2/3 de seu espao. As operaes de CONSULTA, INSERO e REMOO so semelhantes s realizadas em B-Trees, com a diferena que o split, na insero, e o merge, na remoo, seguem respectivamente a restrio de que preciso de dois ns cheios para serem divididos em trs e que no mnimo tem que preencher 2/3 da ocupao de cada n. b) INSERO: similar insero na rvore 2-3: a 1a chave de um n intermedirio ser a chave do menor elemento de seu segundo filho; a 2a chave ser a chave do menor elemento de seu segundo filho, e assim por diante. Semelhante rvore 2-3, se no houver mais espao para o elemento a ser inserido (num conjunto de dois ns) , os ns tm que ser divididos em trs novos ns, e a atualizao das chaves refletida no n-pai. Se no n-pai tambm no houver mais espao o processo se repete recursivamente. Caso seja necessrio dividir a raiz, cria-se uma nova raiz com dois filhos, e esta a nica situao em que um n pode ter um nmero menor de filhos.

22

10 12 18

28 34 38

4 6 8

10

12 14 16

18 20

22 24 26 23

28 30 32

34 36

38 40 42

rvore-B* aps a insero de 23:


18 28

10 12

22 24

34 38

4 6 8

10

12 14 16

18 20

22 23

24 26

28 30 32

34 36

38 40 42

c) REMOO: ao remover um n (folha), necessrio atualizar as chaves e eventualmente os apontadores de seus ancestrais. Alm disso, preciso garantir que

nenhum n possua menos que 2/3 de sua ocupao. Se isso ocorrer, preciso ajustar a rvore para corrigir a situao, da seguinte forma: - se este n possuir um irmo com mais do que 2/3 de sua ocupao, passase um destes itens do irmo para o n que sofreu a remoo; caso o irmo esteja no limite de itens (exatamente 2/3 de sua ocupao), faz-se a fuso do n que sofreu a remoo com o irmo. Em ambos os casos, tem-se que fazer a atualizao do pai, que tambm pode vir a ficar com menos de 2/3 de sua ocupao, e o processo tem que se repetir recursivamente. rvore-B aps a remoo de 10:

24

12 18 22

28 34 38

4 6 8

12 14 16

18 20

22 23

24 26

28 30 32

34 36

38 40 42

Neste exemplo, o menor nmero de filhos de um n igual a 3, com exceo da raiz que pode ter no mnimo 2.

Bibliografia: [1] Aho, A.V.; Hopcroft,J.E.;Ullman,J.D. Data Structures and Algorithms. AddisonWesley Publishing Company, 1983. [2] Furtado,A.L;Santos,C.S. Organizao de Banco de Dados. Editora Campus, 1987 [3] Veloso,P.... Estruturas de Dados. Editora Campus, 1984 [4] Terada,R. Desenvolvimento de Algoritmos e Estruturas de Dados. Editora McGraw-Hill, 1991. [5] Szwarcfiter,J.L.;Markenzon, L. Estruturas de Dados e seus Algoritmos. Editora LTC, 1994. [6] Wirth, N. Algorithms + Data Structures = Programs. Prentice-Hall, Inc., 1976.

Anda mungkin juga menyukai