tila Valgueiro Malta Moreira Juliana Medeiros de Lucena Rafael Alberto Gomes Pereira Lima Rafael Loureiro de Carvalho
Sara Carvalho da Rocha Brito Tiago Carneiro Pessoa Canto Victor Barbosa de Oliveira Medeiros Vincius Monteiro de Lira
rvore B rvore B uma estrutura de dados que utiliza o recurso de manter mais de uma chave em cada n da estrutura. Ela proporciona uma organizao de ponteiros de tal forma que as operaes buscas, inseres e remoes so executadas rapidamente. As rvores B so largamente utilizadas como forma de armazenamento em memria secundria. Diversos sistemas comerciais de Banco de dados, por exemplo, as empregam. rvore B rvores B so rvores enraizadas balanceadas, com balano perfeito. Sua construo assegura que as folhas se encontram em um mesmo nvel, no importando a ordem de entrada dos dados. Um n de uma rvore B chamado pgina. Cada pgina, exceto a raiz, deve ter entre d e 2d elementos. A raiz tem pelo menos dois descendentes diretos. Representando rvores B Numa rvore binria, cada n contm um valor (chave) e duas sub-rvores (filhos) que podem ser nulas:
Numa rvore 2-3, rvore B de ordem 1, um n pode ter at 2 chaves e 3 filhos: 9 Valores menores que 9 Valores maiores que 9 9 13 25 Representando rvores B Um n de uma rvore B, n M-rio (n alargado), possui M descendentes diretos e M-1 elementos. Os elementos dentro de um n esto ordenados. O ponteiro situado entre dois elementos a e b aponta para a sub-rvore que contm todos os elementos entre a e b. Representando rvores B Os ponteiros para os descendentes e os elementos dentro de um n so armazenados em arrays. Os descendentes tm ndices entre 0 e M-1. Os elementos tm ndices entre 0 e M-2. Representando rvores B Ex: N (pgina) de uma rvore B composta por inteiros class No { int n; int elements[M-1]; No branches[M]; } Nmero de elementos no n Elementos do n Referncias para os ns descendentes typedef struct No *Pont; typedef struct No { int n; int elements[M-1]; Pont branches[M]; } No; Nmero de elementos no n Elementos do n Referncias para os ns descendentes Representando rvores B Para criar a rvore B propriamente dita, criaremos a classe BTree, que manipula objetos do tipo No. class BTree { No raiz; public BTree() { this.raiz = null; } } Representando rvores B typedef struct BTree { Pont raiz; } BTree;
BTree *createBTree() { BTree *ret = (BTree *)malloc(sizeof(BTree)); ret->raiz = NULL; return ret; } Busca Algoritmo Simplificado: Se x < K 0 ; seguir P 0 Se K i-1 < x < K i ; seguir P i Se x > K m-1 ; o caminho ser indicado por P m K0 K1 ... Km-1 P0 P1 P2 ... Pm-1 Pm
Busca boolean busca ( int k, No p ) { if ( p == null ) return false; else { int i = 0; while ( i < p.n-1 && k > p.elements[i] ) i++; if ( k == p.elements[i] ) return true; else if ( k < p.elements[i] ) return busca ( k, p.branches[i] ); else return busca ( k, p.branches[i+1] ); } } Busca int busca ( int k, No p ) { if ( p == NULL ) return 0; else { int i = 0; while ( i < p.n-1 && k > p->elements[i] ) i++; if ( k == p->elements[i] ) return 1; else if ( k < p->elements[i] ) return busca ( k, p->branches[i] ); else return busca ( k, p->branches[i+1] ); } } Insero Um elemento s inserido na folha. Casos: Se a pgina onde o elemento for inserido tiver menos de 2d chaves, ento o elemento ser inserido nessa pgina; Caso contrrio, a pgina ficar com 2d+1 chaves, sendo necessrio realizar uma ciso. O elemento do meio ser promovido pgina diretamente acima. Os elementos menores ficaro numa pgina esquerda desse elemento e os maiores direita. Se esse procedimento resultar em outra pgina com 2d+1 chaves, realizar-se- novamente o mesmo procedimento, podendo chegar at a raiz. Insero Insero do elemento 6 em uma rvore com d = 1 (rvore 2-3) 3 5 2 4 7 8 3 5 2 4 6 7 8 Insero 3 5 7 2 4 6 8 2 4 6 8 7 3 5 Insero O algoritmo de insero recursivo, sendo os ns da rvore percorridos para se procurar o ponto de insero adequado. Para cada n percorrido, estas so as situaes possveis: Quando estamos num n normal da rvore, tenta-se inserir no nvel abaixo, escolhendo o descendente adequado. Se houver uma promoo o elemento promovido deve ser inserido no n atual; se o n atual estiver cheio deve ser partido e o elemento mediano promovido. Insero Quando estamos num n nulo, neste caso chegou-se ao fim da rvore, ultrapassando-se mesmo o nvel mais baixo e devolve-se simplesmente o elemento ao n superior, simulando uma promoo; Quando estamos na raiz, se houver uma promoo, deve ser criada uma nova raiz tendo como nico elemento aquele que foi promovido e como descendentes os dois ns resultantes da partio da antiga raiz. Remoo Casos: Quando a chave no se encontra em uma folha, ela ser removida e substituda pelo sucessor (menor dos maiores = direita esquerda) ou antecessor (maior dos menores = esquerda direita), que est numa folha. Logo, esse caso cai numa remoo de uma chave em uma folha; Quando a chave uma folha, ela ser removida e dever verificar se a folha ficar com menos de d chaves. Se isso acontecer, dever ser feita uma concatenao ou uma redistribuio. A chave a ser retirada pode residir no n folha ou num n de derivao. Pginas Adjacentes So pginas que tem o mesmo pai e so apontados por dois ponteiros adjacentes, ou seja, h apenas uma chave entre eles. As pginas circuladas abaixo so pginas adjacentes. L P I T V X U W Z G Concatenao Acontece quando, aps a remoo, a pgina onde a chave foi removida e uma pgina adjacente possuem em conjunto menos de 2d chaves. Concatena essa pgina com uma adjacente. A chave do pai que estava entre elas fica na pgina que foi concatenada. Se esse procedimento resultar em uma pgina com menos de d chaves, realizar-se- novamente o mesmo procedimento, podendo chegar at a raiz. Concatenao Remoo do elemento 4 em uma rvore com d = 1 (rvore 2-3) 2 4 6 8 7 3 5 Concatenao 2 6 8 7 3 5 Concatenao 2 3 6 8 7 5 2 3 6 8 5 7 Redistribuio Acontece quando, aps a remoo, a pgina onde a chave foi removida e uma pgina adjacente possuem em conjunto 2d chaves ou mais. Concatena essa pgina com uma adjacente. A chave do pai que estava entre elas fica na pgina que foi concatenada. Acontece uma ciso. No propagvel, pois o nmero de chaves do pai no muda. Redistribuio Remoo do elemento 6 em uma rvore com d = 1 (rvore 2-3) 2 3 6 8 9 5 7 2 3 8 9 5 7 Redistribuio 2 3 7 8 9 5 2 3 9 5 8 7 Applet http://slady.net/java/bt/view.php?w=600&h=450