Sei sulla pagina 1di 30

ECOI08 Aula 2

Prof. Rafael Santos


Email: rafafic@gmail.com
Pesquisa em Memria Primria

Conceitos
estudo de como recuperar informao a partir
de uma grande massa de informao
previamente armazenada.
A informao dividida em Registros.
Cada registro possui uma chave para ser usada
na pesquisa.
Objetivo da pesquisa:
Encontrar uma ou mais ocorrncias de registros com
chaves iguais chave de pesquisa.
Pesquisa com sucesso X Pesquisa sem
sucesso.
Pesquisa em Memria Primria

Pesquisa
Conjunto de registros ou arquivos
Tabela:
associada a entidades de vida curta, criadas na
memria interna durante a execuo de um
programa.
Arquivo:
geralmente associado a entidades de vida mais
longa, armazenadas em memria externa.
Pesquisa em Memria Primria
Tipo abstrato de dados
importante considerar os algoritmos de pesquisa
como tipos abstratos de dados, com um conjunto de
operaes associado a uma estrutura de dados, de tal
forma que haja uma independncia de implementao
para as operaes.
Operaes mais comuns:
1. Inicializar a estrutura de dados.
2. Pesquisar um ou mais registros com determinada chave.
3. Inserir um novo registro.
4. Retirar um registro especfico.
5. Ordenar um arquivo para obter todos os registros em ordem de
acordo com a chave.
6. Ajuntar dois arquivos para formar um arquivo maior.
Pesquisa em Memria Primria

Dicionrio
Nome comumente utilizado para descrever
uma estrutura de dados para pesquisa.
Dicionrio um tipo abstrato de dados
com as operaes:
1. Inicializa
2. Pesquisa
3. Insere
4. Retira
Pesquisa em Memria Primria

Pesquisa sequencial
Mtodo de pesquisa mais simples:
Dado uma tabela com registros, pesquise
sequencialmente, saindo do primeiro registro,
at encontrar a chave procurada; ento pare.
Implementao usando vetor
Inicializa, Pesquisa, Insere, Remove
Pesquisa em Memria Primria

Pesquisa sequencial
Anlise
Pesquisa com sucesso:
melhor caso : = 1
pior caso : =
caso mdio : = ( + 1)/2
Pesquisa sem sucesso:
=+1
O algoritmo de pesquisa sequencial a
melhor escolha para o problema de pesquisa
em tabelas com at 25 registros.
Pesquisa em Memria Primria

Pesquisa Binria
Pesquisa em tabela pode ser mais eficiente se
os registros forem mantidos em ordem
Para saber se uma chave est presente na
tabela
1. Compare a chave com o registro que est na posio do
meio da tabela.
2. Se a chave menor ento o registro procurado est na
primeira metade da tabela
3. Se a chave maior ento o registro procurado est na
segunda metade da tabela.
4. Repita o processo at que a chave seja encontrada, ou
fique apenas um registro cuja chave diferente da
procurada, significando uma pesquisa sem sucesso.
Pesquisa em Memria Primria
Pesquisa Binria
Exemplo de pesquisa para chave
Pesquisa em Memria Primria
Pesquisa Binria
Anlise
A cada iterao do algoritmo, o tamanho da
tabela dividido ao meio.
Logo: o nmero de vezes que o tamanho da
tabela dividido ao meio cerca de log 2 .
Ressalva: o custo para manter a tabela
ordenada alto:
a cada insero na posio da tabela implica no
deslocamento dos registros a partir da posio para
as posies seguintes.
Consequentemente, a pesquisa binria no
deve ser usada em aplicaes muito dinmicas.
Hashing

Transformao de chave (hashing)


Um mtodo de pesquisa com o uso da
transformao de chave constitudo de
duas etapas principais:
Computar o valor da funo de
transformao, a qual transforma a chave de
pesquisa em um endereo da tabela.
Considerando que duas ou mais chaves
podem ser transformadas em um mesmo
endereo de tabela, necessrio existir um
mtodo para lidar com colises.
Hashing

Qualquer que seja a funo de transformao,


algumas colises iro ocorrer fatalmente, e
tais colises tm de ser resolvidas de alguma
forma.
Mesmo que se obtenha uma funo de
transformao que distribua os registros de
forma uniforme entre as entradas da tabela,
existe uma alta probabilidade de haver
colises.
Hashing
O paradoxo do aniversrio (Feller,1968, p. 33),
diz que em um grupo de 23 ou mais pessoas,
juntas ao acaso, existe uma chance maior do
que 50% de que 2 pessoas comemorem
aniversrio no mesmo dia.
Assim, se for utilizada uma funo de
transformao uniforme que enderece 23
chaves randmicas em uma tabela de tamanho
365, a probabilidade de que haja colises
maior do que 50%.
Hashing

A probabilidade de se inserir itens


consecutivos sem coliso em uma
tabela de tamanho :
Hashing
Alguns valores de para diferentes valores de ,onde
= 365.
Hashing
Funes de Transformao
Uma funo de transformao deve
mapear chaves em inteiros dentro do
intervalo [0 1], onde o
tamanho da tabela.
A funo de transformao ideal
aquela que:
Seja simples de ser computada.
Para cada chave de entrada, qualquer uma
das sadas possveis igualmente provvel
de ocorrer.
Hashing
Funo de transformao. Mtodo mais
usado
Usa o resto da diviso por .
= mod
onde um inteiro correspondente chave.
Cuidado na escolha do valor de (deve ser
um nmero primo).
Exemplo:

par, ento () par quando


par e () impar quando impar.
Hashing
Transformao de chaves no Numricas
As chaves no numricas devem ser transformadas em
nmeros:

o nmero de caracteres da chave.


Chave[] corresponde representao ASCII do i-simo
caractere da chave.
[] um inteiro de um conjunto de pesos gerados
randomicamente para 1 .
Vantagem de se usar pesos: Dois conjuntos diferentes de
pesos 1 e 2[], 1 , leva a duas funes de
transformao 1 e 2() diferentes.
Hashing

Tratando colises
Com listas encadeadas
Uma das formas de resolver as colises
simplesmente construir uma lista linear
encadeada para cada endereo da tabela.
Assim, todas as chaves com mesmo
endereo so encadeadas em uma lista
linear.
Hashing
Exemplo:
Se a i-sima letra do alfabeto representada pelo nmero i;
a funo de transformao = mod utilizada para
= 7;
o resultado da insero das chaves na tabela o
seguinte:
Por exemplo, = 1 = 1, = 5 = 5 e = 19 =
5, e assim por diante.
Hashing
Anlise
Assumindo que qualquer item do conjunto tem igual
probabilidade de ser endereado para qualquer
entrada de , ento:
o comprimento esperado de cada lista encadeada /,
onde o nmero de registros na tabela e o tamanho da
tabela.
Logo as operaes Pesquisa, Insere e Retira custam
(1 + /) operaes em mdia, onde:
a constante 1 representa o tempo para encontrar a entrada na tabela
/ o tempo para percorrer a lista.
Para valores de M prximos de N, o tempo se torna
constante, isto , independente de N.
Hashing

Tratando colises
Endereamento aberto
Quando o nmero de registros a serem
armazenados na tabela puder ser
previamente estimado, ento no haver
necessidade de usar apontadores para
armazenar os registros.
No Endereamento aberto todas as chaves
so armazenadas na prpria tabela, sem o
uso de apontadores explcitos.
Hashing

Existem vrias propostas para a


escolha de localizaes alternativas.
A mais simples chamada de hashing
linear, onde a posio na tabela
dada por:
Hashing

Se a i-sima letra do alfabeto


representada pelo nmero e a funo
de transformao = mod
utilizada para = 7,
ento o resultado da insero das
chaves na tabela, usando
hashing linear para resolver colises :
Hashing
Por exemplo:

= 12 = 5,
= 21 = 0,
= 14 = 0,
= 5 = 5,
= 19 = 5.
Hashing

Anlise
Hashing
Anlise
O hashing linear sofre de um mal chamado
agrupamento(clustering) (Knuth, 1973).
Este fenmeno ocorre na medida em que a tabela
comea a car cheia, pois a insero de uma nova
chave tende a ocupar uma posio na tabela que esteja
contgua a outras posies j ocupadas, o que deteriora
o tempo necessrio para novas pesquisas.
Entretanto, apesar do hashing linear ser um mtodo
relativamente pobre para resolver colises os resultados
apresentados so bons.
O melhor caso, assim como o caso mdio, O(1).
Hashing

Vantagens:
Alta ecincia no custo de pesquisa, que
O(1) para o caso mdio.
Simplicidade de implementao.
Desvantagens
Custo para recuperar os registros na
ordem lexicogrca das chaves alto,
sendo necessrio ordenar o arquivo.
Pior caso O(N).
Hashing Perfeito
Se = ( ) se e somente se = , ento no h
colises, e a funo de transformao chamada de
funo de transformao perfeita ou funo
hashing perfeita().
Se o nmero de chaves e o tamanho da tabela
so iguais (/ = 1), ento temos uma funo de
transformao perfeita mnima.
Se e ( ) ( ), ento a ordem
lexicogrca preservada. Nesse caso, temos uma
funo de transformao perfeita mnima com
ordem preservada.
Referncia Bibliografia

ZIVIANI, Nivio. Projeto de Algoritmos com implementao em Pascal e C.


3a Edio. Ed. Cengage Learning, 2011.
Todas as informaes dos slides foram retiradas da Transparncias do livro
acima acessados no site:
http://www.dcc.ufmg.br/algoritmos-edicao2/cap1/transp/completo1/cap4.pdf

Potrebbero piacerti anche