Estrutura de Dados II - 2021-1
UnB-\(\gamma\)
Table of Contents
- 1. HASH Introdução
- 1.1. Exercícios
- 1.1.1. Veja o material sobre hash do Prof. Paulo Feofiloff
- 1.1.2. Você consegue aplicar as ideias de HASH nos exercícios
Remoção
eSanidade
? - 1.1.3. Você consegue aplicar as ideias de HASH no exercício
Eleição U.R.S.A.L
? - 1.1.4. Considere as técnicas de busca sequencial, busca binária e busca baseada em hashing:
- 1.1.5. Sobre Tabelas HASH:
- 1.1.6. Resolva os exerícios DESTA PROVA hot
- 1.1. Exercícios
- 2. Material Adicional
- 2.1. Exercícios
- 2.1.1. Você consegue aplicar os conhecimentos, adquiridos pelos vídeos acima, no problema
Desfile dos Patos
(em nossa segunda lista de presença). - 2.1.2. Imagine que você tenha um bug em sua implementação de tabela hash utilizando hash-dupla (double-hashing) de tal forma que a primeira ou a segunda função de hash retornam sempre o mesmo valor (porém diferente de \(0\)). Descreva o que ocorre (exemplo: os custos de inserção e busca permanecem o esperado?) quando:
- 2.1.3. Resolva o exerício HASHIT da lista de HASH no CD-MOJ
- 2.1.4. Resolva o exercício Desfile dos Patos com o seguinte algoritmo
- 2.1.1. Você consegue aplicar os conhecimentos, adquiridos pelos vídeos acima, no problema
- 2.1. Exercícios
- 3. Número Proibido em HashTable
1. HASH Introdução
1.1. Exercícios
1.1.1. Veja o material sobre hash do Prof. Paulo Feofiloff
1.1.2. Você consegue aplicar as ideias de HASH nos exercícios Remoção
e Sanidade
?
1.1.3. Você consegue aplicar as ideias de HASH no exercício Eleição U.R.S.A.L
?
1.1.4. Considere as técnicas de busca sequencial, busca binária e busca baseada em hashing:
- Descreva as vantagens e desvantagens de cada uma dessas técnicas, indicando em que situações você usaria cada uma delas.
- Qual é a eficiência de utilização da memória (relação entre o espaço necessário para dados e o espeço total necessário) para cada método?
1.1.5. Sobre Tabelas HASH:
- É possível criar uma função HASH em que é garantido que nunca haverá colisão? Porquê?
- Quando existe colisão, quais estratégias podem ser utilizadas para contornad esse problema? Quando cada estratégia é melhor utilizada?
1.1.6. Resolva os exerícios DESTA PROVA hot
2. Material Adicional
2.1. Exercícios
2.1.1. Você consegue aplicar os conhecimentos, adquiridos pelos vídeos acima, no problema Desfile dos Patos
(em nossa segunda lista de presença).
2.1.2. Imagine que você tenha um bug em sua implementação de tabela hash utilizando hash-dupla (double-hashing) de tal forma que a primeira ou a segunda função de hash retornam sempre o mesmo valor (porém diferente de \(0\)). Descreva o que ocorre (exemplo: os custos de inserção e busca permanecem o esperado?) quando:
- a primeira hash está errada;
- a segunda hash está errada;
- ambas funções hash estão erradas.
2.1.3. Resolva o exerício HASHIT da lista de HASH no CD-MOJ
Veja a discussão deste exercício com o Monitor Felipe Borges
2.1.4. Resolva o exercício Desfile dos Patos com o seguinte algoritmo
3. Número Proibido em HashTable
#include <stdio.h> #include <stdlib.h> //HT = HashTable = Tabela Hash // para um vetor o intervalo fechado é [0,262143] #define HTSIZE 140000 #define HTNULL -1 typedef struct no { int Pi; struct no *prox; } no; typedef struct lista_st { no *head; int count; } lista_st; void LEinit(lista_st *lista) { lista->head=NULL; lista->count=0; } void LEinsert(lista_st *lista, int Pi) { no *l=malloc(sizeof(no)); l->Pi=Pi; l->prox=lista->head; lista->head=l; lista->count++; } int LEsearch(lista_st *lista,int x) { no *aux=lista->head; while(aux!=NULL) { if(aux->Pi==x) return 1; aux=aux->prox; } return 0; } typedef struct HT_st { lista_st *ht; int count; } HT_st; int hash(int Pi) { return Pi%HTSIZE; } void HTinit(HT_st *HT) { HT->ht=malloc(sizeof(lista_st)*HTSIZE); HT->count=0; //elemento vazio da tabela hash será o -1 for(int i=0;i<HTSIZE;i++) LEinit(&HT->ht[i]); } void HTinsert(HT_st *HT,int x) { int hashv=hash(x); LEinsert(&HT->ht[hashv],x); HT->count++; } int HTsearch(HT_st *HT, int x) { int hashv=hash(x); return LEsearch(&HT->ht[hashv],x); } int main(void) { HT_st hashtable; HTinit(&hashtable); //Os números proibidos variam entre [0,2^31] int N; scanf("%d",&N); for(int i=0;i<N;i++) { int Pi; scanf("%d",&Pi); HTinsert(&hashtable,Pi); } #if 0 for(int i=0;i<HTSIZE;i++) if(hashtable.ht[i].count>=2) printf("Colisao em %d, temos %d elementos\n",i,hashtable.ht[i].count); #endif int pergunta; while(scanf("%d",&pergunta)==1) { if(HTsearch(&hashtable,pergunta)) printf("sim\n"); else printf("nao\n"); } }