1 UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA - CIÊNCIA DA COMPUTAÇÃO DEPARTAMENTO DE INFORMÁTICA APLICADA CLASSIFICAÇÃO E PESQUISA DE DADOS – INF01124 EDUARDO DA SILVA SARDÃO – 0981/00-4 IGOR RODRIGO MACHADO DE MENEZES – 1422/98-1 TRABALHO FINAL ÁRVORES B+ Documentação do trabalho de implementação de uma árvore B+ que simula um pequeno banco de dados. Prof. Dr. Maurício Lima Pilla Turma U Porto Alegre, dezembro de 2004 2 SUMÁRIO LISTA DE ABREVIATURAS E SIGLAS …......................................................... 3 LISTA DE FIGURAS .......................................................................................... 4 LISTA DE TABELAS .......................................................................................... 4 RESUMO ............................................................................................................ 5 ABSTRACT ........................................................................................................ 6 1 INTRODUÇÃO ............................................................................................ 7 2 ÁRVORES B .............................................................................................. 2.1 Árvores B+ .............................................................................................. 2.2 Outras variações ................................................................................... 8 8 9 3 DEFINIÇÃO DE ÁRVORE B+ .................................................................... 3.1 Altura da árvore B+ ................................................................................ 3.2 Ordem e capacidade de uma árvore B+ ............................................... 10 10 10 4 OPERAÇÕES .............................................................................................. 4.1 Criação ...................................................................................................... 4.2 Busca ....................................................................................................... 4.3 Inserção .................................................................................................... 4.3.1 Divisão .................................................................................................. 4.3.2 Inserção Propriamente dita ................................................................ 4.4 Remoção ................................................................................................... 4.4.1 Fusão .................................................................................................... 4.4.2 Remoção Propriamente dita ............................................................... 12 12 12 12 13 13 14 14 14 5 CONCLUSÃO .............................................................................................. 16 REFERÊNCIAS .................................................................................................. 17 3 LISTA DE ABREVIATURAS E SIGLAS AVL LRU ms ns Adelson-Velskii e Landism Less Recently Used – Menos Recentemente Usado. milisegundos nanosegundos 4 LISTA DE FIGURAS Figura 2.1: Árvore B de ordem m=4 ............................................................................ 9 Figura 2.2: Exemplo de uma árvore B+ de ordem m=5 e capacidade b=4 .................... 9 Figura 3.1: Comparação de um caso mínimo de árvore B+ com altura h, ordem m e capacidade b ............................................................................................. 11 Figura 4.1: Inserção da chave 40 em nodo com espaço (1) e inserção da chave 10 em nodo cheio (2). Note que a raiz também estava cheia, necessitando de uma divisão recursiva. Demais nodos formam omitidos para facilitar entendimento. ........................................................................................... 13 Figura 4.2: Remoção de chaves em uma árvore B+ de ordem m= ............................. 15 LISTA DE TABELAS Tabela 2.1: Comparação entre memória principal e secundária .................................... 9 Tabela 3.1: Exemplos de altura máxima de árvores B+ de ordem m, capacidade b=4, com n elementos ....................................................................................... 11 5 RESUMO Este documento é uma explicação teórica sobre árvores B+ e fornece a base para entende como criar um banco de dados usando uma estrutura de árvore B+, suas vantagens sobre outros algoritmos baseados em árvores e a melhor aplicação para ela. Palavras-chave: Árvore B+. 6 B+-TREE ABSTRACT This document is a theoretic explanation about B+-trees and gives the bases to understand how create a data banc using B+-tree structure, its advantages over other tree based algorithms and the best application for it. Keywords:. B+-tree, Bplus-tree. 7 1 INTRODUÇÃO Esta documentação visa dar o embasamento teórico sobre árvores B+, descrevendo de forma objetiva os passos necessários à implementação de um banco de dados hipotético estruturado na forma de uma árvore B+, suas vantagens e noções básicas do custo das operações envolvidas, tanto em relação ao uso de processador quanto a acessos a disco. 8 2 ÁRVORES B Árvores B são uma variação específica de árvores destinadas a armazenar quantidades elevadas de dados, muito maiores do que a memória principal disponível, caso no qual uma árvore binária não se ajusta adequadamente. A principal preocupação de uma árvore B é armazenar os dados em memória secundária, o disco rígido, por esse motivo sua estrutura é voltada a usar blocos do tamanho dos setores do disco rígido utilizado. Além da estrutura em blocos, um objetivo de uma árvore B é reduzir o número de acessos a disco, entre 10.000 e 100.000 vezes mais lento que a memória principal, sendo o número de acessos proporcional a altura da árvore, uma arvore B com um grau de ramificação (ordem) maior que dois, para um dado número de chaves, tem altura bem inferior a uma árvore AVL1 (árvore binária com balanceamento dinâmico), o que reduz significativamente o custo de uma pesquisa. Normalmente a ordem de uma árvore B é definida pelas características físicas da memória secundária empregada, o tamanho típico de um setor de disco é de 512 bytes, desta forma um bloco desta árvore B+ seria de 512 bytes. Tabela 2.1: Comparação entre memória principal e secundária Tempo de Velocidade de Transferência em acesso transmissão 10 ns Memória Principal 10-9 s (10 ns) 1000 Mbyte/seg 10 Mbytes Memória 10-3 s (10 ms) 50 Mbyte/seg 0,5 Mbytes Secundária (disco) 2.1 Árvores B+ Dentre as variações das árvores B, está a árvore B+, cujo emprego está associado à necessidade de realizar buscas seriais no banco de dados. Devido à dificuldade e alto custo devido ao número excessivo de acessos a disco em uma busca serial quando os dados estão distribuídos em páginas (blocos) diferentes da memória, uma das modificações na árvore B original foi a de introduzir um duplo encadeamento entre as diferentes páginas da área de dados, de modo a permitir a leitura seqüencial dos dados das folhas, outra modificação é a de replicar os índices nas folhas, assim garantindo que todos os dados podem ser acessados de forma seqüencial. 1 AVL: em homenagem aos matemáticos russos Adelson-Velskii e Landism – 1962, árvore binária que admire uma diferença de altura de no máximo 1 entre as suas sub-árvores esquerda ou direita. 9 2.2 Outras variações As árvores B admitem outras variações, além da árvore B+: Uma delas é a Árvore B Virtual, onde é incluído um gerenciamento de memória de modo a cachear a maior parte possível dos dados na memória principal, melhorando significativamente o desempenho, o acesso a disco só é fito quando uma página não está disponível, substituindo outra que esteja em desuso, ou conforme a necessidade. Outra possibilidade é a Árvore B*, proposta por Knuth em 1973, onde cada nó possui no mínimo dois terços das chaves. Figura 2.1: Árvore B de ordem m=4 Figura 2.2: Exemplo de uma árvore B+ de ordem m=5 e capacidade b=4 10 3 DEFINIÇÃO DE ÁRVORE B+ Uma árvore B+ é formada por nodos dimensionados conforme os setores do disco rígido empregado. Todas as folhas estão no mesmo nível, ou seja altura da árvore B+. O grau mínimo t é maior que um, e cada nodo interno possui no mínimo (t-1) chaves e no máximo (2t-1) chaves, uma árvore não vazia possui pelo menos uma chave na raiz. Por definição do trabalho será utilizado um setor de disco do tamanho de 256 bytes. 3.1Altura da árvore B+ A altura da arvore B+ é um fator importante, pois define o número de acessos a disco. Desta forma uma árvore com n elementos tem sua altura h definida em relação do grau mínimo t e o número de chaves: n 1 h log 1. 2 t 3.2Ordem e capacidade de uma árvore B+ Para melhor aproveitamento, a capacidade deve ser a maior possível, calculada baseado no tamanho de uma página, ou setor físico do disco rígido, tendo em vista o tamanho dos dados armazenados e os elementos básicos de um nodo como ponteiros, etc. Ordem m é o número máximo de filhos de cada nodo de uma árvore. Capacidade b é o número máximo de dados armazenado em uma folha. Dado um número total de elementos n, existe uma altura h tal que h 2 h 1 n m m b n b e h 2 log m b . 2 2 2 11 h 2 h 1 folhas 1 2 2 1 3 m 2 2 2 4 m 2 2 h 2 m m b (h 2 ) folhas 2 elementos 2 2 2 2 Figura 3.1: Comparação de um caso mínimo de árvore B+ com altura h, ordem m e capacidade b Tabela 3.1: Exemplos de altura máxima de árvores B+ de ordem m, capacidade b=4, com n elementos. n 103 104 105 106 107 108 m 10 20 30 40 50 100 5 4 4 3 3 3 6 5 4 4 4 4 8 6 5 5 5 4 9 7 6 6 5 5 11 8 7 6 6 5 12 9 8 7 7 6 12 4 OPERAÇÕES Para a implementação de um banco de dados baseado em uma árvore B+ são necessárias operações básicas: Construção: uma árvore B+ vazia é criada; Destruição: uma árvore B+, não necessariamente vazia é destruída; Busca: dada uma determinada chave é feita sua busca na estrutura da árvore B+; Inserção: insere uma nova chave dentro da árvore B+, uma chave já existente não pode ser inserida novamente; Remoção: remove da árvore uma chave, não necessariamente a chave precisa existir. 4.1 Criação A operação de criação de uma árvore B+ vazia é feita pela alocação de uma posição de memória para a raiz da árvore, e pela inicialização dos valores de folha, grau e sua gravação em disco. A complexidade da operação é de (1) e 1 acesso à memória secundária. 4.2 Busca O algoritmo de busca em uma árvore B+ é uma simples generalização do algoritmo de busca em árvores binárias. De maneira recursiva uma chave C é comparada com a primeira chave da raiz, caso seja menor é chamado recursivamente a mesma função para o nodo filho mais à esquerda, caso contrário compara com as chaves seguintes, até encontrar uma que seja maior ou caso não encontre buscará o filho mais à direita recursivamente, até encontrar a chave em uma folha, ou encontrar uma chave maior ou ser maior que as demais chaves folha. A Busca em uma árvore B+ é de uma complexidade de O(t) passos por nível da árvore, realizando um acesso à memória secundaria. Uma busca em uma árvore B+ realiza O(h) = O (logt n) acessos a memória secundária e O(ht) = O (t logt n) operações. 4.3 Inserção A realização de uma inserção em uma árvore B+ não é tão simples quanto em árvores binárias, pois devido à existência de mais de uma chave por nodo, pode ocorrer o fato de o nodo no qual a chave deveria ser inserida estar cheio, e para isso será necessário dividir o nodo em dois. 13 4.3.1 Divisão Quando um nodo atinge 2t-1 chaves ele é considerado cheio, não podendo receber mais nenhuma chave, mas no entanto pode ser necessária a alocação de uma nova chave nesta posição, para isso é feita a operação de divisão de nodo cheio, inserindo a chave central no nível superior e transformando o nodo cheio em dois novos nodos. A operação de divisão realiza 3 acessos escrita na memória secundária e O (t) operações. 4.3.2 Inserção propriamente dita Para realizar a inserção primeiramente é necessária uma busca recursiva pela posição onde deve ser inserida a chave. Uma das possibilidades é inserção na raiz, estando ela cheia, neste caso a altura da árvore será alterada conforme operação de divisão, supra citada, seguida da inserção da nova chave. A inserção pode ser feita em um nodo folha ou no corpo da árvore. No primeiro caso é localizado o nodo folha e feita uma busca serial do final do vetor até encontrar a posição onde deve ser inserida a chave, neste processo a chaves existentes são deslocadas uma posição para criar o espaço para a nova chave. Após realizada a inserção o nodo é gravado. Já se for um nodo interno, será realizada uma busca pela sub-árvore onde deve ser inserida a chave, no caso de nodo cheio será realizada a divisão (figura 4.1). No pior caso de uma inserção ela se dará numa folha, necessitando O (h) chamadas recursivas do procedimento de inserção, cada uma com O (1) acessos a memória secundária e O (t) operações. A complexidade total é de O (logt n) acessos a memória secundária e O (t logt n) operações. Figura 4.1: Inserção da chave 40 em nodo com espaço (1) e inserção da chave 10 em nodo cheio (2). Note que a raiz também estava cheia, necessitando de uma divisão recursiva. Demais nodos formam omitidos para facilitar entendimento. 4.4 Remoção 14 O caso inverso da inserção, desta vez é necessário verificar o número mínimo de chaves no nodo resultante (t-1), caso o nodo resultante não cumpra esta definição, devese realizar a fusão. 4.4.1 Fusão Quando um nodo do qual deve-se remover uma chave possui (t-1) chaves, ele já está com o tamanho mínimo admissível, a remoção de uma chave faz necessária a fusão deste nodo com um nodo vizinho. No caso de dois nodos adjacentes possuírem (t-1) chaves pode-se realizar a fusão dos dois nodos onde a chave do nodo pai que divide os dois nodos adjacentes será reposicionado no nodo resultante juntamente com as chaves dos adjacentes. A operação de divisão realiza 3 acessos escrita na memória secundária e O (t) operações. 4.3.2 Remoção propriamente dita Um pouco mais delicada de a operação simétrica (inserção), para a remoção são necessários alguns passos para garantir a estrutura de uma árvore B+. A remoção de chaves irá incorrer em um dos casos conforme Figura 4.2: (1) Remoção simples e direta, quando o nodo possui no mínimo t chaves; (2) Remoção de chave quando o nodo possui t-1 chaves e o nodo adjacente pelo menos t chaves; a) Pode ser realizado “empréstimo” do vizinho da direita; b) Pode ser realizado “empréstimo” do vizinho da esquerda; (3) Na exclusão de uma chave pode ocorrer de dois nodos adjacentes possuírem t-1 chaves, neste caso ocorrerá a fusão dos dois nodos adjacentes; (4) Na exclusão de uma chave de um nodo intermediário, pode ocorrer de dois nodos filhos possuírem t-1 chaves cada, neste caso ocorrerá a fusão dos dois nodos filhos adjacentes. O custo das operações é idêntico aos de inserção, no pior caso a remoção se dará numa folha, necessitando O (h) chamadas recursivas do procedimento de remoção, cada uma com O (1) acessos a memória secundária e O (t) operações. A complexidade total é de O (logt n) acessos a memória secundária e O (t logt n) operações. 15 Figura 4.2: Remoção de chaves em uma árvore B+ de ordem m=6. 16 5 CONCLUSÃO Após o estudo de diferentes tipos de árvores, e sua comparação com árvores B+, notasse que além de ser uma estrutura que aproveita as características físicas dos computadores para um melhor desempenho, as árvores em geral têm um ganho em relação às demais por sua altura reduzida em relação a árvores binárias, mais uma vez reduzindo o tempo de operação com um menor número de acessos a disco. O ganho ainda pode ser maior se for estruturado como uma árvore B+ Virtual, colocando uma boa parte da árvore na memória principal, e com um gerenciamento de memória virtual do tipo menos recentemente utilizada (LRU) terá as páginas mais recentes disponíveis, o que facilita a inserção e exclusão de chaves. 17 REFERÊNCIAS CORMEN, Thomas H.; LEISERSON, Charles E.; RIVEST, Ronald L. Introduction to Algorithms. McGraw Hill, 1990. Projeto de Algoritmos. Disponível em <http://www.cs.ust.hk/faculty/dimitris/ COMP530/notes/l6.pdf> acesso em dezembro de 2004. Today's Lecture. Disponível em <http://www.soe.ucsc.edu/classes/cmps180/Winter03/ Lectures/B+-Trees.pdf> acesso em dezembro de 2004. ZIVIANI, N. Projeto de Algoritmos com Implementações em Pascal e C. São Paulo, Livraria Pioneira Editora, 1993. 18 UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA - CIÊNCIA DA COMPUTAÇÃO DEPARTAMENTO DE INFORMÁTICA APLICADA CLASSIFICAÇÃO E PESQUISA DE DADOS – INF01124 EDUARDO DA SILVA SARDÃO – 0981/00-4 IGOR RODRIGO MACHADO DE MENEZES – 1422/98-1 TRABALHO FINAL ÁRVORES B+ Porto Alegre, dezembro de 2004