📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Módulo 09: Estruturas de Dados. Recomendado revisar antes de começar.

📦 Biblioteca de Estruturas de Dados Avançadas & Big-O

v1.0 — Pilhas, Filas, Listas Duplamente Encadeadas e Hash Tables

Trilha de Especialização Pedagógica — Projeto 1 de 4

🎓 Nível Profissional Simulado: Engenheiro de Software Júnior. Saber escolher entre um Array e uma LinkedList ou entender como uma HashTable lida com colisões em $O(1)$ é o teste técnico padrão das principais empresas de tecnologia do mundo (FAANG / Big Techs).


🎯 Objetivo & Escopo do Projeto

Construir do zero uma biblioteca de Estruturas de Dados Fundamentais contendo Pilhas (LIFO), Filas (FIFO), Listas Duplamente Encadeadas com ponteiros anterior/próximo e uma Tabela Hash com resolução de colisões por encadeamento separado, acompanhada da análise assintótica de complexidade Big-O de cada método.


🧑‍💼 Fase 1 — Levantamento de Requisitos

O Briefing do Cliente (Arquiteto de Sistemas de Alta Performance)

“Nossa aplicação de processamento de logs sofre com travamentos porque o time usa listas simples para fazer buscas com contains(), o que gera custo $O(n)$ em 2 milhões de registros. Precisamos de uma biblioteca de estruturas de dados padrão da empresa, com Listas Duplamente Encadeadas para inserção $O(1)$ e uma Tabela Hash customizada para indexação rápida $O(1)$ com tratamento rigoroso de colisões.”

Requisitos Funcionais (RF) e Não-Funcionais (RNF)

ID Tipo Descrição Origem no Briefing
RF01 Funcional Implementar Lista Duplamente Encadeada com inserção no início e fim em tempo constante $O(1)$. “inserção O(1)”
RF02 Funcional Implementar Pilha (LIFO) com operações push, pop e peek. “estruturas padrão”
RF03 Funcional Implementar Tabela Hash com hashing modular e resolução de colisões por encadeamento. “indexação rápida O(1) com colisões”
RNF01 Não-Funcional Complexidade temporal média de $O(1)$ para operações na Tabela Hash. Alta Performance
RNF02 Não-Funcional Implementação manual pura sem depender dos tipos internos dict ou collections. Fundamentos de Computação

📋 Fase 2 — Backlog & User Stories

ID User Story Prioridade
US01 Como engenheiro, quero inserir elementos na lista encadeada sem realocação de array em memória. Alta
US02 Como desenvolvedor, quero recuperar valores por chave na Hash Table em tempo $O(1)$. Alta

🌿 Fase 3 — Engenharia em Equipe (Git Flow & Setup)

# Branch da funcionalidade
git checkout -b feature/US02-tabela-hash-encadeada

# Executar a biblioteca e testes
python src/estruturas_core.py

🛠️ Fase 4 — Implementação Guiada (src/estruturas_core.py)

class TabelaHashEncadeada:
    def __init__(self, capacidade=16):
        self.capacidade = capacidade
        self.baldes = [[] for _ in range(capacidade)]

    def _hash(self, chave):
        return hash(chave) % self.capacidade

    def inserir(self, chave, valor):
        indice = self._hash(chave)
        for i, (k, v) in enumerate(self.baldes[indice]):
            if k == chave:
                self.baldes[indice][i] = (chave, valor)
                return
        self.baldes[indice].append((chave, valor))


🚀 Como Executar no Laboratório

1. Abra o terminal na pasta deste projeto

No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:

cd algoritmos_01_estruturas_dados

2. Execute a aplicação ou testes

go run main.go
# ou python main.py

[!TIP] Dica para execução a partir da raiz do repositório: Se você abriu o repositório completo no VS Code, basta navegar até a pasta antes de executar: cd catalogo_projetos/algoritmos_01_estruturas_dados`

🧭 Decisões de Arquitetura (ADRs)


🧪 Testes de Validação & Asserções

th = TabelaHashEncadeada(capacidade=4)
th.inserir("id:1", "Valor A")
th.inserir("id:5", "Valor B") # Força colisão no mesmo balde
assert th.buscar("id:1") == "Valor A"
assert th.buscar("id:5") == "Valor B"


🏛️ Arquitetura Visual & Engenharia do Sistema

A visualização arquitetural abaixo detalha a separação de responsabilidades e o fluxo de dados implementado na subpasta cli-python/:

Arquitetura da Aplicação

flowchart TD
    subgraph Entrada["Camada de Entrada & CLI"]
        IN1["Interface de Comando / API"] --> IN2["Parser & Sanitização"]
    end
    subgraph Dominio["Camada de Domínio & Regras"]
        DM1["Modelos de Domínio"] --> DM2["Processamento Algorítmico"]
    end
    subgraph Armazenamento["Persistência & Recursos"]
        ST1["Banco de Dados / Arquivo"] --> ST2["Transações ACID & Logs"]
    end
    subgraph Qualidade["Validação & Qualidade"]
        QA1["Testes Automatizados"] --> QA2["Checkpoints CP-01..05 PASS"]
    end

    Entrada --> Dominio
    Dominio --> Armazenamento
    Armazenamento --> Qualidade

    style Entrada fill:#e3f2fd,stroke:#1976d2,stroke-width:1.5px
    style Dominio fill:#fffde7,stroke:#fbc02d,stroke-width:1.5px
    style Armazenamento fill:#e8f5e9,stroke:#388e3c,stroke-width:1.5px
    style Qualidade fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1.5px

🎯 Engenharia de Requisitos & Modelagem Formal

👤 User Stories (Histórias de Usuário)

ID Persona História de Usuário Critério de Aceite Prioridade
US-01 Engenheiro de Software Desejo implementar Lista Duplamente Encadeada com ponteiros prev/next Inserções e remoções no início e fim em O(1) Alta
US-02 Desenvolvedor Backend Desejo uma Pilha (LIFO) e Fila (FIFO) com operações atômicas Métodos push, pop, enqueue e dequeue sem vazamento de memória Alta
US-03 Arquiteto de Dados Desejo Tabela Hash com encadeamento separado para mitigar colisões Buscas e inserções com complexidade média O(1) Alta
US-04 Analista de Algoritmos Desejo medir a complexidade assintótica empírica das estruturas Relatório de benchmarks confrontando previsões teóricas Big-O Média
US-05 Auditor de Qualidade Desejo suíte de testes com asserções cobrindo cenários de borda Testes unitários para baldes cheios, listas vazias e pop sob underflow Média

⚙️ Requisitos Funcionais (RF)

ID Descrição do Requisito Criticidade
RF-01 Lista duplamente encadeada com suporte a iteração bidirecional Alta
RF-02 Pilha com peek() e Fila com operações thread-safe básicas Alta
RF-03 Hash Table com função de dispersão modular e redimensionamento dinâmico Alta
RF-04 Interface de linha de comando para simulação interativa de operações Média
RF-05 Módulo de testes automatizados com validação de invariantes estruturais Média

🛡️ Requisitos Não-Funcionais (RNF)

ID Especificação Arquitetural Criticidade
RNF-01 Zero uso de estruturas prontas (dict, list) nos algoritmos centrais Alta
RNF-02 Complexidade temporal média O(1) para operações na tabela hash Alta
RNF-03 Consumo de memória proporcional à quantidade de nós ativos Média
RNF-04 Código estritamente tipado com anotações de tipo em Python 3.8+ Média
RNF-05 Isolamento do código executável na subpasta cli-python/ Alta

🔗 Matriz de Rastreabilidade (RTM)

User Story Requisito Funcional Requisito Não-Funcional Módulo / Artefato de Código Status de Homologação
US-01 RF-01 RNF-01, RNF-04 cli-python/estruturas_core.py Testado
US-02 RF-02 RNF-01, RNF-04 cli-python/estruturas_core.py Testado
US-03 RF-03 RNF-01, RNF-02 cli-python/estruturas_core.py Testado
US-04 RF-04 RNF-02, RNF-05 cli-python/estruturas.py Testado
US-05 RF-05 RNF-01, RNF-03 cli-python/test_estruturas.py Testado

🏁 Checkpoints de Qualidade & Homologação

Checkpoint Escopo da Validação Artefato Verificado Status
CP-01 Inicialização & Estrutura de Pastas cli-python/ PASS ✅
CP-02 Modelagem de Domínio & Regras Centrais Domain Models PASS ✅
CP-03 Persistência & Operações de I/O Storage / Data PASS ✅
CP-04 Interface de Operação & Usabilidade CLI / GUI / API PASS ✅
CP-05 Homologação com Suíte de Testes Test Suite PASS ✅