230 likes | 371 Views
Conteúdo. 1. Introdução 2. Listas 3. Filas 4. Pilhas 5. Listas Ordenadas 6. Tabelas de Dispersão (Hashing) 7. Árvores Árvore Binária e Árvore B 8. Métodos de Pesquisa de Dados 9. Métodos de Ordenação de Dados. Tabelas de Dispersão (Hashing). Motivação.
E N D
Conteúdo 1. Introdução 2. Listas 3. Filas 4. Pilhas 5. Listas Ordenadas 6. Tabelas de Dispersão (Hashing) 7. Árvores Árvore Binária e Árvore B 8. Métodos de Pesquisa de Dados 9. Métodos de Ordenação de Dados
Motivação • Grande número de operações de inserção e consulta de elementos em uma estrutura de dados. • Ocasionalmente, elementos são removidos da estrutura de dados. as operações de inserção e consulta precisam ser bem mais eficientes do que as operações de remoção. • Não é necessário que os elementos estejam ordenados. • Os elementos podem ser acessados a partir de uma chave.
Exemplo Tabela de símbolos, usada durante a compilação, para referenciar os símbolos definidos pelo programador. • Sempre que um símbolo é declarado, o compilador insere uma entrada na tabela de símbolos. • Sempre que um símbolo é utilizado, o compilador verifica se os atributos associados com aquele símbolo estão sendo usados corretamente.
Motivação Procura-se uma estrutura de dados para a qual as operações de inserção e consulta tenham performance O(1). • Lista encadeada inserção : O(1) consulta : O(n) • Lista com Array inserção : O(1) consulta : O(n) • Lista com Array ordenada inserção : O(n) consulta : O(log n) estas estruturas não satisfazem este requisito de desempenho!
Hashing Hashing: Método de pesquisa com o objetivo de melhorar a performance de busca e inclusão de chaves Metas para alcançar o objetivo: • Uso de um array: acesso direto a uma posição (O(1)) • Uso de uma função (função hash – h(ch)) que traduz um valor de chave para uma posição no array • h(ch) deve ser fácil de computar: complexidade O(1)
0 1 inscrição 1 1 2 inscrição 2 2 3 inscrição 3 3 4 inscrição 4 . . . . . . . . . M-1 M inscrição M Hashing - Exemplo Tabela Hash Exemplo: h (num inscrição) = num inscrição - 1 chave = 4 h(4) = 3 (acesso direto)
Hashing - Características Tamanho do array: M • Valor estimado: número médio de chaves • Na prática, M é menor que o número máximo possível de chaves (M < n) evitar desperdício de espaço • Exemplo: chave é código do empregado numérico com 4 dígitos • n: 0000-9999 10000 chaves possíveis • M: 2000 média de empregados na empresa
Hashing - Características Função hash: h(ch) {0, 1, ..., M - 1} • Para uma mesma chave, é produzido sempre o mesmo resultado • Como M < n, podem ocorrer colisões! • h(chx) = h(chy) = I uma colisão ocorre quando, para chaves de valores diferentes, o valor calculado pela função é o mesmo • Como minimizar colisões? • h(ch) deve gerar uma distribuição uniforme das chaves
Funções Hash • Funções hash típicas: • operam sobre o resto da divisão por M ch % M • M é um número primo poucas divisões exatas Exemplo: n = 2500 M = 1031 h(ch) = ch % M h(23) = 23 h(24) = 24 . . . h(1401) = 70 h(1402) = 71 . . . as chaves ocupam posições consecutivas no vetor
Funções Hash • Chaves grandes: • Média de chaves reais é muito menor que o máximo permitido (M << n) • Usar técnicas para reduzir o escopo {1, ..., n} {0, ..., M-1} Exemplo: • ch é o RG • no máximo 50 empregados na empresa • função hash: somar os dígitos RG: 0000000000-9999999999 0x10 a 9x10 [0, 90] h(ch) = somaDígitos(ch) % 89
Funções Hash • Chaves não-numéricas: • Aplicar duas funções: • f(ch): converte ch para uma representação numérica • g(ch): converte f(ch) para o intervalo [0, ..., M-1] • h(ch) = g(f(ch))
Chaves Não-Numéricas • Técnicas para f(ch): • Soma dos códigos numéricos dos caracteres • Exemplo: A N A S I L V A • Considera apenas alguns caracteres • Exemplo: A N A_S I L V A (multiplica 1o, 5o e 8o) f(ch) = int(A)+int(N)+ ...+int(V)+int(A) g(ch) = f(ch) mod M f(ch) = int(A).int(S).int(V), se int(ch) = ASCII(ch) máximo: 3xASCII(z) = 3x122 = 366 g(ch) = f(ch) mod 367
Hashing - Operações Inserção de elemento Exclusão de elemento Pesquisa de elemento Pesquisa das chaves de todos os elementos
Implementação - Hashing Algumas alternativas de implementação das tabelas de dispersão (Hashing) de acordo com o tratamento de colisões: • Encadeamento Externo: todas as chaves que forem mapeadas para a mesma posição estarão juntas em uma lista encadeada. • Encadeamento Interno: ocorrendo a colisão, a chave é colocada na próxima posição livre do array.
29205 23058 24179 18250 98858 56649 69031 69212 00507 39887 Encadeamento Externo A tabela de dispersão é implementada como um array de listas encadeadas. • Para inserir um elemento na tabela, coloca-se o elemento no final de alguma das listas encadeadas. • A lista encadeada na qual o elemento é colocado é determinada pela dispersão (função hash) do elemento.
Encadeamento Externo - Exemplo chave hash ( chave ) 29205 0 69212 2 18250 0 69031 1 23058 3 00507 2 24179 4 39887 2 98858 3 56649 4 hash (chave) = chave MOD 5
29205 69212 29205 Encadeamento Externo - Exemplo início entra 29205 entra 69212
69212 29205 23058 24179 18250 98858 56649 69031 18250 29205 69212 00507 39887 Encadeamento Externo - Exemplo entra 18250 tabela completa
Encadeamento Externo - Operações Complexidade Inserção de elemento O(1) Exclusão de elemento O(n) : pior caso O(n/M) : caso médio Pesquisa de elemento O(n) : pior caso O(n/M) : caso médio
Encadeamento Interno A tabela de dispersão é implementada como um vetor onde a chave que colidiu é armazenada na primeira entrada livre a partir do endereço calculado. chave hash(chave) CLAUDIA JOAO 5 0 MARIA MARIA 1 1 JORGE FERNANDO 5 2 PEDRO CLAUDIA 0 3 MARCIA 7 4 JOAO JORGE 6 5 FERNANDO PEDRO 1 6 MARCIA 7
Encadeamento Interno • Os elementos que possuem chaves sinônimas (que produzem o mesmo endereço) também são armazenados na própria tabela. não envolve o uso de encadeamento • No caso de ocorre uma colisão, procura-se em uma seqüência de posições da tabela até se encontrar a chave procurada ou uma posição não ocupada. • A forma mais simples é procurar as posições consecutivas ao endereço gerado pela função hash. • Pode-se utilizar uma outra função para calcular o incremento do novo endereço (ao invés de usar o incremento 1). • Quando o endereço produzido pela função hash está ocupado por uma chave que não é sinônimo, ocorre uma pseudo-colisão.
Encadeamento Interno - Operações Complexidade Inserção de elemento O(n) : pior caso Exclusão de elemento O(n) : pior caso Pesquisa de elemento O(n) : pior caso