Usuário:Aexpedito/B*tree

Origem: Wikipédia, a enciclopédia livre.

Uma árvore B* é uma estrutura de dados na ciência da computação e uma variação da árvore B proposta em 1973 por Donald E. Knuth. Esta apresenta mecanismos de inserção, remoção e busca muito semelhantes aos realizados em árvores B, mas com a diferença em que a técnica de redistribuição de chaves também é empregada durante as operações de inserção. Dessa maneira a operação de split pode ser adiada até que duas páginas irmãs estejam completamente cheias e, a partir daí, o conteúdo dessas páginas irmãs é redistribuído entre três páginas (uma nova criada e as duas páginas irmãs anteriormente cheias).

Tal técnica é conhecida como divisão two-to-three split, ou no português divisão de dois para três, que proporciona propriedades diferentes das árvores B na qual utiliza a divisão usual conhecida como one-to-two split. A grande melhoria direta proporcionada por essa abordagem é o melhor aproveitamento de espaço do arquivo, pois, no pior caso, cada página apresenta no mínimo 2/3 do número máximo de chaves que esta pode armazenar, enquanto na divisão usual cada página apresenta, no pior caso, metade do número máximo de chaves.

Definição[editar | editar código-fonte]

Segundo a definição de Knuth [1]uma árvore B* de ordem m apresenta as seguintes propriedades:

  1. Cada página apresenta no máximo m páginas filhas
  2. Uma página folha contém pelo menos ⌊(2m-1)/3⌋ chaves e no máximo m-1
  3. Todas as páginas folha estão no mesmo nível
  4. Toda página, exceto a raiz e as folhas possuem no máximo (2m-1)/3 descendentes
  5. Uma página não folha com k páginas filhas possui k-1 chaves

Operações básicas[editar | editar código-fonte]

Na inserção da chave 20 ocorre a redistribuição das chaves entre páginas filhas. Enquanto na inserção da chave 22 não há como redistribuir as chaves, logo ocorre a operação de split

Comparação com árvores B[editar | editar código-fonte]

Assim como as árvores B as chaves numa árvore B* ficam armazenadas nas páginas internas, folha e raiz. A principal diferença é relacionada ao momento de inserção de chaves, na qual utiliza a redistribuição de chaves entre páginas irmãs até que estas estejam completamente cheias. Desse modo a operação de split é atrasada até que duas páginas irmãs estejam completamente cheias, conferindo maior aproveitamento de espaço em arquivo.

Vale lembrar que a página raiz de uma árvore B* deve ser tratada de forma especial, pois esta não possui uma página irmã e, portanto, deve sofrer uma divisão do tipo one-to-two ou deve-se aumentar sua capacidade de armazenamento de chaves.

Ver também[editar | editar código-fonte]

Referências

  1. Folk, Michael; Zoellick, Bill (1992). File Structures (em inglês) 2 ed. [S.l.]: Addison-Wesley. p. 372 


Bibliografia[editar | editar código-fonte]

  • Folk, Michael; Zoellick, Bill (1992). File Structures (em inglês) 2 ed. [S.l.]: Addison-Wesley. 590 páginas. ISBN 0-201-55713-4 
  • Langsam, Yedidyah; J. Augenstein, Moshe, M. Tenenbaum, Aaron (1996). Data Structures Using C and C++ (em inglês) 2 ed. [S.l.]: Prentice Hall. 672 páginas. ISBN 0-13-036997-7 
  • Knuth, Donald (1998). The Art of Computer Programming. Sorting and Searching (em inglês). 3 2 ed. [S.l.]: Addison-Wesley. ISBN 0-201-89685-0 

Ligações externas[editar | editar código-fonte]

Dicionário de Algoritmos e Estrutura de dados

[[Categoria:Estruturas de dados]] [[:de:B*-Baum]]