Métodos de Pesquisa A utilização de matrizes poderá gerar grandes tabelas onde ficará difícil localizar um determinado elemento de forma rápida. Para solucionar este tipo de problema você terá que efetuar o que chamamos de pesquisas em matrizes através do uso de programação. Iremos apresentar dois métodos de pesquisa, Pesquisa seqüencial e pesquisa binária. Pesquisa Seqüencial Este método consiste em efetuar a busca da informação desejada a partir do primeiro elemento sequencialmente até o último. Localizando a informação no caminho, esta é apresentada. Este método de pesquisa é lento, porém eficiente nos casos em que uma matriz encontra-se com seus elementos desordenados. Exemplo: Criar um programa para ler o nome de 10 pessoas, ao final da leitura elabore uma rotina para efetuar uma pesquisa seqüencial no vetor. Em algoritmos ALGORITMO pesquisa_sequencial; nome:conjunto[1..10] DE TEXTO i:inteiro pesq,resp:texto acha:boleano ESCREVA Pesquisa sequencial de nomes PARA I DE 1 ATE 3 FACA ESCREVA Informe o,i, Nome...: ;LEIA nome[i] Resp SIM ENQUANTO (resp = SIM ) OU (resp = sim ) FACA ESCREVA Informe o nome a ser pesquisa... ;LEIA pesq I 1 Acha false ENQUANTO (i<=3) E (acha = false) FACA SE (pesq = nome[i]) ENTAO acha true I i + 1 -SE SE (acha = true) ENTAO ESCREVA pesq, foi localizado na posição,i ESCREVA pesq, Não foi localizado -SE ESCREVA Deseja continuar: SIM/NÃO ;LEIA resp -ENQUANTO PROF. MARCIO FERREIRA DE JESUS 1
Em Pascal Program pesquisa_sequencial; uses wincrt; nome:array[1..10] of string; i:integer; pesq,resp:string; acha:boolean; Writeln('Pesquisa sequencial de nomes'); For I:=1 To 3 Do Write('Informe o ',i,' Nome...:');readln(nome[i]); resp:='sim'; While (resp = 'SIM') or (resp = 'sim') Do Write('Informe o nome a ser pesquisa...');readln(pesq); i:=1; acha:=false; While (i<=3) and (acha = false) Do If (pesq = nome[i]) Then acha := true i:= i + 1; If (acha = true) Then writeln(pesq, ' foi localizado na posição ',i) Writeln(pesq, ' Não foi localizado'); Write('Deseja continuar: SIM/NÃO)');readln(resp); end. Pesquisa Binária Este método de pesquisa é em média rápido que o primeiro método, porém exige que a matriz esteja previamente classificada, pois este método divide a lista em duas partes e procura saber se a informação a ser pesquisada está acima ou abaixo da linha de divisão. Se estiver acima, por exemplo, toda a metade abaixo é desprezada. Em seguida se a informação não foi encontrada, é novamente dividida em duas partes, e pergunta se aquela informação está acima ou abaixo, e assim irá sendo executada até encontrar ou não a informação pesquisada. Pelo fato de dividir sempre em duas partes o volume de dados pesquisado é que o método recebe a denominação de pesquisa binária. Exemplo: Iremos agora refazer o programa acima, sendo neste momento com o método de pesquisa binária. PROF. MARCIO FERREIRA DE JESUS 2
Em Algoritmos ALGORITMO pesquisa_binaria; VAR nome:conjunto[1..3] DE TEXTO i,j:inteiro comeco,final,meio:inteiro pesq,resp,x:texto acha:booleano ESCREVA Pesquisa Bibária de nomes PARA I DE 1 ATE 3 FACA ESCREVA Digite o,i, Nome: ;LEIA nome[i] PARA I DE 1 ATE 2 FACA PARA j DE i+1 ATE 3 FACA SE (nome[i] > nome[j]) ENTAO X nome[i] nome[i] nome[j] nome[j] x -SE -PARA -PARA Resp SIM ENQUANTO (resp = SIM ) OU (resp = sim ) FACA ESCREVA Entre o nome a ser pesquisado: ;LEIA pesq Começo 1 final 3 acha false ENQUANTO (comeco <=final) E (acha =false) FACA Meio (comeco + final) div 2 SE (pesq = nome[meio]) ENTAO Acha true SE (pesq < nome[meio]) ENTAO final meio -1 Comeco meio + 1 -SE -SE -ENQUANTO SE (acha = true) ENTAO ESCREVA pesq, Foi localizado na posição,meio ESCREVA pesq, Não foi localizado -SE ESCREVA Deseja continuar (SIM/NÃO): ;LEIA resp -ENQUANTO Em Pascal PROF. MARCIO FERREIRA DE JESUS 3
Program pesquisa_binaria; uses wincrt; nome:array[1..3] of string; i,j:integer; comeco,final,meio:integer; pesq,resp,x:string; acha:boolean; Writeln('Pesquisa Bibária de nomes'); For I:=1 To 3 Do Write('Digite o ',i,' Nome:');readln(nome[i]); For I:=1 To 2 Do For j:=i+1 To 3 Do If (nome[i] > nome[j]) Then x:= nome[i]; nome[i]:= nome[j]; nome[j]:= x; resp:='sim'; While (resp = 'SIM') or (resp = 'sim') Do Write('Entre o nome a ser pesquisado: ');readln(pesq); comeco:=1; final :=3; acha :=false; While (comeco <=final) and (acha =false) Do meio:= (comeco + final) div 2; If (pesq = nome[meio]) Then acha:= true If (pesq < nome[meio]) Then final := meio -1 comeco:=meio + 1; If (acha = true) Then Writeln(pesq, ' Foi localizado na posição ',meio) Writeln(pesq, ' Não foi localizado'); Write('Deseja continuar (SIM/NÃO):');readln(resp); end. PROF. MARCIO FERREIRA DE JESUS 4
Exercícios 1 Desenvolva um programa em algoritmos/pascal para ler uma matriz A do tipo vetor e construir uma matriz B de mesma dimensão com os mesmo elementos de A acrescentados de mais 2. Colocar os elementos da matriz B em ordem crescente. Montar uma rotina de pesquisa binária, para pesquisar os elementos armazenados na matriz B. 2 Desenvolva um programa em algoritmos/pascal para ler trinta elementos de uma matriz A do tipo vetor. Construir uma matriz B de mesmo tipo, observando a seguinte lei de formação: todo elementos de B deverá ser o cubo do elemento de A correspondente. Montar uma rotina de pesquisa seqüencial, para pesuisar os elementos armazenados na matriz B. PROF. MARCIO FERREIRA DE JESUS 5