Professional Documents
Culture Documents
Parte 1
SCC-201 Introduo Cincia da Computao II
Rosane Minghim 2009
Vrios mtodos e estruturas de dados podem ser empregados para se fazer busca
Quais estruturas de dados?
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
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.
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
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
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 ...
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
Busca Seqencial
Chave Registro
Busca Seqencial
Chave Registro
.... 14 38
.... 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
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
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
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
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
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
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
Se as chaves no estiverem uniformemente distribudas, a busca por interpolao pode ser to ruim quanto uma busca seqencial
59
60
15