{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