You are on page 1of 15

Introduo Mtodos de Busca

Parte 1
SCC-201 Introduo Cincia da Computao II
Rosane Minghim 2009

Importncia em estudar busca


Busca uma tarefa muito comum em computao?

Vrios mtodos e estruturas de dados podem ser empregados para se fazer busca
Quais estruturas de dados?

Baseado no material dos Professores Rudinei Goularte e Thiago Pardo

Certos mtodos de organizao/ordenao de dados podem tornar o processo de busca mais eficiente

Introduo
O problema da busca (ou pesquisa)
Dado um conjunto de elementos, onde cada um

Termos Relacionados
Tabela: termo genrico, pode ser qualquer estrutura de dados usada para armazenamento interno e organizao dos dados Uma tabela um conjunto de elementos, chamados registros

identificado por uma chave, o objetivo da busca localizar, nesse conjunto, o elemento que corresponde a uma chave especfica

Termos Relacionados
Existe uma chave associada a cada registro, usada para diferenciar os registros entre si
Chave interna: chave est contida dentro do registro, em uma localizao especfica Chave externa: essas chaves esto contidas em uma tabela de chaves separada que inclui ponteiros para os registros Chave primria: para todo arquivo existe pelo menos um conjunto exclusivo de chaves
Dois registros no podem ter o mesmo valor de chave

Termos Relacionados
Algoritmo de busca
Formalmente, o algoritmo que aceita um argumento a e tenta encontrar o registro cuja chave seja a

Chave secundria: so as chaves no primrias


Chaves que no precisam ter seus valores exclusivos Para que servem?
5 6

Termos Relacionados
Operaes na tabela
Insero: adicionar um novo elemento tabela Algoritmo de busca e insero: se no encontra o registro, insere um novo Remoo: retirar um elemento da tabela Recuperao: procurar um elemento na tabela e, se ach-lo, torn-lo disponvel

Tipos de Busca
A tabela pode ser:
Um vetor de registros Uma lista encadeada Uma rvore Etc.

A tabela pode ficar:


Totalmente na memria (busca interna) Totalmente no armazenamento auxiliar (busca externa) Dividida entre ambos
8

Tipos de Busca
As tcnicas de busca em memria interna que estudaremos sero:
Busca Seqencial Busca Binria Busca por Interpolao Busca em rvores Hashing

Busca Seqencial
A busca seqencial a forma mais simples de busca
aplicvel a uma tabela organizada como um vetor ou como uma lista encadeada

O objetivo encontrar um dado registro com o menor custo


Cada tcnica possui vantagens e desvantagens

10

Busca Seqencial
Busca mais simples que h
Percorre-se registro por registro em busca da chave

Busca Seqencial
Busca mais simples que h
Percorre-se registro por registro em busca da chave
Procure por 48

N=8

N=8

12

25

33

37

48

57

86

92

12

25

33

37

48

57

86

92

11

12

Busca Seqencial
Busca mais simples que h
Percorre-se registro por registro em busca da chave
Procure por 48
1 N=8

Busca Seqencial
Busca mais simples que h
Percorre-se registro por registro em busca da chave
Procure por 48
1 N=8

12

25

33

37

48

57

86

92

12

25

33

37

48

57

86

92

13

14

Busca Seqencial
Busca mais simples que h
Percorre-se registro por registro em busca da chave
Procure por 48
1 N=8

Busca Seqencial
Busca mais simples que h
Percorre-se registro por registro em busca da chave
Procure por 48
1 N=8

12

25

33

37

48

57

86

92

12

25

33

37

48

57

86

92

15

16

Busca Seqencial
Busca mais simples que h
Percorre-se registro por registro em busca da chave
Procure por 48
1 N=8

Busca Seqencial
Algoritmo de busca seqencial em um vetor A, com N posies (0 at N-1), sendo x a chave procurada

for (i=0; i<n; i++) if (A[i]==x) return(i); /*chave encontrada*/ return(-1); /*chave no encontrada*/

12

25

33

37

48

57

86

92

17

18

Busca Seqencial
Uma maneira de tornar o algoritmo mais eficiente usar um sentinela
Sentinela: consiste em adicionar um elemento de valor x no final da tabela O sentinela garante que o elemento procurado ser encontrado, o que elimina uma expresso condicional, melhorando a performance do algoritmo
A[N]=x; for(i=0; x!=A[i]; i++) ; if (i<n) return(i); /*chave encontrada*/ else return(-1); /*sentinela encontrado*/
19

Busca Seqencial
Limitaes do vetor
Tamanho fixo
Pode desperdiar ou faltar espao

Alternativa
Lista encadeada
O que muda na busca seqencial?
20

Busca Seqencial
Exerccio
Escrever em C a sub-rotina de busca de um elemento em uma lista encadeada

Busca Seqencial
Complexidade
Se o registro for o primeiro: 1 comparao Se o registro procurado for o ltimo: N comparaes Se for igualmente provvel que o argumento aparea em qualquer posio da tabela, em mdia: (n+1)/2 comparaes Se a busca for mal sucedida: N comparaes Logo, a busca seqencial, no pior caso, O(n)
21 22

Busca Seqencial
Arranjo no ordenado
Insero no final do arranjo Remoo
Realocao dos registros acima do registro removido

Busca Seqencial
Para aumentar a eficincia
Reordenar continuamente a tabela de modo que os registros mais acessados sejam deslocados para o incio
A) Mtodo mover-para-frente: sempre que uma pesquisa obtiver xito, o registro recuperado colocado no incio da lista B) Mtodo da transposio: um registro recuperado com sucesso trocado com o registro imediatamente anterior
Ambos se baseiam no fenmeno da recuperao recorrente de registros
23 24

Busca Seqencial
Desvantagens do mtodo mover-para-frente
Uma nica recuperao no implica que o registro ser freqentemente recuperado
Perda de eficincia para os outros registros

Busca Seqencial
Busca seqencial em tabela ordenada
A eficincia da operao de busca melhora se as chaves dos registros estiverem ordenadas
No pior caso (caso em que a chave no encontrada), so necessrias N comparaes quando as chaves esto desordenadas No caso mdio, N/2 comparaes se as chaves estiverem ordenadas, pois se para a busca assim que uma chave maior do que a procurada encontrada

O mtodo mais caro em vetores do que em listas


Por qu?

Vantagens do mtodo mover-para frente


Possui resultados melhores para quantidades pequena e mdia de buscas
25

Dificuldade do mtodo?
26

Busca Seqencial
Busca seqencial indexada Existe uma tabela auxiliar, chamada tabela de ndices, alm do prprio arquivo ordenado Cada elemento na tabela de ndices contm uma chave (kindex) e um indicador do registro no arquivo que corresponde a kindex
Faz-se a busca a partir do ponto indicado na tabela, sendo que a busca no precisa ser feita desde o comeo

Busca Seqencial
Chave
....

Registro

Tabela de ndices

14 38

kindex
321 592 876 ...

115 321 387 512 567 583 592 611

Pode ser implementada como um vetor ou como uma lista encadeada


O indicador da posio na tabela pode ser um ponteiro ou uma varivel inteira
27

741 811 876 .... 28

Busca Seqencial
Busca seqencial indexada

Busca Seqencial
Chave
....

Registro

ndice secundrio

ndice primrio

14 38

Se a tabela for muito grande, pode-se ainda usar a tabela de ndices secundria O ndice secundrio um ndice para o ndice primrio

kindex
321 876 ...

kindex
321 592 876 ...

115 321 387 512 567 583 592 611 741 811 876

29

....

30

Busca Seqencial
Vantagem
Os itens na tabela podero ser examinados seqencialmente sem que todos os registros precisem ser acessados
O tempo de busca diminui consideravelmente

Busca Seqencial
Remoo
Remove-se o elemento e rearranja-se a tabela inteira e o(s) ndice(s) Marca-se a posio do elemento removido, indicando que ela pode ser ocupada por um outro elemento futuramente
A posio da tabela fica vazia
31 32

Desvantagens
A tabela tem que estar ordenada Exige espao adicional para armazenar a(s) tabela(s) de ndices

Algo mais?

Busca Seqencial
Insero
Se houver espao vago na tabela, rearranjam-se os elementos localmente Se no houver espao vago
Rearranjar a tabela a partir do ponto apropriado e reconstruir o(s) ndice(s)
33

Busca Seqencial
Chave Registro

Insero do elemento 512 com espao vago


567 e 583 descem 512 inserido
kindex
321 592 876 ...

.... 14 38 115 321 387 567 583

592 611 741 811 876 .... 34

Busca Seqencial
Chave Registro

Busca Seqencial
Chave Registro
.... 14 38

Insero do elemento 512 com espao vago


567 e 583 descem 512 inserido
kindex
321 592 876 ...

Insero do elemento 512 sem espao vago


Elementos a partir de 567 descem 512 inserido ndice reconstrudo
kindex
321 592 876 ...

.... 14 38 115 321 387 567 583 585 592 611 741 811 876

115 321 387 512 567 583 592 611 741 811 876 .... 35

....

36

Busca Seqencial
Chave Registro

Busca Seqencial
.... 14 38

Insero do elemento 512 sem espao vago


Elementos a partir de 567 descem 512 inserido ndice reconstrudo
kindex
321 592 876 ...

Como montar o ndice primrio


Se a tabela no estiver ordenada, ordene-a Divide-se o nmero de elementos da tabela pelo tamanho do ndice desejado: n/tamanho-ndice Para montar o ndice, recuperam-se da tabela os elementos 0, 0+n/tamanho-ndice, 0+2*n/tamanho-ndice, etc. Cada elemento do ndice representa n/tamanho-ndice elementos da tabela

115 321 387 512 567 583 585 592 611 741 811 .... 37 38

Busca Seqencial
Exemplo
Divide-se o nmero de elementos da tabela pelo tamanho do ndice desejado
Se a tabela tem 1.000 elementos e deseja-se um ndice primrio de 10 elementos, faz-se 1.000/10=100

Busca Seqencial
Para montar um ndice secundrio, aplica-se raciocnio similar sobre o ndice primrio Em geral, no so necessrios mais do que 2 ndices

Para montar o ndice, recuperam-se da tabela os elementos 0, 0+n/tamanho-ndice, 0+2*n/tamanho-ndice, etc.


O ndice primrio montado com os elementos das posies 0, 100, 200, etc. da tabela

Cada elemento do ndice representa n/tamanho-ndice elementos da tabela


Cada elemento do ndice primrio aponta para o comeo de um grupo de 100 elementos da tabela
39 40

10

Busca Seqencial
Escrever em C uma sub-rotina de busca seqencial indexada por um elemento em uma tabela com ndice primrio

Busca Seqencial
int busca(int x) { int i; //busca no ndice primrio for (i=0; i<tam_indice && indice[i].kindex<=x; i++); i=indice[i-1].pos; //busca na tabela while ((i<tam_tabela) && (tabela[i].chave<x)) i++; if ((i<tam_tabela) && (tabela[i].chave==x)) return(i); else return(-1);
41

42

Busca Seqencial
Busca seqencial em tabela desordenada
A tabela est desordenada, mas o ndice mantido ordenado.
Um registro no ndice para cada elemento da tabela. Eliminao: substitui na tabela, desloca o vetor de ndices para manter a ordenao. Insero: na ltima posio da tabela, porm deslocando o ndice, que mantido ordenado. Formao do ndice: as chaves e suas posies so copiadas para o vetor de ndices, que, em seguida, ordenado. Evita o deslocamento dos registros principais (tarefa computacionalmente cara). No ndice, pode ser utilizada a busca binria.
43

Busca em ndice ordenado


Tabela de ndices Chave
38 811 741 387 115 14 567 611 592 ... ...

Registro

kindex
14 38 115 387 567 592 611 741 811 . ....

Tabela

11

Busca Binria
Se os dados estiverem ordenados em um arranjo, pode-se tirar vantagens dessa ordenao
Busca binria

Busca Binria
O elemento buscado comparado ao elemento do meio do arranjo
Se igual, busca bem-sucedida Se menor, busca-se na metade inferior do arranjo Se maior, busca-se na metade superior do arranjo

A[i]<=A[i+1], se ordem crescente A[i]>=A[i+1], se ordem decrescente

45

46

Busca Binria
Busca-se por 25
inf=1 sup=N=8

Busca Binria
Busca-se por 25
inf=1 meio sup=N=8

12

25

33

37

48

57

86

92

12

25

33

37

48
25 < 37

57

86

92

47

48

12

Busca Binria
Busca-se por 25
inf=1 sup=3 N=8

Busca Binria
Busca-se por 25
inf=1 meio sup=3 N=8

12

25

33

37

48

57

86

92

12

25

33
=25

37

48

57

86

92

49

50

Busca Binria
Busca-se por 25
inf=1 meio sup=3 N=8

Busca Binria

12

25

33
=25

37

48

57

86

92

Escrever em C uma sub-rotina de busca binria por um elemento em um arranjo ordenado

Em cada passo, o tamanho do arranjo em que se busca dividido por 2

51

52

13

Busca Binria
int busca_binaria(int A[], int x) { int inf=0, sup=tam_arranjo-1, meio; while (inf<=sup) { meio=(inf+sup)/2; if (x==A[meio]) return(meio); else if (x<A[meio]) sup=meio-1; else inf=meio+1; } return(-1); }
53

Busca Binria
Complexidade?

54

Busca Binria
Complexidade?
O(log(n)), pois cada comparao reduz o nmero de possveis candidatos por um fator de 2

Busca Binria
Vantagens
Eficincia da busca Simplicidade da implementao

Desvantagens
Nem todo arranjo est ordenado Exige o uso de um arranjo para armazenar os dados
Faz uso do fato de que os ndices do vetor so inteiros consecutivos

Insero e remoo de elementos so ineficientes


Realocao de elementos
55 56

14

Busca Binria
A busca binria pode ser usada com a organizao de tabela seqencial indexada
Em vez de pesquisar o ndice seqencialmente, pode-se usar uma busca binria

Busca por Interpolao


Se as chaves estiverem uniformemente distribudas, esse mtodo pode ser ainda mais eficiente do que a busca binria Com chaves uniformemente distribudas, pode-se esperar que x esteja aproximadamente na posio
meio = inf + (sup inf) * ((x A[inf]) / (A[sup] A[inf]))

sendo que inf e sup so redefinidos iterativamente como na busca binria


57 58

Busca por Interpolao


Complexidade
O(log(log(n))) se as chaves estiverem uniformemente distribudas
Raramente precisar de mais comparaes

Busca por Interpolao


Desvantagem
Em situaes prticas, as chaves tendem a se aglomerar em torno de determinados valores e no so uniformemente distribudas
Exemplo: h uma quantidade maior de nomes comeando com S do que com Q

Se as chaves no estiverem uniformemente distribudas, a busca por interpolao pode ser to ruim quanto uma busca seqencial

59

60

15

You might also like