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 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:

  1. a primeira hash está errada;
  2. a segunda hash está errada;
  3. 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");
  }
}

Author: Bruno Ribas

Created: 2022-03-11 Fri 09:49

Validate