📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Módulo 09: Estruturas de Dados. Recomendado revisar antes de começar.
v1.0 — Pilhas, Filas, Listas Duplamente Encadeadas e Hash Tables
Trilha de Especialização Pedagógica — Projeto 1 de 4
- ➡️ v1 (este): Estruturas Lineares · Pilhas (LIFO) · Filas (FIFO) · Listas Encadeadas · Hash Table
- v2: Árvores AVL Auto-Balanceadas & B-Trees
- v3: Grafos Ponderados & Algoritmo de Dijkstra
- v4: Programação Dinâmica & Algoritmos Gulosos
🎓 Nível Profissional Simulado: Engenheiro de Software Júnior. Saber escolher entre um
Arraye umaLinkedListou entender como umaHashTablelida com colisões em $O(1)$ é o teste técnico padrão das principais empresas de tecnologia do mundo (FAANG / Big Techs).
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.
“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.”
| 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 |
| 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 |
# Branch da funcionalidade
git checkout -b feature/US02-tabela-hash-encadeada
# Executar a biblioteca e testes
python src/estruturas_core.py
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))
No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:
cd algoritmos_01_estruturas_dados
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`
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"
A visualização arquitetural abaixo detalha a separação de responsabilidades e o fluxo de dados implementado na subpasta cli-python/:
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
| 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 |
| 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 |
| 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 |
| 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 |
| 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 ✅ |