Você está na página 1de 27

Variações da Árvore B

Conteúdo

Árvore B*

Árvore B+

Árvore B+ de Prefixos

Árvore de Bit

Árvore R

Árvore 2-3-4

Árvore B*

Um nó em uma árvore B representa um bloco na memória secundária

Acessar um nó significa fazer acesso à memória secundária → tarefa cara → quanto menor o número de nós melhor

Uma árvore B* é uma variante da árvore B e foi criada por Donald Knuth e nomeada por Douglas Corner

Em uma árvore B*, todos os nós, exceto a raiz, devem estar 2/3 cheios

Mais precisamente, o número de chaves é dado por

Piso ( 2m 1 )≤ k m

3

Árvore B*

A frequência de divisão de nós é diminuída

Na árvore B*, um nó é dividido em três, ao invés de dois

Dessa forma, a média de utilização da árvore B* é de

81%

Para diminuir a frequência de divisões, uma divisão é atrasada

Observe o próximo exemplo em que a chave 6 é inserida em uma árvore B* de ordem 9

Árvore B*

Árvore B*

Árvore B*

Em vez de dividir o nó, todos as chaves desse nó e seu irmão são divididos igualmente e a mediana é colocada no seu pai

O aumento no fator de preenchimento pode ser feito de diversas formas

Alguns bancos de dados o fator de preenchimento pode ser escolhido entre 1 e 5

Uma árvore B que possui o requisito de estar pelo menos 75% cheia é chamada árvore B**

Esse conceito pode ser generalizado: Uma árvore

que possui a restrição de estar

n

+ 1

n

+ 2

cheia

B n

é uma árvore

Se um nó e seu irmão estão cheios, uma divisão ocorre: um novo nó é criado e as chaves são distribuídas entre os três nós

Árvore B*

Árvore B*

Árvore B+

Árvore B+

Como um nó em uma árvore B representa um bloco na memória secundária, a passagem de um nó para outro requer uma mudança de blocos, que consome muito tempo

A árvore B+ foi criada para que sejam feitos um número mínimo de acessos aos nós

Em uma árvore B+, as referências aos dados são feitas apenas às folhas

Os nós internos de uma árvore B+ possuem índices para realizar o acesso mais rápido aos dados

Essa parte da árvore é chamada conjunto de índices ou index set

Árvore B+

As folhas possuem uma estrutura diferente do index set

Elas são encadeadas sequencialmente formando um conjunto sequencial ou sequence set

Caminhar na lista encadeada formada pelas folhas resulta em dados ordenados de forma crescente

O nome árvore B+ foi dado pela seguinte razão:

É um indexador implementado como uma árvore B mais uma lista encadeada de dados

A figura a seguir apresenta uma árvore B+

Árvore B+

Árvore B+

Árvore B+

Os nós internos contém chaves, ponteiros e um contador de chaves

As folhas contém chaves, referências para registros em um arquivo de dados associados com as chaves, e ponteiros para próxima folha

As operações são similares as operações realizadas em uma árvore B

Inserção:

Se a folha contém espaço, a chave é colocada na folha adequada mantendo a ordem das chaves → nenhuma mudança é feita no index set

Árvore B+

Inserção:

Se a chave é inserida em uma folha cheia, a folha é dividida e o novo nó é inserido no sequence set → as chaves são distribuídas igualmente entre as folhas → a primeira chave do novo nó é copiada para o nó pai → se o pai não está cheio, os índices são reorganizados caso seja necessário → se o pai está cheio, ele é dividido como em uma árvore B

Remoção:

Quando a remoção não causa underflow, as chavas são apenas reorganizadas no nó

Árvore B+

Remoção:

Nenhuma alteração é feita no index set

Árvore B+ ● Remoção: – Nenhuma alteração é feita no index set

Árvore B+

Árvore B+

Arvore B+

Remoção:

Se a remoção causa um underflow, tanto as chaves do nó com underflow quanto as chaves do seu irmão são redistribuídas

o nó também pode ser excluído e as chaves são colocadas no seu irmão

Arvore B+

Arvore B+

Árvore B+ de Prefixos

Árvore B+ de Prefixos

Se há uma chave tanto no nó interno quanto no nó folha e a chave do nó folha precisa ser removida, é necessário apenas removê-la da folha, pois a chave do nó interno ainda funciona como guia na busca

O que importa, na verdade, é que a chave separadora seja aceitável, seguindo a condição K1 < s <= K2

Conseguimos manter essa propriedade diminuindo a chave separadora o máximo possível eliminando conteúdo redundante da chave

Uma árvore B+ de prefixos simples é uma árvore B+ que possui as menores chaves separadoras possíveis que permitam duas chaves de índice adjacentes

Árvore B+ de Prefixos

Árvore B+ de Prefixos

Árvore B+ de Prefixos

Árvore B+ de Prefixos

Árvore B+ de Prefixos

Fazer com que as chaves possuam valores mínimos não altera o resultado da busca

Mais separadores podem ser colocados no mesmo nó, de forma que os nós podem ter mais filhos

A árvore inteira pode ter menos níveis, o que reduz o que torna a busca da árvore mais rápida

As operações são similares às operações da árvore B+ com modificações para determinar os prefixos no conjunto de índices

Árvore B+ de Prefixos

Após uma divisão, a primeira chave do novo nó não é copiada para o nó pai

O prefixo mais curto é encontrado que diferencia ele da última chave no nó a esquerda, e então o prefixo é colocado no nó pai

Na remoção, alguns separadores podem ficar muito longos, mas para tornar a remoção mais rápida o separador não é alterado

Em uma árvore B+ de prefixos nos níveis mais baixos da árvore alguns prefixos são omitidos

Árvore B+ de Prefixos

Árvore B+ de Prefixos

Árvore B+ de Prefixos

Árvore B+ de Prefixos

Árvore B+ de Prefixos

Esse método funciona bem se os prefixos são longos e repetidos

Para recuperar o prefixo original, a chave do pai, excluindo o último caractere, é concatenada com com a chave do nó corrente

Experimentos indicaram que não há muita diferença entre o tempo necessário para executar algoritmos em árvores B+ e árvores B+ de prefixos simples, mas árvores B+ de prefixos precisam de 50% a 100% de mais tempo

Árvore B+ de Prefixos

Em termos de acesso ao disco, não há muita diferença entre essas árvores para árvores com até 400 nós

Para árvores de 400 a 800 nós, tanto as árvores B+ de prefixos simples e árvores B+ de prefixos necessitam de 20-25% a menos de acessos

O que podemos concluir?