Você está na página 1de 7

UNIVERSIDADE FEDERAL DE OURO PRETO - UFOP

INSTITUTO DE CIÊNCIAS EXATAS E BIOLÓGICAS - ICEB


DEPARTAMENTO DE COMPUTAÇÃO - DECOM

GABRIEL BRUNO PEREIRA NEGRI


BERNARDO ALEXANDRE
RICARDO MOREIRA

PESQUISA EXTERNA
RELATÓRIO TRABALHO PRATICO I

OURO PRETO
2020
INTRODUÇÃO

O problema da busca (ou pesquisa) dado um conjunto de elementos, onde


cada um é identificado por uma chave, o objetivo da busca é localizar, nesse
conjunto, o elemento que corresponde a uma chave específica.

Vários métodos e estruturas de dados podem ser empregados para se


fazer busca. Certos métodos de organização/ordenação de dados podem tornar
o processo de busca mais eficiente.

Para tal fim, duas estruturas foram implementadas e analisadas, sendo


elas: Acesso Sequencial Indexado, Árvore Binária de Pesquisa, Árvore B e
Árvore B*.

OBJETIVO

Realizar um estudo da complexidade de desempenho dos métodos de


pesquisa externa exigidos, e como estes algoritmos se portam nos quesitos de
número de transferências (entre a memória externa e a memória interna),
número de comparações (entre chaves de pesquisa) e tempo de execução
(tempo do término de execução menos o tempo do início de execução).

METODOLOGIA

Foi desenvolvido um algoritmo completo em linguagem C/C++ que simula


o funcionamento de todos os métodos de pesquisa propostos. O programa foi
implementado de tal forma a ser capaz de ser executado, livremente, a partir da
seguinte linha de comando no console:

./<executável><método><quantidade><situação><chave>[-P]

onde:

<executável> representa o nome do programa;

<método> representa o método de pesquisa externa a ser executado, podendo


ser um número inteiro de 1 a 4, sendo:
[1] – Pesquisa Sequencial Indexada;

[2] – Árvore B;

<quantidade> representa a quantidade de registros do arquivo considerado, um


número entre 1 e 2.000.000 registros quaisquer;

<situação> representa a situação de ordem do arquivo, podendo ser um número


entre 1 e 3, sendo:

[1] – Arquivo ordenado ascendentemente;

[2] – Arquivo ordenado descendentemente;

[3] – Arquivo desordenado aleatoriamente;

<chave> representa a chave a ser pesquisada no arquivo considerado;

[-P] representa um argumento opcional que deve ser colocado quando se deseja
que as chaves de pesquisa dos registros do arquivo considerado sejam
apresentadas na tela.

DESENVOLVIMENTO

A implementação de cada estrutura foi dividida em TAD’s, para se obter


um MAIN (função principal) mais sucinto, objetivo e de fácil entendimento. Cada
estrutura contém um cabeçalho (.h) com os protótipos dos métodos, e um
arquivo (.cpp) com as respectivas implementações. Desse modo, serão
discutidos o funcionamento, implementação e a complexidade dos seguintes
algoritmos:

I. Acesso Sequencial Indexado


II. Árvore Binária de Pesquisa
III. Árvore B
IV. Árvore B*
Descrição do experimento

A 1a fase deste trabalho corresponde à implementação em C/C++ dos


métodos mencionados, considerando arquivos binários de registros quaisquer e
memória interna disponível para armazenar os índices necessários, quando for
o caso.

A 2a fase corresponde à análise experimental da complexidade de


desempenho dos métodos mencionados, considerando as etapas de criação dos
índices necessários, quando for o caso, e da própria pesquisa. Foram realizados
experimentos considerando arquivos contendo 100, 1.000, 10.000, 100.000 e
1.000.000 registros quaisquer cujas chaves serão pesquisadas.

Acesso Sequencial Indexado

O Acesso Sequencial Indexado utiliza o princípio da pesquisa sequencial,


onde cada item é lido sequencialmente até encontrar uma chave maior ou igual
a chave de pesquisa. Como o nome sugere, esse método utiliza alguns índices
para limitar a faixa de atuação dos loops e refinar a pesquisa. Ao invés de
percorrer a lista elemento a elemento, o programa “salta” para a faixa de
refinamento mais adequada conforme indica o índice, para, apenas após isso,
começar a percorrer a lista, exigindo menos tempo e menor consumo de
memória durante a pesquisa.

Tem-se como requisito necessário para utilização do método que o


arquivo esteja ordenado (ascendente ou descendentemente) pela chave de
pesquisa.

Vantagens e desvantagens

A principal vantagem é a utilização do vetor de índices que diminui o


número de acessos ao arquivo, o que tem um alto custo. No entanto, possui
como desvantagem a inserção dos registros em arquivo que devem ser feitos
ordenadamente (ascendente ou descendentemente), ou serem tratados com
algum tipo de ordenação prévia.
Árvore Binária de Pesquisa

A Árvore Binária de Pesquisa são estruturas eficientes quando a memória


principal armazena todos os itens. Elas proporcionam acesso direto e
sequencial, facilidade de inserção e retirada de itens, e boa utilização de
memória.

Essa estrutura tem seu método ligado ao mesmo conceito de uma árvore
binária de pesquisa em memória principal, onde cada pai tem seu filho à direita
e à esquerda, porém quando se trata de um número de registros
consideravelmente grande e têm-se por necessidade armazená-los em arquivos,
o custo de acesso se torna grande.

A forma de organizar os nodos dentro de páginas é muito importante em


relação ao nº esperado de páginas lidas quando se realiza uma pesquisa. A
organização ótima é difícil de ser obtida durante a construção da árvore
(problema complexo de otimização).

Vantagens e desvantagens

A maior vantagem em se utilizar árvore binária em arquivo é que são necessários


cerca de log2n acessos para se encontrar um registro e as desvantagens são
uma demora na sua criação dependendo do número de registros do arquivo, e
se os registros estivem ordenados atrapalha o balanceamento da árvore, sendo
custosa e demorada sua busca também

Árvore B

Proposta por Bayer e McCreight (1972), a Árvore B é uma técnica de


organização e manutenção de arquivos. É uma árvore n-ária onde tem mais de
dois descendentes por nodo (ou páginas).

A árvore B trata-se de uma estrutura de dados que consiste em carregar


todos os dados que se encontram na memória secundária, desde que haja
espaço para a memória principal e otimizar o tempo de busca.
O funcionamento é semelhante à arvore binária, onde cada nó pai tem os
nós filhos seguindo a regra de que os itens de chave maior que a chave do nó
pai encontra-se à direita e os menores, à esquerda. A diferença está no número
de itens dentro de cada nó, que ao invés de 1, há o mínimo de M itens e o máximo
de 2M itens, e há apontadores de nós-filhos à esquerda e à direita para cada
item, tendo dessa forma o mínimo de M + 1 e o máximo de 2M + 1 filhos para
cada nó pai.

A construção se dá percorrendo o arquivo onde encontram-se os registros


de forma linear e formando a árvore na memória principal. A cada item
adicionado, é verificado se não houve quebra nas propriedades da árvore e
realizando balanceamentos sempre que necessário, obtendo-se assim uma
árvore sempre balanceada.

A pesquisa é realizada da mesma forma que uma árvore binária: procura-


se o registro comparando os valores das chaves, caso maior, o algoritmo
percorre a sub-árvore à direita, caso menor, percorre a sub-árvore à esquerda,
até encontrar o registro requisitado ou encontrar um nó folha, indicando que o
registro não encontra-se na árvore.

Vantagens e desvantagens

É uma vantagem ela ter em sua estrutura um número maior de itens por
nodo, aqui chamados de página, pois reduz o custo de acesso e pesquisa, e é
uma árvore balanceada com relação a altura independente da ordem de inserção
dos dados. Uma desvantagem é a difícil implementação.

Árvore B*

Apesar de implementada, não pudemos fazê-la funcionar


adequadamente, logo para os fins desse trabalho, ela será considerada apenas
como presente dentro do main, já que sua estrutura não chega a ser montada
durante a execução.
TESTES

Primeiro foram realizados os testes referentes à criação de todas as estruturas


na ordem ascendente, descendente de dados, com tamanhos 100, 1.000,
10.000, 100.000, 1.000.000 de registros e foram obtidos os seguintes resultados:

Acesso Sequencial
Nº DE DADOS 100 1.000 10.000 100.000 1.000.000
TRANSFERÊNCIAS 100 1.000 10.000 100.000 1.000.000
COMPARAÇÕES 5840 84.693 1.098.437 13.585.935 1.098.415
TEMPO EM MS 0.004 0.004 0.057 3.879 0.208

Árvore Binária
Nº DE DADOS 100 1.000 10.000 100.000 1.000.000
TRANSFERÊNCIAS 100 1.000 10.000 100.000 1.000.000
COMPARAÇÕES 4812 61.132 723.586 8.368.546 95.593.515
TEMPO EM MS 0.016 0.062 0.156 1.577 80.552

ÁRVORE B
Nº DE DADOS 100 1.000 10.000 .000 1.000.000
TRANSFERÊNCIAS 125 1.250 12.500 125.000 1.250.000
COMPARAÇÕES 6 8 12 14 658
TEMPO EM MS 0.022 0.079 0.238 2.884 95.222

As análises feitas com os dados da pesquisa. Em cada método foram


pesquisadas 10 chaves aleatórias, respeitando o tamanho de dados
manipulados. Foram obtidos os seguintes resultados:

Pode-se destacar a Árvore B como a melhor entre os métodos implementados,


pois não precisa fazer comparações para a sua criação e o número de
transferências é flexível ao tamanho da página.

Você também pode gostar