{joseana, rangel}@dsc.ufcg.edu.br
DSC/CCT/UFCG
Prof.: José Eustáquio Rangel de Queiroz
[email protected]
[email protected]
Carga Horária: 60 horas
Busca em C I
DSC/CCT/UFCG

Considerações Iniciais I
 Suposição  Necessidade de localização/
recuperação de um número de telefone de
interesse em uma agenda implementada
computacionalmente
{joseana, rangel}@dsc.ufcg.edu.br
 Estratégia  Escrutínio do array desde o
seu início e verificação de todos os
nomes até a localização daquele
associado ao número de interesse ou até
que se atinja o final do array
2
Busca em C II
DSC/CCT/UFCG

Considerações Iniciais II
 Localização de informações em arrays
desordenados  Processo seqüencial,
do primeiro item ao item de interesse ou o
último item do array
{joseana, rangel}@dsc.ufcg.edu.br
 Localização de informações em arrays
ordenados  Processo de busca
binária, com fins à aceleração da tarefa
de recuperação do item de interesse
3
Busca em C III
DSC/CCT/UFCG

Busca Seqüencial I
 Codificação relativamente fácil
{joseana, rangel}@dsc.ufcg.edu.br
 Escolhas

Permissão de chaves não únicas?

Retorno do primeiro item de interesse
localizado ou de todos os itens
compatíveis com a busca?
 Número médio de tentativas

Chave única  ½ n

Chave não única  n
4
Busca em C IV
DSC/CCT/UFCG

Busca Seqüencial II
 Número de tentativas
Melhor caso  1
 Pior caso
n

 Força Bruta  Tempo de Execução é
{joseana, rangel}@dsc.ufcg.edu.br
O(n)
5
Busca em C V
DSC/CCT/UFCG

Busca Seqüencial III
{joseana, rangel}@dsc.ufcg.edu.br
 Algoritmo 01
int BuscaSeq(int l, int r, int x)
{
for (int i = l; i <= r; i++)
if (a[i] == x) return i;
return -1;
}
6
Busca em C VI
DSC/CCT/UFCG

Busca Binária I
 Base  Divisão para conquista
{joseana, rangel}@dsc.ufcg.edu.br


Verificação do item central do array

Se o item for maior do que a chave de
busca, execução do teste do item
central da primeira metade do array

Caso contrário, execução do teste do
item central da segunda metade do
array
Repetição do processo até a localização
do item ou a inexistência de itens de
teste
7
Busca em C VII
DSC/CCT/UFCG

Busca Binária II
 Número de tentativas

Busca insatisfatória  logn + 1
{joseana, rangel}@dsc.ufcg.edu.br
 Busca satisfatória
 Pior caso
 logn
 Caso Médio
 logn -1
 Melhor caso  1
 Tempo de Execução  O(logn)
8
Busca em C VIII
DSC/CCT/UFCG

Busca Binária III
{joseana, rangel}@dsc.ufcg.edu.br
 Algoritmo 02
int BuscaBin(int esq, int dir, int ch){
int meio;
if (esq > dir) return -1
else {
meio = (esq + dir)/2;
if (a[meio] == ch) return meio;
if (a[meio] > ch) return BuscaBin(esq,meio-1,ch);
else return BuscaBin(meio+1,dir,ch);
}
9
Busca em C IX
DSC/CCT/UFCG

Exercício 01
 Implementar
{joseana, rangel}@dsc.ufcg.edu.br
os algoritmos de busca
Seqüencial e Binária para arrays de
caracteres
10
Busca em C X
DSC/CCT/UFCG

Exercício 02
 Analisar o código apresentado nos slides
{joseana, rangel}@dsc.ufcg.edu.br
13 e 14, implementar a função Le_gente
em
um
arquivo
e
explicar
o
funcionamento do programa
11
Busca em C XI
DSC/CCT/UFCG

Exercício 02 (1/2)
{joseana, rangel}@dsc.ufcg.edu.br
#define TAM 30
#define MAX 100
typedef struct {
char prim[TAM];
char ult[TAM];
int alt;
int p;
} indiv;
indiv gente[MAX];
main(){
int i ;
Le_gente();
qsort(gente, n, sizeof(gente), Compara_gente);
for (i=0; i<n; i++)
printf(’’%s, %s\n’’, gente[i].ult, gente[i].prim);
}
12
Busca em C XII
DSC/CCT/UFCG
{joseana, rangel}@dsc.ufcg.edu.br

Exercício 02 (2/2)
int Compara_gente(indiv *a, indiv *b)
{
int res;
if (a->alt < b->alt) return (-1);
if (a->alt > b->p) return (1);
if (a->p < b->p) return (-1);
if (a->p > b->p) return (1);
if ((res=strcmp(a->ult, b->ult))!=0) return res;
return(strcmp(a->prim, b->prim));
}
13
DSC/CCT/UFCG
José Eustáquio Rangel de Queiroz
[email protected], [email protected]
{joseana, rangel}@dsc.ufcg.edu.br
UNIVERSIDADE FEDERAL DE CAMPINA GRANDE
CENTRO DE CIÊNCIAS E TECNOLOGIA
DEPARTAMENTO DE SISTEMAS E
COMPUTAÇÃO
Download

TP_NA10 - Computação UFCG