170 likes | 292 Views
Pesquisa de Informação. A procura/pesquisa de informação é uma das actividades quotidianas mais frequentes; E consequentemente, uma das actividades preponderantes num sistema informático;
E N D
Pesquisa de Informação • A procura/pesquisa de informação é uma das actividades quotidianas mais frequentes; • E consequentemente, uma das actividades preponderantes num sistema informático; • Embora a pesquisa de informação (procurar um elemento entre um conjunto deles) pareça uma operação simples, criar programas eficientes em termos de procura levanta vários problemas; • A pesquisa de informação é muitas vezes efectuada recorrendo a tabelas. Assim, vamos analisar dois métodos de pesquisa de informação em tabelas: • 1. Procura sequencial ou linear • 2. Procura binária Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort”
Pesquisa Sequencial de Informação • Procura sequencial ou linear – é uma das formas mais simples de procurar dados numa tabela. O que se faz é percorrer a tabela: começa-se no 1º elemento e compara-se esse elemento com o valor dado, depois passa-se para o 2º elemento e compara-se com o valor dado, e assim sucessivamente até que o valor seja encontrado ou cheguemos ao fim da tabela. • Podemos fazer este tipo de procura de 2 formas: • a) sem a utilização de sentinelas • b) com a utilização de sentinelas Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort”
Pesquisa Sequencial de Informação Considere para os exemplos que se vão seguir, que as variáveis e tipos foram definidos da seguinte forma: Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort” Program procuratel (input, output); Const maxpessoas = 1000; Type repnome = array [1..25] of char; tabnomes = array [1..maxpessoas] of repnome; tabtelefones = array [1..maxpessoas] of integer; Var nomes : tabnomes; telefones : tabtelefones; nomedes : repnome; i, telefone : integer;
Pesquisa Sequencial de Informação a) sem a utilização de sentinelas Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort” Function procura (chave:repnome; var nomes:tabnomes; var telefones:tabtelefones):integer; var i : integer; begin i:=1; while (nomes[i]<>chave) and (i<maxpessoas) do i:=i+1 if nomes[i]=chave then procura:=telefones[i]; else procura:=-1 end; Esta função efectua uma procura Sequencial na tabela Nomes tentando Encontrar a palavra Correspondente à Variável chave !
Pesquisa Sequencial de Informação • O problema da solução anterior é que a parte do programa que diz respeito à procura propriamente dita, ou seja, a instrução: • while (nomes[i]<>chave) and (i<maxpessoas) do • i:=i+1; • Tem de efectuar continuamente 2 testes, o que torna a operação de pesquisa menos eficiente: • - ver se o nome que se procura foi encontrado: • (nomes[i]<>chave) • - ver se já se chegou ao fim da tabela: • (i<maxpessoas) • Note-se que o 1º teste é necessário mas o 2º só faz falta porque não podemos garantir que o nome que procuramos existe de facto na tabela. Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort”
Pesquisa Sequencial de Informação b) Uma forma de prescindir do 2º teste é através da utilização do que se designa por valor sentinela, ou seja, um valor que é inserido na tabela para garantir que a procura tem sucesso: Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort” Function procura (chave:repnome; var nomes:tabnomes; var telefones:tabtelefones):integer; var i : integer; Begin nomes[maxpessoascsent] := chave; i:=1; while (nomes[i]<>chave)do i:=i+1 if i<>maxpessoascsent then procura:=telefones[i]; else procura:=-1 end; Colocação do valor Sentinela.
Pesquisa Sequencial de Informação • Para se poder utilizar um valor sentinela é preciso que existe uma • Posição adicional na tabela, ou seja, se a tabela tem n elementos terá • de ter n+1 posições; • Nessa posição adicional da tabela (n+1) coloca-se o valor sentinela; • A seguir efectua-se a pesquisa normalmente; • A última operação tem de ser verificar se o valor encontrado • corresponde ao valor sentinela. • O exemplo do slide anterior pressupõe que a definição inicial do • programa principal passe a ser: Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort” Program procuratel (input, output); Const maxpessoas = 1000; maxpessoascsent = 1001; Type repnome = array [1..25] of char; tabnomes = array [1..maxpessoascsent] of repnome; tabtelefones = array [1..maxpessoas] of integer;
Pesquisa Binária de Informação • 2. Procura binária – é uma alternativa à procura sequencial e é mais eficiente só que exige que os elementos que estão a ser pesquisados se encontrem ordenados. Este tipo de procura reduz o nrº de elementos a pesquisar para metade pois processa-se da seguinte forma: • a) começa-se por se considerar o elemento que está no meio da tabela; • b) se esse valor for maior (ou seja, aparecer depois) que o elemento que estamos a procurar então a procura será feita apenas na primeira metade da tabela; • c) se esse valor for menor (ou seja, aparecer antes) que o elemento que estamos a procurar então a procura será feita apenas na segunda metade da tabela; Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort”
Pesquisa Binária de Informação Function procura (chave:repnome; var nomes:tabnomes; var telefones:tabtelefones):integer; var LimInf, LimSup, Meio : integer; begin LimInf:=1; LimSup:=Maxpessoas; repeat meio:=(LimInf+LimSup) div 2; if chave<Nomes[Meio]then LimSup:=Meio-1; else LimInf:=Meio+1; until (chave=Nomes[Meio]) or (LimInf>LimSup); if chave=Nomes[Meio] then procura:=telefones[Meio]; else procura:=-1 end; Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort”
Ordenação Bolha (Bubble Sort) • Já vimos que a ordenação da informação facilita as operações de busca tornando-as mais eficientes; • Os algoritmos de ordenação dividem-se em 2 grandes grupos: • os de ordenação interna – que ordenam os elementos que estão simultaneamente armazenados em memória, ex: tabela; • os de ordenação externa – que ordenam elementos que por serem muitos não podem estar simultaneamente em memória, estando parte desses elementos armazenada no computador em ficheiros; • Os algoritmos que vamos ver são apenas de ordenação interna, ou seja, algoritmos para a ordenação de dados armazenados em tabelas . Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort”
Ordenação por Borbulhamento (“Bubble Sort”) • É o mais simples e básico algoritmo de ordenação. • A ideia básica é: • percorrer todos os elementos a ordenar; • comparar elementos adjacentes; • trocar os pares de elementos que estejam fora de ordem; • De um modo geral uma única passagem por todos os elementos não é suficiente para ordenar a tabela, sendo normal várias passagens pelos elementos. A tabela só estará ordenada quando for efectuada uma passagem por todos os elementos sem que seja efectuada qualquer troca. • O único problema deste tipo de ordenação é que não se torna muito eficiente dado que apenas são trocados os valores adjacentes. Assim, se um elemento estiver muito longe da sua posição final ordenada é preciso efectuar muitas passagens até que seja colocado no seu devido lugar. Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort”
Ordenação por Borbulhamento (“Bubble Sort”) Exemplo 1: Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort” Program BSort(input,output); const n=10; var i, j : integer; temp : integer; a : array[1..n] of integer; begin for i:=1 to (n-1) do for j:=i+1 to n do if a[i]>a[j] then begin temp:=a[i]; a[i]:=a[j]; a[j]:=temp; end; end.
Ordenação por Borbulhamento (“Bubble Sort”) Exemplo 2: Procedure ordena(.....); Const tamanho=10; var i : integer; nenhumatroca : boolean; numeros:array[1..tamanho]; Procedure troca (var x,y:integer); var temp :integer; begin temp:=x; x:=y; end begin repeat nenhumatroca:=true; for i:=1 to tamanho-1 do if numeros[i]>numeros[i+1] then begin troca(numeros[i],numeros[i+1]); nenhumatroca:=false; end until nenhumatroca:=true End; Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort”
Ordenação “Shell Sort” Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort” • É uma variante da ordenação por borbulhamento; • A ideia básica: • comparar e trocar por borbulhamento, não os elementos adjacentes mas os elementos separados por um certo intervalo (que é metade do número de elementos a ordenar); • depois esse intervalo é dividido ao meio e o processo repete-se até que o intervalo seja 1. • Esta ordenação é mais eficiente que a ordenação por borbulhamento dado que as primeiras passagens apenas consideram um subconjunto do total de elementos a ordenar e as últimas passagens, que são as que vão incidir sobre todos os elementos já os vão encontrar parcialmente ordenados.
Ordenação “Shell Sort” Procedure ordena(.....); Const tamanho=10; var intervalo, i : integer; nenhumatroca : boolean; numeros:array[1..tamanho]; Procedure troca (var x,y:integer); var temp :integer; begin temp:=x; x:=y; end Begin intervalo:=tamanho div 2; repeat repeat nenhumatroca:=true; for i:=1 to tamanho-intervalo do if numeros[i]>numeros[i+intervalo] then begin troca(numeros[i],numeros[i+intervalo]); nenhumatroca:=false; end until nenhumatroca:=true intervalo := intervalo div 2 until intervalo:=0 End; Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort”
Ordenação por Selecção (“Selection Sort”) Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort” • Consiste em percorrer todos os elementos a ordenar e a cada passagem coloca um elemento na posição correcta, ou seja: • na primeira passagem o valor mais pequeno é colocado na posição correcta; • na segunda passagem o segundo valor mais pequeno é colocado na posição correcta; • e assim sucessivamente...
Ordenação por Selecção (“Selection Sort”) Procedure ordena(.....); Const tamanho=10; var posmenor, i, j : integer; nenhumatroca : boolean; numeros:array[1..tamanho]; Procedure troca (var x,y:integer); var temp :integer; begin temp:=x; x:=y; end Begin for i:=1 to tamanho-1 do begin posmenor:=i; for j:=i+1 to tamanho do if numeros[j]<numeros[posmenor] then posmenor:=j; troca(numeros[i], numeros[posmenor]) end End; Pesquisa de Informação: Procura Sequencial ou Linear Procura Binária Ordenação de Informação: Ordenação“Bubble Sort” Ordenação“Shell Sort” Ordenação“Selection Sort”