Professional Documents
Culture Documents
E ALGORITMOS
TABELAS DE DISPERSO
Aula 15
Gizelle Kupac Vianna (PPGMMC/UFRRJ) 3
Tabelas de Disperso
Tabelas usadas para implementar ndices de bancos de
dados. so usadas para compactar tabelas de dados
esparsas, as tabelas de hash otimizam o acesso a
campos de um banco de dados.
Funes de Disperso
Idealmente, funes de disperso deveriam ser injetivas,
isto , todas as chaves deveriam ser mapeadas por h em
um ndice distinto.
Funes de Disperso
Em geral, uma boa funo de disperso deve
reunir as seguintes qualidades:
produzir poucas colises: requer alguma anlise sobre a
distribuio das chaves sendo acessadas. Ex.: se o dado
a ser armazenado so cdigos alfanumricos que
comeam sempre por A ou B, usar o primeiro caractere
como chave pode levar a muitas colises .
ser fcil de computar: conter poucas e simples
operaes aritmticas.
ser uniforme: essa funo precisa garantir que todas as
posies tenham probabilidade semelhante de serem
escolhidas.
Gizelle Kupac Vianna (PPGMMC/UFRRJ) 7
Funes de Disperso
A funo MOD uma das funes de disperso mais
empregadas. Utiliza-se h(x) = x mod m, onde:
x = chave do registro a ser armazenado
m = dimenso da tabela de armazenamento.
typedef struct {
tno chave[TAM];
} thash;
if (hash_cheio(*th)) return 0;
if (th->chave[ind] == VAZIO) {
th->chave[ind] = chave;
return 1;
}
Gizelle Kupac Vianna (PPGMMC/UFRRJ) 12
if (hash_vazio(*th)) return 0;
if (th->chave[ind] == chave) {
th->chave[ind] = VAZIO;
return 1;
}
Gizelle Kupac Vianna (PPGMMC/UFRRJ) 14
printf("\n");
return;
}
Gizelle Kupac Vianna (PPGMMC/UFRRJ) 16
cria_tabHash(&H);
inserir(&H,2010390123);
remover(&H,201039012
inserir(&H,2012391234); 3);
inserir(&H,2013392301); remover(&H,201239123
inserir(&H,1); 4);
inserir(&H,2); remover(&H,2);
inserir(&H,4); remover(&H,1);
inserir(&H,11); percorrer (H);
inserir(&H,12);
inserir(&H,5); return 0;
percorrer (H); }
17
typedef struct {
tnoe *prim;
} tind;
typedef struct {
tind indice[TAM];
} thash;
Gizelle Kupac Vianna (PPGMMC/UFRRJ) 22
no = (tnoe *) malloc(sizeof(tnoe));
if (no == NULL) {
printf("\n Erro de Memoria!");
exit(0);
}
no->chave = chave;
no->prox = NULL;
return no;
}
Gizelle Kupac Vianna (PPGMMC/UFRRJ) 24
if (hash_vazio(*th)) return 0;
if (!busca_ant(th,&ant,valor)) {
printf("\nElemento %d nao pertence `a lista!",valor);
return -1;
}
Gizelle Kupac Vianna (PPGMMC/UFRRJ) 27
free(aux);
return 1;
}
Gizelle Kupac Vianna (PPGMMC/UFRRJ) 28
inserir(&H,1);
inserir(&H,2);
inserir(&H,4); remover(&H,1);
inserir(&H,11); remover(&H,2);
inserir(&H,12); remover(&H,4);
inserir(&H,5); remover(&H,11);
inserir(&H,15); remover(&H,12);
inserir(&H,21); remover(&H,5);
inserir(&H,22); remover(&H,15);
inserir(&H,25);
inserir(&H,33); return 0;
percorrer (H); }