You are on page 1of 12

Estruturas de Informao rvores B _______________________________________________________________________________________________

RVORES B
At agora manipulamos a estrutura rvore binria em memria principal. Tambm queremos no entanto guardar rvores em disco e carregar a informao do disco para a memria principal, quando precisamos dela. Como sabemos, a informao em memria principal temporria enquanto no disco permanente, e a memria principal disponvel muito menor do que espao em disco, da a vantagem de podermos ter gravada a informao em memria secundria. Contudo, o acesso ao disco muito mais lento do que o acesso memria principal e se usssemos a informao em disco, estruturada numa rvore binria de pesquisa, dado que temos tantos ns quantas as chaves o nmero de operaes de I/O seria elevado e portanto o tempo exigido, por exemplo, numa pesquisa seria longo. Para evitar este inconveniente usaremos grandes blocos de informao agrupando vrios objectos, cada um incluindo uma chave, num s nodo. A escolha da ordem da rvore (do nmero de elementos por n) depende do tamanho do bloco de disco, isto cada n dever ter o tamanho dum bloco de disco para que cada vez que fazemos um acesso a um n para uma operao de pesquisa ou actualizao s precisemos de realizar uma nica transferncia do disco. Usaremos ento uma rvore n-ria de determinado tipo designada por rvore B. Neste tipo de rvores para cada valor M, a que se chama ordem da rvore, cada nodo contem no mximo 2*M elementos e no mnimo M, excepto o n raiz, que pode transgredir esta ltima regra, admite-se que o n raiz tenha no mnimo 1 elemento . Em aplicaes reais usamos para M valores da ordem da centena, usar-se-o sempre chaves nicas, no existem portanto chaves repetidas. Nos exemplos que vamos usar para explicar os algoritmos de manipulao deste tipo de rvores consideraremos cada elemento reduzido a uma chave. Tal como acontece com as rvores binrias de pesquisa usaremos as chaves para procurar um elemento na rvore de uma maneira eficiente. A estrutura de cada nodo de uma rvore B, ser dada por um array de chaves (k[i] elementos ) de comprimento 2*M, um array de apontadores de comprimento 2*M+1 (ptr[i])

_______________________________________________________________________________ Instituto Superior de Engenharia do Porto 1


Departamento de Eng Informtica

Estruturas de Informao rvores B _______________________________________________________________________________________________

e um campo inteiro, cnt, que indica quantos dos 2*M campos de informao esto realmente ocupados. Por outras palavras diremos que, cada nodo tem no mximo 2*M+1 filhos , uma vez que possui 2*M+1 apontadores e no mnimo M. O nmero de elementos guardados em cada nodo menor do que o nmero de apontadores. Utilizando a notao simplificada de n, ki e pi em vez de rz->cnt, rz->k[i] e rz->ptr[i] em que rz o apontador para o nodo, teremos as seguintes condies a verificar nos nodos da rvore: 1 <= n <= 2*M para o n raiz M<= n <= 2*M para os outros nodos. Os elementos em cada nodo esto ordenados por chave, k0 < k1 < k2<...<kn-1

p0

k0

p1

k1

p2

k2

p3

...

... ... ...

kn-1

pn

Esquematicamente representa-se abaixo uma rvore B de ordem 2.

_______________________________________________________________________________ Instituto Superior de Engenharia do Porto 2


Departamento de Eng Informtica

Estruturas de Informao rvores B _______________________________________________________________________________________________

Se o nodo uma folha o valor de cada apontador pi nulo. Se o nodo no folha, cada um dos n+1 ponteiros aponta para outro nodo, filho do nodo dado. Se i>0 todas as chaves do n apontado por pi, so maiores do que Ki-1. Se i<n todas as chaves do n apontado por pi so menores do que ki. Resultante do modo de construo ,as rvores B apresentam outra caracterstica, so equilibradas e mantm os ns folha todos ao mesmo nvel, logo o caminho do n raiz a qualquer folha tem exactamente o mesmo comprimento. Esta forma interessante das rvores B tem no entanto o seu preo, h muitas vezes espao de memria que est reservado e no est a ser utilizado. sem dvida uma estrutura elegante e eficiente para muitas aplicaes embora os algoritmos de manipulao no sejam imediatos. As rvores B foram inventadas por Bayer e McCreight. Do exposto deduzimos que para o mesmo nmero de elementos armazenado numa rvore binria e numa rvore B, a altura da rvore B muito menor que a da binria. Para uma rvore B de ordem M, com n elementos e todos os ns completamente preenchido, a altura ser da ordem de O (log 2M+1 n). Vejamos seguidamente a forma de lhe juntar elementos. _______________________________________________________________________________ Instituto Superior de Engenharia do Porto 3
Departamento de Eng Informtica

Estruturas de Informao rvores B _______________________________________________________________________________________________

Suponhamos que a nossa rvore B estava vazia e vamos juntar-lhe elementos cujas chaves so os valores: 60, 20, 80, 10. Obteremos ento um n raiz que contem a seguinte informao: n=4 p0= p1= p2= p3= p4= Nulo k0= 10 k1= 20 k2= 60 k3=80 O juntar de um elemento ser sempre feito num n folha A configurao da rvore ser ento a seguinte:

Se agora juntssemos o valor 15, fazendo uma insero ordenada obteramos a seguinte sequncia: 10,15,20,60,80 Mas como se ultrapassou a capacidade do n, h que dividir o n em 2, cada um com M elementos, neste nosso exemplo cada n teria dois elementos, e o valor do meio ser inserido no nvel superior (neste exemplo, o valor 15), ficando a rvore com a seguinte configurao:

_______________________________________________________________________________ Instituto Superior de Engenharia do Porto 4


Departamento de Eng Informtica

Estruturas de Informao rvores B _______________________________________________________________________________________________

Juntando os valores30 e 70 obteramos:

Juntemos agora o valor 22, ento a folha mais direita ter que dividir-se, obtendo-se a seguinte +arvore:

_______________________________________________________________________________ Instituto Superior de Engenharia do Porto 5


Departamento de Eng Informtica

Estruturas de Informao rvores B _______________________________________________________________________________________________

Se fossem adicionados os valores: 12, 18, 19, 4, 5, 6, 2, 3 a rvore apresentaria o seguinte aspecto

A adio do elemento com valor 1 ,vai obrigar a nova configurao da rvore, uma vez que o n mais esquerda ser obrigado a dividir-se o elemento do n tentar ser colocado no n pai mas como este j est totalmente preenchido ser tambm obrigada a dividir-se subindo o valor do meio para um novo n raiz, ficando a rvore com a seguinte representao

_______________________________________________________________________________ Instituto Superior de Engenharia do Porto 6


Departamento de Eng Informtica

Estruturas de Informao rvores B _______________________________________________________________________________________________

Uma vez que os valores por n esto ordenados, a pesquisa em cada n feita atravs do algoritmo de pesquisa binria, conforme se exemplifica no algoritmo abaixo. Pesquisa Binria nos ns da rvore B

Os valores de retorno da pesquisa binria sero: 0 se x <= a[0] n se x > a[n-1] r se a[r-1] < x <= a[r]

Algoritmo pesquisa_binaria(x, a, n) // a o array de chaves, x o valor a procurar, n o numero de // elementos no n Inicio Se x <= a[0] Ento devolve 0 Fse Se x > a[n-1] Ento devolve n Fse esq = 0 dir = n-1 Enquanto (dir-esq) > 1 i = (dir+esq)/2 Se x <= a[i] Entao dir = i Seno esq = i Fse Fenquanto devolve dir Fim

Descrevemos agora o algoritmo de pesquisa de um valor x, na rvore B de raiz t. Algoritmo pesquisar(x,t) Inicio Enquanto t!= Nulo k=t->chave n=t->cnt i=pesquisa_binria(x, k, n) _______________________________________________________________________________ Instituto Superior de Engenharia do Porto 7
Departamento de Eng Informtica

Estruturas de Informao rvores B _______________________________________________________________________________________________

Se (i<n e x==k[i]) Ento encontrou(t,i) sai Fse t=t->ptr[i] Fenquanto escreve "Item" x "no encontrado" Fim Algoritmo encontrou (t, i) Inicio escreve "Encontrado na posio " i escreve "do n com os seguintes contedos : " Para i=0 at i < t->cnt escreve t->chave[i] i++ Fpara Fim Quanto ao algoritmo de insero de elementos numa rvore B, atendendo ao que j foi dito, recorreremos a um algoritmo recursivo, ins, que descer na rvore desde a raiz at folha onde ser junto o elemento x, e no caminho de regresso da recursividade ser colocado o elemento que sobe quando se d a diviso de ns, designado por xnovo, e ser ligado o novo n, designado por tnovo. O valor de retorno deste algoritmo recursivo ser 0, 1 ou 2 indicando ao pai respectivamente se a operao ainda no est completa (caso de diviso de n no nvel abaixo), se a operao est terminada ou se houve duplicao de chave. A invocao do mtodo de inserir poder ser feito do seguinte modo: raiz =inserir( x, raiz) Algoritmo: inserir(x,t) Inicio codigo=ins(x, t, xnovo, tnovo) // xnovo e tnovo so passados por referncia Se (codigo==2) Ento "Chave duplicada" Se (codigo==1) _______________________________________________________________________________ Instituto Superior de Engenharia do Porto 8
Departamento de Eng Informtica

Estruturas de Informao rvores B _______________________________________________________________________________________________

Ento devolve t Seno u=obternodo() u->cnt=1 u->chave[0]=xnovo u->ptr[0]=t u->ptr[1]=tnovo devolve u Fim codigo==0 Se o novo elemento ainda no foi junto rvore codigo==1 Se o novo elemento j se juntou rvore codigo==2 Se o elemento j existe na rvore Algoritmo recursivo ins(x, t, y, u) Inicio //Consideramos: p=t->ptr n=t->cnt k=t->chave //Verificar se t um apontador numa folha Se (t==Nulo) Ento u=Nulo y=x devolve 0 //Seleccionar o apontador p[i] e tentar inserir x na subrvore em que p[i] raiz i=pesquisa_binria(x, k, n) // array de chaves do n Se (i<n e x==k[i]) Ento devolve 2 // chave duplicada Fse codigo=ins(x, p[i], xnovo, tnovo) Se (codigo) Ento devolve codigo _______________________________________________________________________________ Instituto Superior de Engenharia do Porto 9
Departamento de Eng Informtica

// y e u por referencia

Estruturas de Informao rvores B _______________________________________________________________________________________________

Fse //A insero na subrvore no foi completamente sucedida //Vamos tentar inserir xnovo e tnovo no n corrente Se (n<MM) Ento i=pesquisa_binria(xnovo, k, n) Para j=n at j>i k[j]=k[j-1] p[j+1]=p[j] j -Fpara k[i]=xnovo p[i+1]=tnovo n++ devolve 1 Fse /*O n corrente est cheio, por isso h que dividir. Passar o item k[M], no meio da sequncia aumentada para trs, atravs do parmetro y, para que possa subir na rvore. Tambm passa um apontador para o n criado de novo para trs, atravs de u. Devolve 0 para indicar que a insero no est completa. */ Se (i==MM) Ento k_final=xnovo p_final=tnovo Seno k-final=k[MM-1] p_final=p[MM] Para j=MM-1 at j>i k[j]=k[j-1] p[j+1]=p[j] j -Fpara k[i]=xnovo p[i+1]=tnovo _______________________________________________________________________________ Instituto Superior de Engenharia do Porto 10
Departamento de Eng Informtica

Estruturas de Informao rvores B _______________________________________________________________________________________________

Fse y=k[M] n=M u=obternodo() u->cnt=M Para j=0 at j<M-1 u->k[j]=k[j+M+1] u->ptr[j]=p[j+M+1] j ++ Fpara u->ptr[M-1]=p[MM] u->k[M-1]=k_final u->ptr[M]=p_final devolve 0 FIM Quanto operao de eliminao de um elemento, proceder-se- de forma inversa da de insero. Assim, o primeiro passo consiste na pesquisa do elemento a eliminar. Se o n onde se encontra o elemento um n folha ento h que retirar o elemento do array. Se o resultado dessa eliminao um n com menos de M elementos, realizada uma reorganizao como se segue: Se existe dentro da mesma subrvore, um irmo direito com mais de M elementos, folha em questo pode ser junto um elemento emprestado da folha irm, envolvendo o n pai, isto , o elemento mais esquerda da irm direita sobe para o pai e o do pai desce para a folha onde foi efectuada a eliminao. Alternativamente, caso a folha irm no possa emprestar nenhum elemento porque s tem M elementos, haver que juntar as duas folhas. Neste caso, tambm um elemento do pai descer para a folha nova, ficando esta com um mximo de 2*M elementos. Se por acaso o pai ficar com menos de M elementos esta mesma reorganizao ter que se repetir nos nveis superiores. No caso do elemento a eliminar no pertencer a uma folha, mas a um n interno, ento a posio do elemento que vai sair substitudo pelo valor do elemento imediatamente _______________________________________________________________________________ Instituto Superior de Engenharia do Porto 11
Departamento de Eng Informtica

Estruturas de Informao rvores B _______________________________________________________________________________________________

anterior em ordem simtrica, isto , do filho esquerdo o mais direita, at atingir uma folha( mtodo idntico ao usado nas rvores binrias de pesquisa). Se por acaso a folha contem M elementos ser ento necessrio proceder reorganizao da rvore como explicado no caso da eliminao de um elemento pertencente a um n folha.

_______________________________________________________________________________ Instituto Superior de Engenharia do Porto 12


Departamento de Eng Informtica

You might also like