Вы находитесь на странице: 1из 4

Conteúdo

Estrutura de Dados II  Criação


 Motivação
 Definição
 Pesquisa
Árvores B (B-Tree)
 Inserção
 Remoção

Criação Motivação

 Bayer and McGreight, 1972.  Bayer e McCreight propuseram que as árvores


sejam construídas de baixo para cima;

 Em 1979 o uso de B-trees se tornou o  As chaves raiz da árvore emergem naturalmente;


padrão de indexação
 A árvore é auto-balanceada e todos os nós filhos
estão sempre em um mesmo nível;

 Uma idéia elegante e poderosa.

Definição Definição
 Cada página é formada por um seqüência de chaves e conjunto de  Ordem
ponteiros.
A definição atual de B-Tree vincula a ordem de uma árvore ao número de
descententes de um nó (isto é,. de ponteiros). Deste modo, numa árvore B de
 O número de ponteiros em um nó excede o número de chaves em ordem ou grau m o número máximo de chaves é m-1.
1.
Ex: Uma árvore B de ordem 8 tem um máximo de 7 chaves por página.
 O número máximo de ponteiros em um nó é a ordem ou grau da  Número mínimo de chaves por página
árvore.
Quando uma página é dividida na inserção, os nós são divididos igualmente
 O número máximo de ponteiros é igual ao número máximo de entre as páginas velha e nova. Deste modo, o número mínimo de chaves em
descendentes de um nó. um nó é dado por (m / 2) - 1 (exceto para a raiz).

Ex: Uma árvore B de ordem 8 que tem um máximo de 7 chaves por página tem
Ex: uma árvore B de ordem 8 possui nós com no máximo 7 chaves um mínimo de 3 chaves por página.
e 8 filhos.
 Nó folha
 Um nó folha não possui filhos, e seus ponteiros são nulos. Os nós folhas são aqueles alocados no nível mais baixo da árvore.
Definição formal das Propriedades de uma B- Pesquisa
trees  Árvores B de ordem 4 com 3 níveis
 Para uma B-tree de ordem m:

1. Cada página tem um máximo de m descendentes;


30
2. Cada página, exceto a raiz e as folhas, tem um mínimo de (m / 2) - 1
descendentes;
10 20 40 50
3. A raiz tem um mínimo de dois descendentes - a menos que seja uma
folha;
34 8 9 11 13 17 25 28 33 36 43 45 48 52 55
4. Todas as folhas aparecem num mesmo nível;

5. Uma página que não é folha e possui k descendentes contém k-1


chaves; chave1 chave 2 ....... chave2m
6. uma página folha contém no mínimo (m / 2) -1 e no máximo m - 1
chaves p1 p2 p3

Inserção Remoção
 Inserção do registro com chave 14
 O processo de divisão (split) de páginas garante a manutenção das
propriedades da B-tree durante a inserção. Essas propriedades precisam ser
 O registro deve ser inserido na 1 mantidas, também, durante a eliminação de chaves.
página 3. 10
Caso 1: eliminação mantém número mínimo de chaves na página.
Solução: Chave é retirada e registros internos à página reorganizados.
 A página está cheia 2 3
34 8 9 16 20 25 29 Caso 2: eliminação de chave que não está numa folha.
 A pagina 3 é dividida em duas (3,4) Solução: Sempre eliminamos da folha. Se uma chave deve ser eliminada de
uma página que não é folha, trocamos a chave com sua sucessora imediata, a
1 qual, com certeza está numa folha, e então eliminamos a chave da folha.
 Os m +1 registros são distribuídos
igualmente e o registro do meio 10 20 Caso 3: eliminação causa underflow na página.
movido para a página pai O número mínimo de chaves por página nessa árvore é m/2 -1 = 6/2 -1=2.
2 3 Solução: Redistribuição. Procura-se uma página irmã (mesmo pai) que
4
contenha mais chaves que o mínimo: se existir redistribui-se as chaves entre
 Se a página pai estivesse cheia 3489 14 16 25 29 essas páginas. A redistribuição causa a colocação de uma nova chave de
separação no nó pai.
aplicar o mesmo método

Remoção Remoção
Retirar a chave 3
Caso 4: ocorre underflow e a redistribuição não pode ser aplicada.
Quando não existirem chaves suficientes para dividir entre as duas páginas
irmãs. 4 4
Solução: Deve-se utilizar concatenação: combina-se o conteúdo das duas
páginas e a chave da página pai para formar uma única página. Concatenação
é o inverso do Splitting. Como conseqüência, pode causar o underflow da 6 8
página pai. 2 6 8

Caso 5: underflow da página pai 5 7 9


Solução: No exemplo, a concatenação das páginas 3 e 4 retira D a página 1, 1 3 5 7 9 12
causando underflow na página 1. Redistribuição não pode ser aplicada (por
quê?). Deve-se utilizar concatenação novamente.
6
Caso 6: Diminuição da altura da árvore.
Conseqüência da concatenação dos filhos do nó.
Solução: A concatenação das páginas 1 e 2 absorve a única chave da raiz. 4 8
 Este caso mostra o que ocorre quando a concatenação é propagada até a raiz.
Note que esse nem sempre é o caso: se a página 2 (Q e W) tivesse mais uma
chave, aplicaria-se redistribuição em vez de concatenação.
12 5 7 9
Árvore B* Árvore B*
 A árvore B* é uma das alternativas de  Pesquisar sempre até a página folha. Quando a chave é encontrada
implementação para a árvore B original, onde: em uma página de índice segue-se o apontador a direita até encontrá-
 todos os registros são armazenados no último la na página folha. Ex. 29, 60,75
nível (páginas folhas)  Inserção similar a árvore B. Exceto quando uma folha é dividida em
índice
 os níveis acima são um índice com a organização duas: fazer uma cópia do registro do meio para a página pai e deixar
de uma árvore B o registro na página folha da direita.
 no índice só estão as chaves e os apontadores, Árvore B  Retirada mais simples que na árvore B.
sem nenhuma informação associada enquanto
nas páginas folhas estão todos os registros do
arquivo 45
 Vantagens ...
 As páginas folhas são conectadas da esquerda
para direita o que permite um acesso seqüencial
mais eficiente do que o acesso através do índice registros 9 29 60 75
 Facilita o acesso concorrente ao arquivo

145 9 18 19 22 29 33 45 50 52 60 65 70 75 80

Implementação Árvore B/B*


Procedure PesquisaArvoreB (var x : Registro; var Ap : Apontador);
var i: integer;
begin
type Registro = record type Registro = record if Ap = nil then {chegou na página folha}
Chave: TipoChave; Chave: TipoChave; writeln( ‘Registro não está presente na árvore’)
{Outros Componentes} {Outros Componentes} else with Ap^ do
end; end; begin
Apontador = ^Pagina; Apontador = ^Pagina; i := 1;
Pagina = record PaginaTipo = (Interna, Externa); while (i < n) and (x.Chave > r[i]. Chave do
Numero-registros: 0 ...2m; Pagina = record i := i + 1;
Registros: array[1 ..2m] of Registro; Case Pt: PaginaTipo of if x. Chave = r[i].Chave then {achou}
Ponteiros: array[0 ..2m] of Apontador; Interna:
x:= r[i]
End; (Numero-registros: 0 ...2m;
else
TipoDicionario = Apontador; Registros: array[1 ..2m] of TipoChave; if x. Chave < r[i].Chave then {esquerda}
Ponteiros: array[0 ..2m] of Apontador;); PesquisaArvoreB (x, p[i-1])
Externa: else {direita}
(Numero-registros: 0 ...4m; PesquisaArvoreB (x, p[i]);
Registros: array[1 ..4m] of Registro;) end;
End; end;
TipoDicionario = Apontador;

Procedure PesquisaArvoreBEstrela (var x : Registro; var Ap : Apontador); Acesso Concorrente em Árvore B*


var i: integer;
begin
if Ap^.Pt = Internal then
with Ap^ do
begin
 Acesso para apenas um processo de cada vez cria um gargalo inaceitável
i := 1;
no sistema
while (i < n) and (x.Chave > r[i]. Chave do i := i + 1;
 Acesso simultâneo ao Banco de Dados é importante
if x. Chave < r[i].Chave then {esquerda}  Concorrência aumenta utilização e tempo de resposta do sistema
PesquisaArvoreBEstrela (x, p[i-1])  Problemas: Dois processos acessam simultaneamente o banco
else {Maior ou igual - direita}  um processo pesquisa uma chave e está seguindo um apontador para a
PesquisaArvoreBEstrela (x, p[i]) subárvore correspondente
end  outro processo insere um novo registro que provoca divisões de páginas na
else with Ap^ do {Externa} mesma subárvore
begin
 o apontador utilizado pelo processo de pesquisa fica apontando para a
subárvore errada ou inexistente.
i := 1;
while (i < n) and (x.Chave > r[i]. Chave do i := i + 1;
 Deve-se criar protocolos para garantir a integridade dos dados
if x. Chave = r[i].Chave then {achou} x:= r[i]
 Página segura: não provoca modificação na estrutura da árvore
else writeln( ‘Registro não está presente na árvore’);
 inserção: número atual de chaves na árvore < 2m
end;
 retirada: número atual de chaves na árvore > m
end;
 pesquisa: não altera a estrutura da árvore
Protocolos de Bloqueio (Lock Protocols) Protocolos de Bloqueio (Lock Protocols)

 Bloqueio para leitura  Bloqueio exclusivo


 Processos leitores: pesquisa  Processos modificadores: inserção, remoção

 Permite um ou mais leitores acessarem os dados mas não permite  Bloqueia a página apenas para um processo que pode executar

inserção ou retirada de dados qualquer tipo de operação


 Bloquear para leitura a raiz  Colocar bloqueio exclusivo na raiz

 Ler a página raiz (página corrente = raiz)  Ler a página raiz (página corrente = raiz)

 Bloquear para leitura o descendente apropriado  Colocar Bloqueio exclusivo no descendente apropriado

 Liberar bloqueio na página corrente  Ler página descendente (pag. corrente = descendente)

 Ler página descendente (página corrente = descendente)  Se a página corrente é segura então libere todos os bloqueios

 Seguir seqüência de bloqueios até página corrente = página folha mantidos sobre as páginas antecessoras da página corrente
 Senão mantenha os bloqueio

 Seguir seqüência de bloqueios até página corrente = página folha

 Evitar Deadlock: dois processos estão se bloqueando mutuamente e


cada um dos processos fica esperando pelo desbloqueio do outro
eternamente

Arvores B

 Exemplo

 http://slady.net/java/bt/view.php?w=800&h=600