Académique Documents
Professionnel Documents
Culture Documents
DEVMEDIA
Buscar
fontes
favorito (1)
comentrios
para impresso
anotar
Gostei (2)
Curtir
(0)
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
Em geral, no meio
computacional, a informao dividida em registros e cada registro possui uma
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
computador.
Em seguida,
nos tpicos Pesquisa Sequencial, Pesquisa Binria e Pesquisa por Tabela
Hash,
sero analisados os trs principais mtodos de pesquisa existentes na
literatura, destacando suas
principais caractersticas e estratgias de
implementao e eficincia.
Conceitos preliminares
Este tpico apresenta alguns conceitos que
so fundamentais para o acompanhamento deste
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
mtodos de pesquisa.
Quanto
insero/remoo, leva-se em considerao tambm o nmero de movimentaes (ou
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
A linguagem
Java foi escolhida porque tem sido utilizada em diversos livros-textos sobre
estruturas
de dados, como em Goodrich (2013), Sedgewick (2013), Ziviani (2007),
alm de ser uma
linguagem amplamente conhecida, bem documentada e que apresenta
caractersticas
interessantes para o desenvolvimento de estruturas de dados
genricas.
apresentadas na Listagem 1.
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
Para melhorar a
legibilidade do cdigo, constantes pblicas que representam as possveis sadas
do mtodo de comparao entre itens foram criadas, a saber: MENOR, IGUAL e MAIOR. Tambm
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
Por exemplo,
no caso de um aluno, deveriam haver atributos que representam os dados de um
desvantagens.
Pesquisa sequencial
A pesquisa sequencial um dos mtodos de
pesquisa mais simples que existe. Ele funciona da
seguinte forma: a partir do
primeiro registro (ou do ltimo), pesquisa sequencialmente at encontrar
a
chave procurada ou at chegar ao final (ou ao incio) do conjunto de registros.
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
A Figura
1 ilustra os passos da execuo da busca sequencial para encontrar o
elemento g no
vetor [a, b, c, d, e, f, g, h].
Figura 1. Ilustrao da
execuo do mtodo de pesquisa sequencial.
Observa-se
que a pesquisa ocorre elemento por elemento, at o que o mesmo seja encontrado
ou
at que o final do vetor seja atingido. Caso o elemento no exista no vetor,
o valor null
retornado. J o
mtodo inserir() simplesmente insere
o item passado por parmetro na primeira
posio vazia do vetor.
1.
2.
3.
4.
5.
6.
7.
public ArrayDic() {
8.
9.
pos = 0;
10.
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
11.
12.
13.
14.
15.
16.
@Override
17.
18.
19.
if (itens[i].compara(it) == Item.IGUAL) {
20.
return itens[i];
21.
22.
23.
return null;
24.
25.
26.
@Override
27.
28.
if (!estahCheia()) {
29.
itens[pos] = it;
30.
pos++;
31.
} else {
32.
33.
34.
}
}
35. }
1.
Por se tratar de um vetor no
ordenado, a insero de qualquer elemento feita de forma
eficiente,
inserindo-o sempre no final do vetor, com um custo computacional constante,
isto , M(n)
= 1;
2.
O mtodo pesquisar() executa em tempo linear, realizando, no pior caso, C(n) = n comparaes
para encontrar um
elemento. Para o caso mdio,
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
@Override
public Item pesquisar(Item it) throws Exception {
int i = 0;
for (; i < pos; i++) {
if (itens[i].compara(it) != Item.MENOR) break;
}
if (i == pos) return null;
if (itens[i].compara(it) == Item.IGUAL) return itens[i];
return null;
}
@Override
public void inserir(Item it) throws Exception {
if (!estahCheia()) {
int i = pos;
while(i > 0 && itens[i - 1].compara(it) == Item.MAIOR) {
itens[i] = itens[i - 1];
i--;
}
itens[i] = it;
pos++;
} else {
throw new Exception("Capacidade mxima atingida!");
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
}
}
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
return aux.item;
}
aux = aux.prox;
}
return null;
}
@Override
public void inserir(Item it) throws Exception {
Noh noh = new Noh(it, lista);
lista = noh;
}
}
Pesquisa binria
Como foi visto anteriormente, manter o
vetor ordenado para realizao de uma pesquisa sequencial
pode ser til, pois o
tempo de execuo mdio para buscas sem sucesso cai pela metade. Porm,
o custo
para a insero de um elemento em um vetor ordenado significativamente maior
do que
para a insero em um vetor no ordenado.
parte.
o problema maior.
Para
saber se um elemento pertence a um vetor utilizando a pesquisa binria,
compara-se a chave
deste elemento com a chave do elemento que est no meio do
conjunto (lembrando que o vetor
deve estar ordenado). Se a chave for igual
procurada, ento a busca termina com sucesso; caso
a chave seja menor, ento o
elemento procurado deve estar na primeira parte do vetor (do incio
at o
elemento do meio - 1); se a chave for maior, ento o elemento deve estar na
segunda parte
do vetor, que vai do elemento que est aps o elemento do meio
at o ltimo elemento. Esse
mesmo procedimento descrito deve ser repetido na
metade escolhida at que se encontre o
elemento ou at que todos os elementos
do vetor tenham sido investigados sem sucesso.
Figura 2. Ilustrao da
execuo do mtodo de pesquisa binria.
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
1.
2.
3.
int m = (e + d)/2;
4.
5.
6.
7.
8.
9.
10. @Override
11. public Item pesquisar(Item it) throws Exception {
12.
13. }
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
gastaria 106 passos no caso de uma busca sem sucesso, uma vez que sua
complexidade do pior
caso proporcional a n. J o mtodo de pesquisa binria
executaria em lg106, que
aproximadamente igual a 20.
assim, a busca binria, da maneira como foi implementada nesta seo, deve ser
utilizada em
conjuntos pouco dinmicos, em que a quantidade de consultas
realizadas seja bem maior do que a
quantidade de inseres feitas no conjunto
de elementos.
verdadeira: todos os registros com chaves menores do que a chave deste n esto
em sua subrvore esquerda e todos os registros com chaves maiores esto em sua
sub-rvore direita.
A Figura
3 apresenta alguns exemplos de rvores binrias, destacando quais so e
quais no so
ABBs.
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
Figura 3. Exemplos de
rvores binrias.
A classe ABBDic possui um atributo denominado raiz que consiste em uma referncia para a raiz
da rvore. Alm
disso, cada n, alm do item que representa o registro com as informaes de
dir, respectivamente).
para ABBs.
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
Os
ns encontrados durante a recurso dos mtodos inseriRecursivo() e pesquisaRecursiva()
formam um caminho partindo da raiz que, no pior caso, chega ao n folha mais
distante da raiz da
rvore.
desbalanceada,
j que essas operaes no garantem o balanceamento. Para tratar desse
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
O hashing
uma extenso do mtodo de pesquisa indexado por chave (key-indexed search method)
que usa valores das chaves como ndices
de um vetor, em vez de compar-las. A grande
vantagem deste mtodo que
inseres, remoes e consultas a elementos do conjunto podem
ser realizadas
com um nmero de comparaes e movimentaes constante. Porm, esse mtodo
s
aplicvel a chaves inteiras positivas, no duplicadas e menores do que M, onde M o
tamanho da tabela de endereamento.
Uma tabela hash pode ser descrita como uma estrutura de dados eficaz para
implementao de um
dicionrio. Embora a busca por um elemento em uma tabela de
espalhamento possa demorar
tanto quanto em uma lista encadeada o nmero de
comparaes no pior caso proporcional a n
Em
geral, o nmero de comparaes mdio para pesquisar um elemento em uma tabela
de
espalhamento constante.
1.
Computar o valor da funo de transformao ou funo hashing:
responsvel por
transformar a chave de pesquisa em um endereo da tabela hash ;
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
2.
Tratar as colises: considerando que
duas ou mais chaves podem ser transformadas em um
mesmo endereo, necessrio
realizar o tratamento de colises.
Funo de transformao
Uma funo de transformao responsvel
por mapear chaves em inteiros dentro do intervalo [0..
M 1], onde M o
tamanho da tabela na qual os dados estaro armazenados. A funo de
transformao ideal aquela que: (i) simples de ser computada; e (ii) para
cada chave de
entrada, qualquer valor entre [0..M-1] igualmente provvel de
ocorrer.
O ideal que M seja um nmero primo, mas no qualquer primo. Segundo Cormen et al . (2012), o
ideal escolher um
primo no muito prximo de uma potncia de 2. Por exemplo, se desejamos
criar
uma tabela de espalhamento para conter aproximadamente 2000 chaves e no nos
importamos de examinar, por exemplo, uma mdia de trs elementos em uma busca malsucedida,
podemos escolher uma tabela de espalhamento de tamanho M = 701, uma vez que 701 um
primo prximo de 2000/3 e no muito
prximo de uma potncia de 2 (a menor potncia antes de
701 512 e a maior
potncia depois de 701 1024).
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
Considerando uma String (conjunto de caracteres) como chave, uma alternativa seria
somar o
decimal de cada caractere desta String,
de acordo com sua representao na tabela ASCII.
Contudo, essa no uma estratgia
muito boa para strings , para as quais
a ordem dos elementos
relevante. Por exemplo, utilizando essa estratgia, as strings temp01 e temp10 tero a
mesma
representao numrica, da mesma forma que as palavras stop, pots,
spot e tops.
(1 * 52) + (1 * 51) + 2 = 32
Caso a String
fosse baa, o resultado seria diferente:
(2 * 52) + (1 * 51) + 1 = 56
Tratamento de colises
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
maior do que 50% de que duas pessoas comemorem aniversrio no mesmo dia.
separado).
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
@Override
public void inserir(Item it) throws Exception {
int i = hash(it, M);
table[i] = new Noh(it, table[i]);
}
}
Nesta implementao, a funo hash() chama a funo hashCode() do Java para gerar a chave
A funo pesquisar() delega a busca pelo elemento funo pesquisaLista(). Para isso, a funo
pesquisar() recupera a lista onde o
elemento deve estar alocado a partir do ndice retornado pela
funo hash(). A funo inserir, da mesma
forma, utiliza o ndice retornado pela funo hash()
para inserir o elemento no incio da lista correspondente a
este ndice.
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
Ou seja, o
fator de carga da tabela nunca ser maior do que 1.
Quando uma chave x endereada para uma entrada da tabela que j esteja ocupada,
uma
sequncia de localizaes alternativas h1(x) ,
h2(x) , ... escolhida. Se
nenhuma posio estiver
vazia, ento a tabela est cheia e no podemos inserir
a chave x.
Em outras palavras, para inserir um elemento na tabela hash utilizando endereamento aberto,
examinamos sucessivamente a
tabela de espalhamento at encontrar uma posio vazia na qual
podemos inserir
a chave.
utilizada para M = 7,
ento o resultado da insero das
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
O hashing
linear fcil de implementar, mas sofre de um problema conhecido como
agrupamento.
Esse fenmeno ocorre quando a tabela comea a ficar cheia, pois
a insero de uma nova chave
tende a ocupar uma posio contgua a outras j
ocupadas, o que deteriora o tempo necessrio
para novas pesquisas.
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
, onde = N/M.
Segundo dados experimentais, para uma
tabela hash com 50% de fator de carga
(), em mdia,
uma consulta com
sucesso realiza menos do que duas comparaes, o que um resultado
interessante.
A Listagem
12 apresenta a verso do dicionrio que utiliza tabelas de espalhamento com
endereamento aberto. Note que a funo de hash foi omitida, pois a mesma do
cdigo da
Listagem 11.
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
return table[i];
} else {
i = (i + 1) % M;
}
}
return null;
}
@Override
public void inserir(Item it) throws Exception {
int i = hash(it, M);
while (table[i] != null) {
i = (i + 1) % M;
}
table[i] = it;
}
}
A Figura
6 apresenta a comparao entre as diversas implementaes de um dicionrio
(vetor
ordenado, vetor no ordenado, lista encadeada ordenada, lista encadeada
no ordenada, busca
binria com vetores, busca binria com ABB e hashing ) quanto quantidade de
comparaes
realizadas pelos mtodos inserir
e pesquisar , em seus piores casos e
casos mdios.
Pior
caso
Caso
mdio
Tipo
de Implementao
Inserir
Vetor ordenado
Pesquisar
Pesquisa
Pesquisa
sucesso
insucesso
Inserir
N/2
N/2
N/2
N/2
N/2
N/2
N/2
Lista encadeada
ordenada
Vetor no ordenado
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
Lista encadeada no
1
N/2
lgN
N/2
lgN
lgN
lgN
lgN
lgN
Hashing
ordenada
A vantagem de
se utilizar ABB para a implementao da pesquisa binria est no fato de que a
Referncias
Cormen, T. H. et
al. (2012). Algoritmos: teoria e prtica. Traduo da 3 edio
americana.
Goodrich, M. T. e
Tamassia, R. (2013) Estruturas de Dados & Algoritmos em Java. 5
edio.
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
Sedgewick, R.
(2013). Algorithms in Java. Parts 1-4. 3 edio.
Ziviani, N. (2007)
Projeto de Algoritmos com implementaes em Java e C++.
(0)
+
Mais contedo sobre Java
No h comentrios
Meus comentarios
Publicidade
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
Mais posts
Artigo
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]
DevMedia
Curtir Pgina
70 mil curtidas
http://www.devmedia.com.br/estrutura-de-dados-primeiros-passos-com-metodos-de-busca/33018[29/07/2015 18:48:35]