métodos de busca -...
TRANSCRIPT
Métodos de Busca Parte 1
Introdução à Ciência da Computação II Prof. Diego Raphael Amancio
Baseado no material do Prof. Rudinei Goularte e do Prof. Thiago A. S. Pardo
2
Introdução
n Importância em estudar busca n Busca é uma tarefa muito comum?
n Vários métodos e estruturas de dados podem ser empregados para se fazer busca n Quais estruturas de dados?
n Certos métodos de organização/ordenação de dados podem tornar o processo de busca mais eficiente
3
Introdução
n 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”
4
Termos Relacionados
n Tabela: termo genérico, pode ser qualquer estrutura de dados usada para armazenamento interno e organização dos dados
n Uma tabela é um conjunto de elementos, chamados registros
5
Termos Relacionados n Existe uma chave associada a cada registro, usada para diferenciar
os registros entre si
n Chave interna: chave está contida dentro do registro, em uma localização específica
n Chave externa: essas chaves estão contidas em uma tabela de chaves separada que inclui ponteiros para os registros
n Chave primária: para todo arquivo existe pelo menos um conjunto exclusivo de chaves
n Dois registros não podem ter o mesmo valor de chave
n Chave secundária: são as chaves não primárias n Chaves que não precisam ter seus valores exclusivos
6
Termos Relacionados
n Algoritmo de busca
n Formalmente, é o algoritmo que aceita um argumento a e tenta encontrar o registro cuja chave seja a
7
Termos Relacionados n Operações na tabela
n Inserção: adicionar um novo elemento à tabela
n Algoritmo de busca e inserção: se não encontra o registro, insere um novo
n Remoção: retirar um elemento da tabela
n Recuperação: procurar um elemento na tabela e, se achá-lo, torná-lo disponível
8
Tipos de Busca n A tabela pode ser:
n Um vetor de registros n Uma lista encadeada n Uma árvore n Etc.
n A tabela pode ficar: n Totalmente na memória (busca interna) n Totalmente no armazenamento auxiliar (busca
externa) n Dividida entre ambos
9
Tipos de Busca n Algumas técnicas de busca em memória interna
são n Busca Seqüencial n Busca Binária n Busca por Interpolação n Busca em Árvores n Hashing
n O objetivo é encontrar um dado registro com o menor custo n Cada técnica possui vantagens e desvantagens
10
Busca Seqüencial n A busca seqüencial é a forma mais simples de busca
n É aplicável a uma tabela organizada como um vetor ou como uma lista encadeada
11
Busca Seqüencial
n Busca mais simples que há n Percorre-se registro por registro em busca
da chave
12 25 33 37 48 57 86 92 1 N=8
12
Busca Seqüencial
n Busca mais simples que há n Percorre-se registro por registro em busca
da chave
12 25 33 37 48 57 86 92 1 N=8
Procure por 48
13
Busca Seqüencial
n Busca mais simples que há n Percorre-se registro por registro em busca
da chave
12 25 33 37 48 57 86 92 1 N=8
Procure por 48
14
Busca Seqüencial
n Busca mais simples que há n Percorre-se registro por registro em busca
da chave
12 25 33 37 48 57 86 92 1 N=8
Procure por 48
15
Busca Seqüencial
n Busca mais simples que há n Percorre-se registro por registro em busca
da chave
12 25 33 37 48 57 86 92 1 N=8
Procure por 48
16
Busca Seqüencial
n Busca mais simples que há n Percorre-se registro por registro em busca
da chave
12 25 33 37 48 57 86 92 1 N=8
Procure por 48
17
Busca Seqüencial
n Busca mais simples que há n Percorre-se registro por registro em busca
da chave
12 25 33 37 48 57 86 92 1 N=8
Procure por 48
18
Busca Seqüencial n Implementação
n Algoritmo de busca seqüencial em um vetor A, com N posições (0 até N-1), sendo x a chave procurada
19
Busca Seqüencial
n Uma maneira de tornar o algoritmo mais eficiente é usar um sentinela
n Sentinela: consiste em adicionar um elemento de valor x no final da tabela
n Qual a vantagem de se usar um nó sentinela?
20
Busca Seqüencial
n Uma maneira de tornar o algoritmo mais eficiente é usar um sentinela
n Sentinela: consiste em adicionar um elemento de valor x no final da tabela
n O sentinela garante que o elemento será encontrado, o que elimina um teste, melhorando a performance do algoritmo
21
Busca Seqüencial n Implementação
n Busca seqüencial com sentinela
22
Busca Seqüencial
n Limitações do vetor n Tamanho fixo
n Pode desperdiçar ou faltar espaço
n Alternativa n Lista encadeada
n O que muda na busca seqüencial?
23
Busca Seqüencial
24
Busca Seqüencial
n Complexidade
n Se o registro for o primeiro: 1 comparação
n Se o registro procurado for o último: N comparações
n Se for igualmente provável que o argumento apareça em qualquer posição da tabela, em média: (n+1)/2 comparações
n Se a busca for mal sucedida: N comparações
n Logo, a busca seqüencial, no pior caso, é O(n)
25
Busca Seqüencial
n Arranjo não ordenado
n Inserção no final do arranjo
n Remoção n Realocação dos registros acima do registro
removido
26
Busca Seqüencial
n Para aumentar a eficiência
n Reordenar continuamente a tabela de modo que os registros mais acessados sejam deslocados para o início
n A) Método mover-para-frente: sempre que uma pesquisa obtiver êxito, o registro recuperado é colocado no início da lista
n B) Método da transposição: um registro recuperado com sucesso é trocado com o registro imediatamente anterior
n Ambos se baseiam no fenômeno da recuperação recorrente de registros
27
Busca Seqüencial
n Desvantagens do método mover-para-frente n Uma única recuperação não implica que o registro
será freqüentemente recuperado n Perda de eficiência para os outros registros
n O método é mais “caro” em vetores do que em listas n Por quê?
n Vantagens do método mover-para frente n Possui resultados melhores para quantidades
pequena e média de buscas
28
Busca Seqüencial n Busca seqüencial em tabela ordenada
n A eficiência da operação de busca melhora se as chaves dos registros estiverem ordenadas
n No pior caso (caso em que a chave não é encontrada), são necessárias N comparações quando as chaves estão desordenadas
n No caso médio, N/2 comparações se as chaves estiverem ordenadas, pois se para a busca assim que uma chave maior do que a procurada é encontrada
29
Busca Seqüencial n Busca seqüencial indexada
n Existe uma tabela auxiliar, chamada tabela de índices, além do próprio arquivo ordenado
n Cada elemento na tabela de índices contém uma chave (kindex) e um indicador do registro no arquivo que corresponde a kindex
n Faz-se a busca a partir do ponto indicado na tabela, sendo que a busca não precisa ser feita desde o começo
n Pode ser implementada como um vetor ou como uma lista encadeada
n O indicador da posição na tabela pode ser um ponteiro ou uma variável inteira
30
Busca Seqüencial
321
592
876
...
kindex
Tabela de índices ....
14
38
115
321
387
512
567
583
592
611
741
811
876
....
Chave Registro
31
Busca Seqüencial
n Busca seqüencial indexada
n Se a tabela for muito grande, pode-se ainda usar a tabela de índices secundária
n O índice secundário é um índice para o índice primário
32
Busca Seqüencial
321
592
876
...
kindex
Índice primário ....
14
38
115
321
387
512
567
583
592
611
741
811
876
....
Chave Registro
321
876
...
kindex
Índice secundário
33
Busca Seqüencial n Vantagem
n Os itens na tabela poderão ser examinados seqüencialmente sem que todos os registros precisem ser acessados
n O tempo de busca diminui consideravelmente
n Desvantagens
34
Busca Seqüencial n Vantagem
n Os itens na tabela poderão ser examinados seqüencialmente sem que todos os registros precisem ser acessados
n O tempo de busca diminui consideravelmente
n Desvantagens n A tabela tem que estar ordenada
35
Busca Seqüencial n Vantagem
n Os itens na tabela poderão ser examinados seqüencialmente sem que todos os registros precisem ser acessados
n O tempo de busca diminui consideravelmente
n Desvantagens n A tabela tem que estar ordenada n Exige espaço adicional para armazenar a(s) tabela(s) de
índices
n Algo mais?
36
Busca Seqüencial n Vantagem
n Os itens na tabela poderão ser examinados seqüencialmente sem que todos os registros precisem ser acessados
n O tempo de busca diminui consideravelmente
n Desvantagens n A tabela tem que estar ordenada n Exige espaço adicional para armazenar a(s) tabela(s) de
índices
n Cuidados com inserção e remoção
37
Busca Seqüencial
n Remoção
n Remove-se o elemento e rearranja-se a tabela inteira e o(s) índice(s)
n Marca-se a posição do elemento removido, indicando que ela pode ser ocupada por um outro elemento futuramente
n A posição da tabela fica vazia
38
Busca Seqüencial
n Inserção
n Se houver espaço vago na tabela, rearranjam-se os elementos localmente
n Se não houver espaço vago n Rearranjar a tabela a partir do ponto
apropriado e reconstruir o(s) índice(s)
39
Busca Seqüencial
n Inserção do elemento 512 com espaço vago n 567 e 583 descem n 512 é inserido
321
592
876
...
kindex
....
14
38
115
321
387
567
583
592
611
741
811
876
....
Chave Registro
40
Busca Seqüencial
n Inserção do elemento 512 com espaço vago n 567 e 583 descem n 512 é inserido
321
592
876
...
kindex
....
14
38
115
321
387
512
567
583
592
611
741
811
876
....
Chave Registro
41
Busca Seqüencial
n Inserção do elemento 512 sem espaço vago n Elementos a partir
de 567 descem n 512 é inserido n Índice é re-
construído
321
592
876
...
kindex
....
14
38
115
321
387
567
583
585
592
611
741
811
876
....
Chave Registro
42
Busca Seqüencial
n Inserção do elemento 512 sem espaço vago n Elementos a partir
de 567 descem n 512 é inserido n Índice é re-
construído
321
592
876
...
kindex
....
14
38
115
321
387
512
567
583
585
592
611
741
811
....
Chave Registro
43
Busca Seqüencial n Como montar o índice primário
n Se a tabela não estiver ordenada, ordene-a
n Divide-se o número de elementos da tabela pelo tamanho do índice desejado: n/tamanho-índice
n Para montar o índice, recuperam-se da tabela os elementos 0, 0+n/tamanho-índice, 0+2*n/tamanho-índice, etc.
n Cada elemento do índice representa n/tamanho-índice elementos da tabela
44
Busca Seqüencial n Exemplo
n Divide-se o número de elementos da tabela pelo tamanho do índice desejado
n Se a tabela tem 1.000 elementos e deseja-se um índice primário de 10 elementos, faz-se 1.000/10=100
n Para montar o índice, recuperam-se da tabela os elementos 0, 0+n/tamanho-índice, 0+2*n/tamanho-índice, etc.
n O índice primário é montado com os elementos das posições 0, 100, 200, etc. da tabela
n Cada elemento do índice representa n/tamanho-índice elementos da tabela
n Cada elemento do índice primário aponta para o começo de um grupo de 100 elementos da tabela
45
Busca Seqüencial
n Para montar um índice secundário, aplica-se raciocínio similar sobre o índice primário
n Em geral, não são necessários mais do que 2 índices
46
Busca Seqüencial
n Exercício n Escrever em C a sub-rotina para produzir o
índice primário de um vetor ordenado void criaIndice
n bloco_indice indice[] n int tamanho_indice n int v[] n int n
kindex
pos
Implementação
47
48
Busca Seqüencial
n Exercício (nota adicional)
n Escrever em C uma sub-rotina de busca sequencial indexada por um elemento em uma tabela com índice primário
n int bsi à retorna posicao n int v[], int n n bloco_indice indice[], int tamanho_indice n int x
Implementação
49
50
Busca Binária
n Se os dados estiverem ordenados em um arranjo, pode-se tirar vantagens dessa ordenação n Busca binária
A[i]<=A[i+1], se ordem crescente
A[i]>=A[i+1], se ordem decrescente
51
Busca Binária
n O elemento buscado é comparado ao elemento do meio do arranjo n Se igual, busca bem-sucedida n Se menor, busca-se na metade inferior do
arranjo n Se maior, busca-se na metade superior do
arranjo
52
12 25 33 37 48 57 86 92 inf=1 sup=N=8
Busca Binária
n Busca-se por 25
53
12 25 33 37 48 57 86 92
25 < 37
meio inf=1 sup=N=8
n Busca-se por 25
Busca Binária
54
12 25 33 37 48 57 86 92 sup=3 inf=1 N=8
Busca Binária
n Busca-se por 25
55
12 25 33 37 48 57 86 92 N=8
=25
meio sup=3 inf=1
n Busca-se por 25
Busca Binária
56
12 25 33 37 48 57 86 92 N=8
=25
meio sup=3 inf=1
n Busca-se por 25
Em cada passo, o tamanho do arranjo em que se busca é dividido por 2
Busca Binária
57
Busca Binária
n Exercício
n Escrever em C uma sub-rotina de busca binária por um elemento em um arranjo ordenado
n Versão recursiva n Versão não recursiva
58
59
60
Busca Binária
n Complexidades?
61
Busca Binária
n Complexidades? n O(log(n)), pois cada comparação reduz o
número de possíveis candidatos por um fator de 2
62
Busca Binária
n Vantagens n Eficiência da busca n Simplicidade da implementação
n Desvantagens n Nem todo arranjo está ordenado
63
Busca Binária
n Vantagens n Eficiência da busca n Simplicidade da implementação
n Desvantagens n Nem todo arranjo está ordenado n Exige o uso de um arranjo para armazenar os dados
n Faz uso do fato de que os índices do vetor são inteiros consecutivos
n Inserção e remoção de elementos são ineficientes n Realocação de elementos
64
Busca Binária
n A busca binária pode ser usada com a organização de tabela seqüencial indexada n Em vez de pesquisar o índice seqüencialmente,
pode-se usar uma busca binária
65
Busca por Interpolação n Se as chaves estiverem uniformemente distribuídas,
esse método pode ser ainda mais eficiente do que a busca binária
n Com chaves uniformemente distribuídas, pode-se esperar que x esteja aproximadamente na posição
meio = inf + (sup – inf) * ((x – A[inf]) / (A[sup] – A[inf]))
sendo que inf e sup são redefinidos iterativamente como na busca binária
66
Busca por Interpolação
n Complexidade
n O(log(log(n))) se as chaves estiverem uniformemente distribuídas
n Raramente precisará de mais comparações
n Se as chaves não estiverem uniformemente distribuídas, a busca por interpolação pode ser tão ruim quanto uma busca seqüencial
67
Busca por Interpolação
n Desvantagem
n Em situações práticas, as chaves tendem a se aglomerar em torno de determinados valores e não são uniformemente distribuídas
n Exemplo: há uma quantidade maior de nomes começando com “S” do que com “Q”