Tabelas Hash
Transcrição
Tabelas Hash
Tabelas Hash & Outras Estruturas Prof. MSc. João Ricardo Bittencourt Algoritmos e Estrutura de Dados em C++ Desenvolvimento de Jogos & Entretenimento Digital UNISINOS Sumário 1. 2. 3. 4. 5. Conceito de hashing Comparação de complexidade Usando STL e tabelas hash Set & Multiset Map & Multimap Vector & Deque Exercícios Conceito de Hashing “Que tal efetuar buscas rapidamente sem precisar percorrer toda a estrutura de dados?” Seus problemas acabaram, agora você pode usar a Super Hyper Hashing Table :-P A idéia é cada dado (ou estrutura) ser capaz de gerar um código idealmente único. E usarmos este código para fazer a indexação. Recurso extremamente usado em banco de dados. Ótimo recurso para ser usado em games!! Conceito de Hashing Conceito Chave FUNÇÃO DE HASHING! Cada dado/estrutura deve possuir uma função de hash que gere um número preferencialmente único! 0 1 2 3 4 5 6 7 f(x) = (x mod 12) Função de hashing 8 9 10 11 Conceito de Hashing Conceito Chave FUNÇÃO DE HASHING! Cada dado/estrutura deve possuir uma função de hash que gere um número preferencialmente único! 0 1 2 3 4 5 6 7 x=232 f(x)=4 f(x) = (x mod 12) Função de hashing 8 9 10 11 Conceito de Hashing Conceito Chave FUNÇÃO DE HASHING! Cada dado/estrutura deve possuir uma função de hash que gere um número preferencialmente único! 0 1 2 232 3 4 5 6 7 x=232 f(x)=4 f(x) = (x mod 12) Função de hashing 8 9 10 11 Conceito de Hashing Conceito Chave FUNÇÃO DE HASHING! Cada dado/estrutura deve possuir uma função de hash que gere um número preferencialmente único! 0 1 2 232 3 4 5 6 7 x=969 f(x)=9 f(x) = (x mod 12) Função de hashing 969 8 9 10 11 Conceito de Hashing Conceito Chave FUNÇÃO DE HASHING! Cada dado/estrutura deve possuir uma função de hash que gere um número preferencialmente único! 0 1 2 232 3 4 5 6 7 969 8 9 10 11 x=1024 f(x)=4 ??? f(x) = (x mod 12) Função de hashing Conceito de Hashing Conceito Chave FUNÇÃO DE HASHING! Cada dado/estrutura deve possuir uma função de hash que gere um número preferencialmente único! 1024 232 969 0 1 2 3 4 5 6 7 8 9 10 11 x=1024 f(x)=4 Vai para uma lista f(x) = (x mod 12) Função de hashing Comparação de Complexidade Para busca Melhor Caso Caso Médio Pior Caso Pilha O(1) O(n/2) O(n) Fila O(1) O(n/2) O(n) Lista O(1) O(n/2) O(n) Hash O(1) O(n/k) O(log n) Sendo k o número de posições no vetor Dependendo da qualidade da função de hashing teremos uma complexidade na busca muito próxima de O(1) Usando STL e tabelas Hash Na STL são chamados de contêiners associativos Conjuntos Multiset - o próprio valor é a chave, permite duplicações Set – o próprio valor é a chave, sem duplicata Valores mapeados Multimap - associa uma chave ao valor, permite duplicações Map – associa uma chave ao valor, sem duplicata Usando STL e tabelas Hash 81 101 81 745 32 75 71 99 101 71 81 745 32 75 99 71 Multiset “A” “K” “B” Multimap Set 32 71 75 81 99 745 “A” “C” “H” “K” “L” “B” Map 32 71 75 81 99 745 Operações com Multiset Inserir elemento no conjunto - insert Remover elemento do conjunto- erase Encontrar elemento no conjunto- find Verificar se o conjunto está vazio - empty Verificar o tamanho do conjunto- size Obter a primeira ocorrência e a posição após a última ocorrência de um elemento no conjunto lower_bound upper_bound Operações com Set Inserir elemento no conjunto - insert Remover elemento do conjunto- erase Encontrar elemento no conjunto- find Verificar se o conjunto está vazio - empty Verificar o tamanho do conjunto- size Demonstração Operações com Multimap Inserir elemento no conjunto - insert Remover elemento do conjunto- erase Encontrar elemento no conjunto- find Verificar se o conjunto está vazio - empty Verificar o tamanho do conjunto- size Obter a primeira ocorrência e a posição após a última ocorrência de um elemento no conjunto lower_bound upper_bound Operações com Map Inserir elemento no conjunto - insert Remover elemento do conjunto- erase Encontrar elemento no conjunto- find Verificar se o conjunto está vazio - empty Verificar o tamanho do conjunto- size Acesso ao elemento do map mapa[chave] = valor Demonstração Vector O mesmo princípio dos vetores “brutos” do C++ Acesso aleatório através de subscrito – vetor[n] Entretanto faz todo o processo de redimensionamento de forma automática Faz a inserção (push_back) e a remoção (pop_back) no final Dá acesso ao início (front) e final (back) da estrutura Faz uso de iteradores Deque Combinação de um vector com uma list Pronuncia-se “deek” - “double-end queue” Acesso aleatório através de subscrito – vetor[n] Faz uso de iteradores Permite inserção/remoção no início e no final da estrutura (push_front/pop_front/push_back/pop_back) Dá acesso ao início (front) e final (back) da estrutura Demonstração