Você está na página 1de 14

Mtodos de Pesquisa

472

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). Escrevese 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. A os ndices so normalmente objetos simples ou no mximo tuplas homogenias (pares, triplas, etc) de valores simples.
473

474

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.
475

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 -1, convencionalmente, caso a chave buscada no seja localizada, tendose comparado todas as chaves, at o fim da tabela. O algoritmo a seguir nos mostra uma funo que efetua uma busca seqencial em uma tabela.
476

int pesq (tabela T, chave C) { int i; for (i=0; i<T.N; i++) if (T.TAB [i].CH == C) return i; return -1; }

477

Pesquisa Seqencial

A complexidade do algoritmo acima O(n). 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, significando ser desnecessrio prosseguir at o fim da tabela. O pior caso (busca da ltima chave) continua O(n). No algoritmo a seguir visualizamos um exemplo de uma funo que efetua a busca seqencial em uma tabela ordenada em funo da chave. 478

int pesq_seq (tabela T, chave C) { int i; for (i=0; i<T.N; i++) if (T.TAB [i].CH >= C) if (T.TAB [i].CH == C) return i; else return -1; return -1; }
479

Pesquisa Binria

Sobre a tabela ordenada possvel obter-se 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.
480

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 apresentado agora, a primeira comparao de chaves feita no meio da tabela. Se no for encontrada a a chave procurada, podese 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. 481

482

int pesq_bin (tabela T, chave C) { int meio, PRIM, ULT, achou; PRIM = 0; ULT = T.N-1, achou = 0; while (PRIM <= ULT && !achou) { meio = (ULT + PRIM) / 2; if (C== T.TAB [meio].CH) achou = 1; else if (C > T.TAB[meio].CH) PRIM = meio + 1; //busca na parte final else ULT = meio - 1; //busca na parte inicial } if (achou) return meio; else return -1; }

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). Para isso acontecer, o tamanho da tabela vai-ser reduzido de n para n/2, (n/2)/2, ... at 1. Logo, a complexidade dessa soluo O(log n).
483

Pesquisa Binria - Exerccio

Com base no algoritmo anterior, defina um TAD tabela e codifique um programa em C, o qual deve se utilizar da operao pesq_bin do TAD definido.

484

Pesquisa Binria

A soluo recursiva natural nesse caso, pois a metade da tabela tambm uma tabela passvel de operao estritamente similar tabela inteira. Para o reaproveitamento recursivo 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 (T, C, 0, T.N-1). Como exerccio, construa uma funo recursiva que implemente a pesquisa binria.
490

Você também pode gostar