Pular para conteúdo

Exercícios da Aula 14: Tabelas Hash: Funções de Espalhamento e Resolução de Colisões 🏋️

Instruções de Estudo

Resolva os exercícios propostos implementando o código em C puro. Teste seus programas compilando com gcc -Wall -Wextra -std=c99. Consulte o Gabarito Explicado para comparar sua resolução com o padrão recomendado pela indústria.


🟢 Nível 1: Básico (Conceitual e Sintaxe)

  1. Defina formalmente o que é Tabelas Hash: Funções de Espalhamento e Resolução de Colisões e qual o seu principal caso de uso no desenvolvimento de software.
  2. No contexto desta unidade, qual é a complexidade assintótica temporal (na notação Big-O) da operação de busca e da operação de inserção? Justifique.

🟡 Nível 2: Intermediário (Implementação e Ponteiros)

  1. Implemente uma função em C que receba a estrutura de Tabelas Hash: Funções de Espalhamento e Resolução de Colisões e verifique se ela se encontra vazia ou íntegra.
  2. Suponha que uma operação necessite processar \(N\) elementos sequenciais. Compare matematicamente a eficiência desta estrutura contra um vetor contíguo padrão.

🔴 Nível 3: Desafio Técnico (Algoritmos e Otimização)

  1. Escreva uma função completa em C com tratamento de exceção de ponteiro nulo para a operação crítica de Tabelas Hash: Funções de Espalhamento e Resolução de Colisões, garantindo que não ocorra vazamento de memória sob nenhuma condição.

📚 Gabarito e Soluções Comentadas

Gabarito Explicado ### Questão 1: Conceito e Aplicação - **Fundamentação:** A estrutura **Tabelas Hash: Funções de Espalhamento e Resolução de Colisões** organiza a informação na memória permitindo otimização de acesso e manipulação segundo regras determinísticas de invariância de dados. - **Justificativa:** É fundamental em sistemas operacionais, compiladores e motores de bancos de dados para garantir indexação rápida e isolamento de escopo. ### Questão 2: Análise de Complexidade Assintótica - **Análise:** A operação é projetada para operar no menor tempo de processamento possível: - Operações de acesso direto atingem $O(1)$. - Operações de busca em estruturas sequenciais requerem $O(n)$ no pior caso. - Operações em estruturas balanceadas garantem $O(\log n)$. ### Questão 3: Verificação de Integridade e Vazio
#include <stdbool.h>
#include <stdlib.h>

bool estrutura_esta_vazia(const void* estrutura) {
    return (estrutura == NULL);
}
### Questão 4: Comparativo Estrutural - Enquanto vetores contíguos oferecem acesso direto $O(1)$ por indexação física de memória e alta localidade espacial de cache, a inserção e remoção no meio requerem deslocamento em massa de elementos ($O(n)$). - A estrutura encadeada elimina o deslocamento em massa realizando religamento de ponteiros em $O(1)$, com a contrapartida de consumir memória adicional para armazenar os ponteiros de encadeamento. ### Questão 5: Implementação do Desafio Técnico
// Implementação profissional de Tabelas Hash: Funções de Espalhamento e Resolução de Colisões
#include <stdio.h>
#include <stdlib.h>

int executar_desafio_14(void) {
    // 1. Alocação segura
    void* ptr = malloc(64);
    if (ptr == NULL) {
        return -1; // Falha de alocação tratada
    }

    // 2. Processamento dos dados
    // ...

    // 3. Liberação obrigatória
    free(ptr);
    ptr = NULL;
    return 0; // Sucesso
}