Você está na página 1de 17

Mtodos de Pesquisa

428

Objetivos e Caracterizaes Para que se possa falar em algoritmos de pesquisa, necessrio inicialmente introduzir a noo de mapeamento que uma das mais primitivas em programao. Refere-se a uma regra de associao entre os valores de um conjunto (domnio) e os valores de outro (imagem). Escreve-se m: S T para se declarar que m um mapeamento do conjunto S para o conjunto T. Obtm-se um valor de T aplicando-se m(i), onde i S. Os vetores e matrizes so os casos tpicos. Onde os ndices so normalmente objetos simples ou no mximo tuplas homogenias (pares, triplas, etc) de valores simples.
429

430

Objetivos e Caracterizaes As estruturas chamadas tabelas so a realizao da idia genrica de mapeamento, em que os valores do domnio podem ser quaisquer. A organizao das tabelas pode se reduzir aos arranjos, mas para se falar em tabelas, usa-se uma terminologia especfica: tabela: uma coleo de entradas; entrada: um conjunto de campos, formando um registro, ou linha, da tabela; chave: um campo escolhido para identificar a entrada. Como pode-se perceber uma operao importante a busca de uma entrada dado o valor da chave.

Objetivos e Caracterizaes

A tabela, como mapeamento, poderia ser operada, por exemplo, para uma consulta, da seguinte forma: E = T[C]; Considerando E: entrada, T:tabela; C:chave. Diversas estratgias so propostas para implementao da operao de pesquisa, levando em conta aspectos das operaes usurias e da representao fsica da tabela. Veremos agora dois mtodos utilizados para implementao de pesquisa em tabelas, a pesquisa seqencial e a pesquisa binria.
431

Pesquisa Seqencial

A pesquisa seqencial o mtodo mais simples. Consiste na mera varredura serial, entrada por entrada, devolvendo-se o ndice da entrada cuja chave for igual chave fornecida como argumento da pesquisa. Ou devolvendo 0 (zero), convencionalmente, caso a chave buscada no seja localizada, tendo-se comparado todas as chaves, at o fim da tabela. O algoritmo (mdulo) a seguir nos mostra uma funo que efetua uma busca seqencial em uma tabela.
432

funcao pesq (T: tabela; C: chave): inteiro var i: inteiro inicio para i de 1 ate T.N faca se (T.TAB [i].CH = C) entao retorne (i) fimse fimpara retorne (0) fimfuncao
433

Pesquisa Seqencial

O desempenho da pesquisa seqencial pode melhorar um pouco se a tabela estiver ordenada em funo da chave: pode-se interromper a pesquisa assim que se alcanar uma entrada com chave maior do que a pesquisada (no caso de uma ordenao crescente), significando ser desnecessrio prosseguir at o fim da tabela. O pior caso (busca da ltima chave) continua gerando uma varredura total da tabela. Exerccio: Construa um mdulo que efetue uma busca seqencial em uma tabela ordenada de forma crescente em funo da chave. 434

funcao pesq_seq (T: tabela; C: chave): inteiro var i: inteiro inicio para i de 1 ate T.N faca se (T.TAB [i].CH >= C) entao se (T.TAB [i].CH = C) entao retorne (i) senao retorne (0) fimse fimse fimpara retorne (0) fimfuncao
435

Pesquisa Binria

Sobre a tabela ordenada possvel se obter um algoritmo bem mais eficiente. A idia do mesmo pode ser assimilada pelo seguinte exemplo: ao procurar uma palavra no dicionrio (que uma tabela ordenada), comea-se em qualquer ponto do mesmo. Se a pgina aberta contiver a palavra, a busca terminou; seno, a palavra pode estar antes ou depois dessa pgina, conforme ela seja lexicograficamente menor ou maior que as palavras dessa pgina.
436

Pesquisa Binria

De modo que novamente se abre o dicionrio no setor adequado, anterior ou posterior, repetindo-se este processo at encontrar a palavra. No algoritmo que elaboraremos agora, a primeira comparao de chaves feita no meio da tabela. Se no for encontrada a a chave procurada, pode-se abandonar metade da tabela, repetindo o processo com a diviso da outra metade pelo meio, at ser encontrada a chave ou ter-se uma metade constituda de apenas uma entrada, caracterizando-se assim a ausncia da chave na tabela.
437

funcao pesq_bin (T: tabela; C: chave): inteiro var meio, PRIM, ULT: inteiro achou: logico inicio PRIM <- 1 ULT <- T.N achou <- falso enquanto (PRIM<=ULT e nao achou) faca meio <- (PRIM+ULT)\2 se (C= T.TAB[meio].CH) entao achou <- verdadeiro senao se (C>T.TAB[meio].CH) entao PRIM <- meio+1 //busca na parte final senao ULT <- meio-1 //busca na parte inicial fimse fimse fimenquanto se (achou) entao retorne (meio) senao retorne (0) fimse 438 fimfuncao

Pesquisa Binria
O algoritmo anterior nos mostra uma funo que implementa a pesquisa binria de forma iterativa. Nota-se que, a cada comparao, o universo de chaves a comparar reduzido metade e que o pior caso quando a busca prossegue at a subtabela pesquisada ter s um elemento (encontrando-se ou no a chave procurada). A soluo recursiva natural nesse caso, pois a metade da tabela tambm uma tabela passvel de operao estritamente similar tabela inteira. Para a reformulao recursiva da funo, informa-se os ndices PRIM e ULT, que se referem primeira e ltima entrada do trecho onde se efetua a busca. A invocao inicial deve ser pesq_bin_r (T, C, 1, T.N).
439

Pesquisa Binria

Exerccio: Como exerccio, construa um mdulo recursivo que implemente a pesquisa binria.

440

funcao pesq_bin_r (T:tabela; C: chave; PRIM: inteiro; ULT: inteiro): inteiro var meio: inteiro inicio meio <- (PRIM+ULT)\2 se (C=T.TAB [meio].CH) entao retorne (meio) senao se (PRIM = ULT) entao retorne (0) senao se (C > T.TAB[meio].CH) entao retorne pesq_bin_r(T, C, meio+1, ULT) senao retorne pesq_bin_r(T, C, PRIM, meio-1) fimse fimse fimse fimfuncao
441

Pesquisa Binria

Exerccio: Com base no que foi estudado, defina um novo tipo de dado denominado tabela e construa um algoritmo que manipule adequadamente uma varivel do tipo tabela. Dentre as possibilidades de manipulao deve ser possvel efetuar uma busca binria sobre a tabela procura de uma determinada entrada.
Dica: Utilizar como base o exerccio do slide 313.
442

... tipo data: registro inicio dia:inteiro mes: inteiro ano: inteiro fimregistro tipo chave: inteiro tipo registro_conta: registro inicio nome: caractere cpf: caractere rg: caractere numero_conta: chave data_abertura: data saldo: real fimregistro tipo tabela: registro inicio TAB: vetor [1..100] de registro_conta N: inteiro fimregistro
443

...

FIM!

Você também pode gostar