Escolar Documentos
Profissional Documentos
Cultura Documentos
Captulo 5
http://www2.dcc.ufmg.br/livros/algoritmos/
Pesquisa em Memria
Primria
Trie , Patricia
Transformao de Chave (Hashing)
Pesquisa Digital
rvores SBB
rvores de Pesquisa
Pesquisa Seqencial
Distino no rgida:
Tabelas
Depende principalmente:
1. Quantidade dos dados envolvidos.
2. Arquivo estar sujeito a inseres e retiradas
freqentes.
Algoritmos de Pesquisa
Tipos Abstratos de Dados
Dicionrio
Pesquisa Seqencial
# define Maxn
10
typedef long TipoChave;
Pesquisa Seqencial
T->Item[0].Chave = x;
i = T->n + 1;
do {
i--;
} while (T->Item[i].Chave != x);
return i;
Pesquisa Seqencial
Pesquisa Seqencial
Pesquisa Seqencial
Pesquisa Seqencial
Pesquisa Seqencial
Anlise:
Pesquisa com sucesso:
melhor caso : C(n) = 1
pior caso : C(n) = n
caso mdio: C(n) = (n + 1) / 2
Pesquisa sem sucesso:
C (n) = n + 1.
Pesquisa Seqencial
Pesquisa Binria
Anlise
Pesquisa Binria
Hash signica:
p
0,883
0,524
0,493
0,303
N
10
22
23
30
Funes de Transformao
ou
h(K) = K mod M
inteiros.
bi j
Transformao de Chaves No
Numricas
Transformao de Chaves No
Numricas
void GeraPesos(TipoPesos p)
Transformao de Chaves No
Numricas
int i;
unsigned int Soma = 0;
int comp = strlen(Chave);
Transformao de Chaves No
Numricas
Listas Encadeadas
utilizada para M = 7,
h(Chave) = Chave % M
Listas Encadeadas
h(A) = h(1) = 1,
h(E) = h(5) = 5,
h(S) = h(19) = 5, etc
Por exemplo:
Listas Encadeadas
#define M
7
#define n
7
typedef char TipoChave[n];
int i;
for (i = 0; i < M; i++)
FLVazia(&T[i]);
void Inicializa(TipoDicionario T)
else
if (Pesquisa(x.Chave, p, T) == NULL)
else
Ap = Pesquisa(x.Chave, p, T);
Apontador Ap;
Anlise
armazenar os registros.
Endereamento Aberto
Endereamento Aberto
utilizada para M = 7,
h(Chave) = Chave % M
Exemplo
h(L) = h(12) = 5,
h(U ) = h(21) = 0,
h(N ) = h(14) = 0,
h(E) = h(5) = 5,
h(S) = h(19) = 5.
Por exemplo:
Exemplo
7
11 /* Tamanho da chave */
#define n
"**********"
#define Retirado
#define M
"!!!!!!!!!!"
#define Vazio
} TipoItem;
TipoChave Chave;
/* outros componentes */
int i;
for (i = 0; i < M; i++)
memcpy(T[i].Chave, Vazio, n);
void Inicializa(TipoDicionario T)
{ unsigned int i = 0;
unsigned int Inicial;
if (Pesquisa(x.Chave, p, T) < M) {
printf("Elemento ja esta presente\n");
return;
}
Inicial = h(x.Chave, p);
while ( (strcmp ( T[(Inicial + i) % M].Chave,Vazio) != 0) &&
(strcmp ( T[(Inicial + i) % M].Chave, Retirado) != 0) &&
( i < M)) i++;
if (i < M) {
strcpy (T[(Inicial + i) % M].Chave, x.Chave); /* Copiar os demais
campos de x, se existirem */
}
else printf(" Tabela cheia\n");
Algoritmos e Estrutura de Dados II
{ unsigned int i = 0;
i = Pesquisa(Ch, p, T);
Indice i;
Anlise
Anlise
Desvantagens:
Simplicidade de implementao
Vantagens:
Vantagens e Desvantagens de
Transformao da Chave
rvores de Pesquisa
O nvel do n raiz 0.
Se um n est no nvel i ento a raiz de suas subrvores
esto no nvel i + 1.
A altura de um n o comprimento do caminho mais longo
deste n at um n folha.
A altura de uma rvore a altura do n raiz.
typedef Struct No {
Registro Reg;
Apontador Esq, Dir;
} No;
Estrutura de dados:
if (*p == NULL) {
printf("Erro : Registro nao esta presente na arvore\n");
return;
}
if (x->Chave < (*p)->Reg.Chave) {
Pesquisa(x, &(*p)->Esq);
return;
}
if (x->Chave > (*p)->Reg.Chave) Pesquisa(x, &(*p)->Dir);
else *x = (*p)->Reg;
if (*p == NULL) {
*p = (Apontador)malloc(sizeof(No));
(*p)->Reg = x;
(*p)->Esq = NULL; (*p)->Dir = NULL;
return;
}
if (x.Chave < (*p)->Reg.Chave) {
Insere(x, &(*p)->Esq);
return;
}
if (x.Chave > (*p)->Reg.Chave) Insere(x, &(*p)->Dir);
else printf("Erro : Registro ja existe na arvore\n");
esquerda;
Alguns comentrios:
if ( (*r)->Dir != NULL)
{
Antecessor(q, &(*r)->Dir);
return;
}
q->Reg = (*r)->Reg;
q = *r;
*r = (*r)->Esq;
free(q);
Exemplo da Retirada de um
Registro da rvore
if (*p == NULL) {
printf("Erro : Registro nao esta na arvore\n");
return;
}
if (x.Chave < (*p)->Reg.Chave) {
Retira(x, &(*p)->Esq);
return;
}
if (x.Chave > (*p)->Reg.Chave){
Retira(x, &(*p)->Dir);
return;
Algoritmos e Estrutura de Dados II
}
{ Apontador Aux;
if ((*p)->Dir == NULL) {
Aux = *p;
*p = (*p)->Esq;
free(Aux);
return;
}
if ((*p)->Esq != NULL) {
Antecessor(*p, &(*p)->Esq);
return;
}
Aux = *p;
*p = (*p)->Dir;
free(Aux);
Caminhamento Central
Percorrer a rvore:
Caminhamento Central
if (p == NULL) return;
Central(p->Esq);
printf("%ld\n", p->Reg.Chave);
Central(p->Dir);
void Central(Apontador p)
Caminhamento Central
Anlise
Anlise