Você está na página 1de 30

Algoritmos e Estrutura de Dados II

Mtodos de Pesquisa em Memria Primria


Prof Mrcio Bueno
ed2tarde@marciobueno.com / ed2noite@marciobueno.com

Por pesquisa (procura ou busca) entende-se o ato de recuperar uma informao em um conjunto de dados Como a atividade de ordenao, a atividade de busca de grande importncia devido a sua utilizao freqente nos mais diversos tipos de software. Exemplos: Procurar o no de telefone de uma pessoa em uma agenda de telefones. Procurar por uma palavra num texto. Dado um nmero entre 0 e 1000, adivinhar o nmero que se escolheu.
Estrutura de Dados II - Mrcio Bueno 2

Pesquisa

Pesquisa
Numa pesquisa cada unidade de informao armazenada em uma estrutura do tipo registro contendo um campo chave (inteiro, string, etc.) alm de outros campos.
tipo item = registro chave : inteiro {outros campos} fim

O conjunto dos registros de informao normalmente armazenado como: Listas lineares (vetores ou listas encadeadas) rvores binrias Este conjunto usualmente chamado de tabela ("vida curta") ou de arquivo ("vida longa").
Estrutura de Dados II - Mrcio Bueno 3

Pesquisa
O objetivo da pesquisa encontrar uma ou mais ocorrncias de registros com chaves iguais chave de pesquisa Esta operao pode resultar em sucesso ou insucesso.

Estrutura de Dados II - Mrcio Bueno

Algoritmo de Pesquisa
A pesquisa uma tarefa muito utilizada
As rotinas que a executam devem ser eficientes (executar no menor tempo possvel)

O tempo de pesquisa depende do algoritmo de pesquisa utilizado


A escolha desse algoritmo depende diretamente: Da quantidade de dados envolvidos Da freqncia das operaes de insero e de excluso de registros Quando a operao de pesquisa muito mais freqente do que a de insero, deve-se minimizar o tempo de pesquisa, atravs da ordenao dos registros.
Estrutura de Dados II - Mrcio Bueno 5

Algoritmos de Pesquisa em Memria Primria


Pesquisa Seqencial (ou Linear) Pesquisa Seqencial com Sentinela Pesquisa Binria Pesquisa por Interpolao Pesquisa Direta (Hashing)

Estrutura de Dados II - Mrcio Bueno

Algoritmos de Pesquisa em Memria Secundria


rvore Binria rvore B rvore B+ rvore B* rvore Patrcia

Estrutura de Dados II - Mrcio Bueno

Pesquisa Seqencial ou Linear

Pesquisa Seqencial
Mtodo bastante simples. Utilizado quando os dados no esto ordenados pela chave de pesquisa. Princpio: Inicia a pesquisa pelo primeiro registro, avana seqencialmente (registro por registro) e termina: Com sucesso: chave pesquisada encontrada, ou; Sem sucesso: todos os registros so pesquisados, mas a chave no encontrada.
Estrutura de Dados II - Mrcio Bueno 9

Pesquisa Seqencial Implementao


int pesqSeq(int chave, int v[], int n) { int i; for (i = 0; i < n; i++) { if (v[i] == chave) { return (i); } } return (-1); // ndice invlido }

Estrutura de Dados II - Mrcio Bueno

10

Anlise

Pesquisa Seqencial

Para uma pesquisa com sucesso, temos: 1 iterao no melhor caso; N iteraes no pior caso; (N + 1) / 2 iteraes no caso mdio. Para uma pesquisa sem sucesso, temos: N + 1 iteraes. O nmero total de comparaes so: Melhor caso: 2 Pior caso: ( n + 1 ) + n = 2n + 1 Mdio caso: (2n + 1 + 2 ) / 2 = ( 2n + 3 )/ 2
Estrutura de Dados II - Mrcio Bueno 11

Pesquisa Seqencial
Anlise
De forma geral o algoritmo O(n) em complexidade Este algoritmo a melhor soluo para o problema da pesquisa em tabelas desordenadas com poucos registros.

Estrutura de Dados II - Mrcio Bueno

12

Pesquisa Seqencial com Sentinela

Pesquisa Seqencial com Sentinela


Embora muito simples, o algoritmo de pesquisa seqencial pode ser acelerado, atribuindo-se a chave de pesquisa ao registro contido na posio N+1. Com isso, este registro fictcio passa funcionar como sentinela: mesmo na pior das hipteses, a chave ser encontrada na posio N+1. Se durante a pesquisa seqencial o elemento procurado for encontrado em uma posio anterior a N+1, isto significa que o elemento est na tabela.

No entanto, se o elemento procurado s for encontrado na posio N+1, isto significa que ele no est na tabela.

Estrutura de Dados II - Mrcio Bueno

14

Pesquisa Seqencial com Sentinela


A idia bsica da pesquisa seqencial com sentinela usar o elemento procurado como indicao que a tabela acabou

Elimina a necessidade de a cada passo no lao testar se j chegou ao final da tabela


Estrutura de Dados II - Mrcio Bueno 15

Pesquisa Seqencial com Sentinela Implementao


int pesqSeqSent(int chave, int v[], int n) { int i = 0; vet[n] = chave; while (vet[i] != chave) { i++; } if( i < n ) return i; return (-1); // ndice invlido }
Estrutura de Dados II - Mrcio Bueno 16

Pesquisa Binria

Pesquisa Binria
A pesquisa em uma tabela pode ser mais eficiente se os registros forem mantidos em ordem. Princpio:
Similar ao utilizado quando se procura o nome de um assinante em um catlogo telefnico impresso. Compara-se a chave procurada com a chave do registro central do conjunto. Esta comparao indica: a chave foi encontrada, ou em qual das metades a pesquisa deve prosseguir, segundo este mesmo princpio.

Estrutura de Dados II - Mrcio Bueno

18

Pesquisa Binria
Algoritmo:
Para saber se uma chave est presente na tabela, compare a chave com o registro que est no meio da tabela. Se a chave menor, ento o registro procurado est na primeira metade da tabela. Se a chave maior, ento o registro procurado est na segunda metade da tabela. Repita o processo at que a chave seja encontrada, ou fique apenas um registro cuja chave diferente da procurada, significando uma pesquisa sem sucesso.
Estrutura de Dados II - Mrcio Bueno 19

Pesquisa Binria - Implementao


int pesqBin(int chave, int v[], int n) { int inicio = 0; int meio; int fim = n - 1; while (inicio <= fim) { meio = (inicio + fim) / 2; if (chave < v[meio]) { fim = meio - 1; } else if (chave > v[meio]) { inicio = meio + 1; } else { return meio; } } return -1; // ndice Impossvel Estrutura de Dados II - Mrcio Bueno }

20

Anlise:

Pesquisa Binria

A cada iterao o nmero de elementos a serem pesquisados reduzido metade: N, N/2, N/4, N/8, ..., N/2k Queremos que N/2k 1, logo k log2N A chave pesquisada deve ser comparada com o ltimo elemento restante, portanto o nmero mximo de comparaes 1 + log2N. Concluso: Sua ordem de complexidade O(log2N).
Estrutura de Dados II - Mrcio Bueno 21

Anlise:

Pesquisa Binria

Exemplos: Para tabela de 16 elementos 4 iteraes Para 1024 elementos 10 iteraes Para 1000000 elementos 20 iteraes log2n cresce muito devagar com o aumento de n Desempenho muito superior em relao ao algoritmo da pesquisa seqencial

Estrutura de Dados II - Mrcio Bueno

22

Pesquisa Binria - Implementao


Exerccio:
Implemente uma verso recursiva da funo pesquisa binria. Prottipo da funo: int pesqBinRec(int

chave, int v[], int ini, int fim);

Estrutura de Dados II - Mrcio Bueno

23

Pesquisa Binria Implementao Recursiva


int pesqBinRec(int chave, int v[], int ini, int fim) { int meio = (ini + fim) / 2; if ( ini > fim ) return -1; if (chave == v[meio]) return meio; else if (chave < v[meio]) return pesqBinRec(chave, v, ini, meio - 1); else return pesqBinRec(chave, v, meio + 1, fim); }
Estrutura de Dados II - Mrcio Bueno 24

Pesquisa por Interpolao

Pesquisa por Interpolao


Se as chaves estiverem uniformemente distribudas dentro da lista, a pesquisa por interpolao pode ser ainda mais eficiente do que a binria. O algoritmo o mesmo da pesquisa binria, adotando-se a frmula abaixo para o clculo da varivel meio (que neste caso no ser obrigatoriamente o meio da tabela):
meio= ini + ((fim-ini)*(chave-v[ini])) / (v[fim]v[ini]);
Estrutura de Dados II - Mrcio Bueno 26

Pesquisa Binria - Implementao


int pesqInter(int chave, int v[], int n) { int ini = 0; int meio; int fim = n - 1; while (ini <= fim) {
meio = ini + ((fim-ini)*(chave-v[ini])) / (v[fim]-v[ini]); printf("\n O indice do meio foi: %i", meio); if (chave < v[meio]) { fim = meio - 1; } else if (chave > v[meio]) { ini = meio + 1; } else { return meio; } } return -1; // ndice Impossvel }
Estrutura de Dados II - Mrcio Bueno 27

Anlise

Pesquisa por Interpolao

Se as chaves estiverem uniformemente esse mtodo exigir log2(log2n) comparaes Entretanto, se as chaves no estiverem uniformemente distribudas, o mtodo degrada sua eficincia e torna-se ruim No pior caso se compara com a busca seqencial. Em situaes prticas as chaves tendem a se aglomerar em torno de determinados valores e no so uniformemente distribudas Por exemplo, agenda telefnica.
Estrutura de Dados II - Mrcio Bueno

28

Exerccio
1) Apresente um exemplo prtico em que a busca por interpolao ter um melhor desempenho que a busca binria

Estrutura de Dados II - Mrcio Bueno

29

Exerccios
1) Modifique a funo insertionSort apresentada no curso para que a insero dos elementos noordenados no vetor ordenado seja feita usando pesquisa binria. Chame esta nova funo de insertionSortPB. Prottipo da funo: void

insertionSortPB(int v[], int n);

2) Mostre, atravs de um exemplo, um caso em que insertioSortPB funciona melhor que insertionSort.
Estrutura de Dados II - Mrcio Bueno 30

Você também pode gostar