UNIVERSIDADE ESTADUAL DE MARINGÁ DEPARTAMENTO DE INFORMÁTICA Busca em Memória Secundária e Gomes da Costa yandre@din.uem.br 1
Busca de um item em uma massa de dados que não cabe na memória principal; Procura-se reduzir ao máximo o número de acessos à memória secundária; Por que o tempo de acesso à memória secundária é tão mais lento? 2
Segundo (Drozdek, 2002), o tempo de acesso em memória secundária é dado por: T acesso = T latência + T procura + T transferência T latência : tempo decorrido até que o disco gire para que a cabeça de leitura se posicione sobre o bloco a ser lido; T procura : deslocamento da cabeça de leitura até a trilha a ser lida; T transferência : dado pela taxa de transferência (capacidade do dispositivo); 3
Um exemplo: Supondo um acesso à um dispositivo que gira a 3000 rpm em que se pretende transferir 5 kbytes; Neste caso: T latência = 10 ms (tempo de meia volta); Supondo que sejam gastos 40 ms para se localizar a trilha a ser lida: T procura = 40 ms; Considerando um dispositivo com taxa de transferência de 1000 kbytes/s: T transferência = 5 ms; Assim: T acesso = 10 ms + 40 ms + 5 ms = 55 ms 4
O exemplo mostra um tempo de acesso da ordem de ms; O tempo de execução de instruções pela CPU é da ordem de microssegundos, nanossegundos, ou mais rápido; Assim fica clara a necessidade de diminuir acessos em memória secundária; 5
Árvore B (Bayer e McCreight, 1972) Estrutura projetada para diminuir o número de acessos em uma busca; Agrupa vários itens em um só nó, formando um agrupamento conhecido como página; página 6
Observe que a ordem da árvore se altera: neste exemplo ela se torna quaternária; Diminuição do número de buscas na estrutura; Um exemplo (Ziviani, 2002): Busca em uma massa com 10 6 (1 milhão) de registros; Em uma ABB: log 2 10 6 20 Na árvore descrita anteriormente: log 4 10 6 10 Se ampliássemos o número de registros por nó para 127, qualquer elemento poderia ser encontrado com, no máximo, 3 buscas na estrutura; 7
Número de registros por página: Segundo (Drozdek, 2002), na prática o número de registros por página deve variar entre 50 e 500; De acordo com (Cormen et al., 2002), este número pode variar entre 50 e 2000; De fato, é interessante que este número seja tal que corresponda aproximadamente ao tamanho de um bloco do disco (aproveita-se melhor o tempo de acesso); 8
Exercícios: Calcule o tempo de acesso de 250 kbytes de dados em um disco que gira a 7200 rpm e que possui taxa de transferência de 2000 kbytes/s. Considere ainda que a cabeça de leitura gasta 70 ms para se deslocar de um extremo ao outro do disco e que, nesta situação, a cabeça se encontra inicialmente em um extremo do disco e a trilha a ser lida encontra-se à uma distância que equivale a 2/3 da distância máxima possível a ser percorrida; Qual é o número médio (aproximado) de buscas realizadas para se encontrar um registro em uma Árvore que possui 63 registros por página e que armazena uma massa de 10 8 registros? 9
Definição de Árvore B: Segundo (Ziviani, 2002), uma Árvore B de ordem m * é tal que: Cada página possui, no mínimo m registros (e m+1 descendentes) e no máximo 2m registros (e 2m+1 descendentes), exceto a página raiz, que pode conter entre 1 e 2m registros; Todas as páginas folha aparecem no mesmo nível. * Diverge de outras definições. 10
Relação entre as páginas e suas páginas filhas: chave 1 chave 2... chave 2m pág 1 pág 2 pág 3 pág 2m pág 2m+1 Registros armazenados na página i são menores do que a chave i e maiores do que a chave i-1; 11
Exemplo de Árvore B: 30 10 20 40 50 3 4 8 9 11 13 17 25 28 33 36 43 45 48 52 55 Ordem m=2 com 3 níveis; Todas as páginas contêm 2, 3 ou 4 registros, exceto a raiz; 12
Particularidades de Árvore B: Depois de uma série de inserções e remoções a árvore apresenta taxa de ocupação de 69% (Drozdek, 2002); Crescimento das folhas para a raiz; Inserção de registros: Caso trivial: inserir o registro em uma página com menos de 2m registros; Caso a página já tenha 2m registros, deve-se criar uma nova página; 13
Exemplos de inserção: Seqüência a inserir: 50, 20, 30, 37, 42, 47, 41 e 60; Árvore de ordem m=2; a b c 50 20 50 20 30 50 d 20 30 37 50 14
Criação de nova página: Transfere-se o elemento central da seqüência que provocou o estouro para a página do nível superior e cria-se duas páginas com os demais elementos; Note que, isto também pode provocar estouro na página do nível superior; Ainda resta inserir: 42, 47, 41 e 60; d 20 30 37 50 15
Continuando a inserção: Próximo registro: chave 42; d 20 30 37 50 Seqüência ordenada das 2m+1 chaves: 20, 30, 37, 42, 50; A chave central (37) é transferida para o nível superior e cria-se duas páginas com as demais; e 37 20 30 42 50 16
Continuando a inserção: f 37 Inserindo 47 Inserindo 41 20 30 42 47 50 g 37 20 30 41 42 47 50 17
Continuando a inserção: Inserindo 60 h 37 47 Exercício: 20 30 41 42 50 60 A partir desta árvore descreva a inserção de uma seqüência de registros com chaves 31, 32, 43, 44, 61 e 62. 18
Árvore obtida: i 37 47 Exercício: 20 30 31 32 41 42 43 44 50 60 61 62 Agora, faça a inserção dos registros com chaves 33 e 45. 19
Árvore obtida: j 31 37 43 47 20 30 Exercício: 32 33 41 42 44 45 50 60 61 62 Agora, faça a inserção dos registro com chave 63. 20
Árvore obtida: 43 k 31 37 47 61 20 30 32 33 41 42 44 45 50 60 62 63 21
Operação de remoção: Caso trivial 1: Quando o registro a ser removido estiver em uma página folha com pelo menos m+1 registros; Quando o registro a ser removido não estiver numa página folha: Substitui-se o registro por um que contenha uma chave adjacente (antecessora ou sucessora); Caso trivial 2: Quando o substituo estiver originalmente em uma página com, pelo menos, m+1 registros; 22
Exemplo (caso trivial 1) Remover o registro com chave 38 da seguinte árvore: 43 31 37 47 61 20 30 32 33 38 40 41 42 44 45 50 60 62 63 23
Exemplo (caso trivial 2) Remover o registro com chave 43 da seguinte árvore: 43 31 37 47 61 20 30 32 33 40 41 42 44 45 50 60 62 63 24
42 31 37 47 61 20 30 32 33 40 41 44 45 50 60 62 63 25
E quando, após uma remoção, uma página fica com menos de m registros? Neste caso uma propriedade da Árvore B é violada; Com isto, é necessário tomar emprestado um registro da página vizinha; Nesta situação, duas coisas podem ocorrer: O número de registros da página vizinha é maior que m. Assim, basta tomar um registro emprestado e trazê-lo para a página em questão via página pai. 26
Exemplo Remover o registro com chave 33 da seguinte árvore: 43 31 37 47 61 20 30 32 33 40 41 42 44 45 50 60 62 63 27
43 31 40 47 61 20 30 32 37 41 42 44 45 50 60 62 63 28
A segunda possibilidade é a de que a página vizinha também tenha exatamente m registros (neste caso as duas juntas têm 2m-1 registros); Nesta situação as duas páginas devem ser fundidas em uma só; 29
Exemplo: remoção do registro com chave 41 da seguinte árvore: 31 40 20 30 20 30 32 37 41 42 31 32 37 40 42 30
Observe que, dependendo do contexto, o processo pode se propagar até a raiz; Exemplo: remover o registro com chave 41 da seguinte árvore: 31 40 43 47 61 20 30 32 37 41 42 44 45 50 60 62 63 31
Etapa 1: 43 31 47 61 20 30 32 37 40 42 44 45 50 60 62 63 32
Etapa 2: 31 43 47 61 20 30 32 37 40 42 44 45 50 60 62 63 33
Resultado: 31 43 47 61 20 30 32 37 40 42 44 45 50 60 62 63 34
Eliminação de uma chave em Árvore B: 1. Se a chave não estiver numa folha, troque-a com seu sucessor imediato. 2. Elimine a chave da folha. 3. Se a folha continuar com o número mínimo de chaves, fim. 4. A folha tem uma chave a menos que o mínimo. Verifique as páginas irmãs da esquerda e direita: 4.1.se uma delas tiver mais que o número mínimo de chaves, aplique redistribuição. 4.2.senão concatene a página com uma das irmãs e a chave pai. 5. Se ocorreu concatenação, aplique passos de 3 a 6 para a página pai. 6. Se a última chave da raiz for removida, a altura da árvore diminui. 35
Exercício: Dada a seguinte Árvore B, descreva o estado da mesma após realizar a remoção dos registros com seguintes seqüências de chave; 45, 30 e 28; 50, 8, 10, 4, 20, 40, 55, 17, 33, 11 e 36; 3, 9 e 52. 10 20 30 40 50 3 4 8 9 11 13 17 25 28 33 36 43 45 48 52 55 36
Soluções possíveis: 10 25 40 50 3 4 8 9 11 13 17 20 33 36 43 48 52 55 13 3 9 25 43 48 52 13 25 43 48 37
Uma forma de declarar a estrutura de uma página de ordem 2: const int m = 2; typedef struct no_arvoreb arvoreb; struct no_arvoreb { int num_chaves; int chaves[2*m]; arvoreb *filhos[2*m+1]; bool folha; }; 38
Algoritmo de varredura em ordem: void em_ordem(arvoreb *raiz) { int i; if (raiz!= NULL) { for (i = 0; i < raiz->num_chaves; i++) { em_ordem(raiz->filhos[i]); printf("\n%d", raiz->chaves[i]); } em_ordem(raiz->filhos[i]); } } 39
Algoritmo de Busca (busca na página): int busca_binaria(arvoreb *no, int info) { int meio, i, f; i = 0; f = no->num_chaves-1; while (i <= f) { meio = (i + f)/2; if (no->chaves[meio] == info) return(meio); //Encontrou. Retorna a posíção em que a chave está. else if (no->chaves[meio] > info) f = meio - 1; else i = meio + 1; } return(i); //Não encontrou. Retorna a posição do ponteiro para o filho. } 40
Algoritmo de Busca (busca na árvore): bool busca(arvoreb *raiz, int info) { arvoreb *no; int pos; //posição retornada pelo busca binária. no = raiz; while (no!= NULL) { pos = busca_binaria(no, info); if (pos < no->num_chaves && no->chaves[pos] == info) return(true); else no = no->filhos[pos]; } return(false); } 41
Trabalho prático: Implementar em linguagem C as operações de inserção e remoção em uma Árvore B de ordem 2; O trabalho pode ser feito individualmente ou em dupla; A data de entrega é 02/10/2006; O código fonte deverá ser apresentado pela dupla ao professor; A nota será individual, pois dependerá inclusive do desempenho durante a apresentação; Se forem identificados trabalhos copiados, todos os envolvidos terão nota zero. 42
Referências Bibliográficas: Cormen, Thomas H. et al. Algoritmos teoria e prática. Rio de Janeiro: Elsevier, 2002; Drozdek, Adam. Estrutura de Dados e Algoritmos em C++. São Paulo: Pioneira Thomsom Learning, 2002; Ziviani, Nivio. Projeto de Algoritmos com implementações em Pascal e C. São Paulo: Pioneira Thomsom Learning, 2002; 43