Loading repository data…
Loading repository data…
Vitor-Carmo / repository
Implementação completa de Estruturas de Dados e Algoritmos em Java. De lógica fundamental e ordenação O(nlogn) a estruturas não-lineares como Árvores BST e Grafos aplicados a Business Intelligence. Inclui projeto final de gestão logística com Matriz de Adjacência.
Este repositório documenta minha trajetória completa no curso de Algoritmos e Estrutura de Dados, culminando em um sistema de gestão de pizzaria que utiliza conceitos avançados de computação para otimizar processos de venda, logística e análise de dados.
Nesta fase inicial, foquei na base sólida da linguagem Java e manipulação de dados simples.
System.for/while) e condicionais aplicados.ArrayList.Stock, métodos de atualização e gerenciamento de listas.Nesta etapa, o foco foi a implementação de estruturas clássicas e a manipulação eficiente de dados utilizando coleções avançadas do Java.
| Algoritmo / Estrutura | Operação | Complexidade de Tempo |
|---|---|---|
| Quick Sort | Ordenação | $O(n \log n)$ (médio) |
| Binary Search | Busca | $O(\log n)$ |
| HashMap | Inserção/Busca | $O(1)$ |
| Stack/Queue | Push/Pop/Add | $O(1)$ |
| ArrayList | Acesso por índice | $O(1)$ |
Um exemplo clássico de como pilhas são essenciais para compiladores e análise de sintaxe:
// Trecho simplificado do Ex4
for (Character character : expression.toCharArray()) {
if (character == '(') stack.push(character);
else if (character == ')') {
if (stack.isEmpty()) return false;
stack.pop();
}
}
Implementação de particionamento para garantir performance em grandes volumes de dados:
private static int partition(ArrayList<Integer> arr, int low, int high) {
int pivot = arr.get(high);
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr.get(j) > pivot) { // Ordenação decrescente
i++;
swap(arr, i, j);
}
}
swap(arr, i + 1, high);
return i + 1;
}
Nesta etapa, o foco mudou para estruturas de dados hierárquicas e relacionais, explorando a eficiência da busca binária e a complexidade dos grafos.
Implementação de estruturas de dados hierárquicas para otimização de buscas e organização de dados.
findMin) utilizando a lógica de que o menor valor sempre estará na extremidade esquerda.Exploração de conexões entre vértices e busca de caminhos otimizados.
Queue.Set para controle de nós visitados.PriorityQueue para garantir a melhor performance.Exemplo de uso de recursividade para garantir a integridade da estrutura, um dos pontos fortes destacados no meu feedback:
private boolean isBST(Node node, int min, int max) {
if (node == null) return true;
// O valor do nó deve estar estritamente dentro do intervalo permitido
if (node.value <= min || node.value >= max) return false;
// Verifica recursivamente as subárvores esquerda e direita atualizando os limites
return isBST(node.left, min, node.value) &&
isBST(node.right, node.value, max);
}
Lógica para encontrar o caminho entre dois nós, utilizando uma fila e um mapa de "parents" para reconstruir a rota:
while (!queue.isEmpty()) {
int current = queue.poll();
if (current == to) break;
for (Integer neighbor : adj.get(current)) {
if (!visited.contains(neighbor)) {
visited.add(neighbor);
parent.put(neighbor, current);
queue.add(neighbor);
}
}
}
Aplicação direta das propriedades da árvore para busca eficiente:
int findMin(Node node) {
// Em uma BST, o menor valor está sempre no nó mais à esquerda
return node.left == null ? node.value : findMin(node.left);
}
A avaliação destacou minha segurança técnica e a capacidade de equilibrar a explicação de conceitos complexos com clareza didática.
O ápice da trajetória. Transformei um sistema de gestão de pedidos em uma ferramenta de Business Intelligence (BI), utilizando Grafos para mapear o comportamento de consumo e otimizar a logística.
A grande joia do projeto. Em vez de um relatório simples, utilizei a Teoria dos Grafos para mapear o comportamento do consumidor.
Implementação de um cálculo de frete dinâmico que considera duas variáveis críticas:
O método alterarPedido foi estruturado para ser robusto e flexível:
Este trecho demonstra como a lógica de grafos é aplicada para fortalecer as conexões entre sabores na matriz de adjacência:
// Dentro da geração do relatório de BI
for (int i = 0; i < saboresNoPedido.size(); i++) {
for (int j = i + 1; j < saboresNoPedido.size(); j++) {
int idx1 = buscarIndiceSabor(saboresNoPedido.get(i));
int idx2 = buscarIndiceSabor(saboresNoPedido.get(j));
// Incrementa o peso da ligação entre os dois sabores (Grafo Não-Direcionado)
matrizAdjacencia[idx1][idx2]++;
matrizAdjacencia[idx2][idx1]++;
}
}
Uma regra de negócio clara e bem implementada:
public double calcularFrete(double km, int quantidadePizzas) {
double taxaPorKm = 2.50;
double taxaPorPizza = 1.00;
return (km * taxaPorKm) + (quantidadePizzas * taxaPorPizza);
}
O projeto final consolidou a percepção de maturidade técnica e visão de negócio.
| Unidade | Foco Principal | Estruturas Implementadas |
|---|---|---|
| 01 | Lógica e Ordenação | Arrays, Condicionais e Loops. |
| 02 | Estruturas Lineares | Stacks, Queues e o algoritmo QuickSort. |
| 03 | Estruturas Não-Lineares | BST (Árvore Binária de Busca) e percursos recursivos. |
| 04 | Projeto Integrador | Grafos, Mapas de Adjacência e Regras de Negócio. |
Durante as avaliações, o projeto recebeu feedbacks extremamente positivos, destacando:
"Vitor demonstrou domínio sólido... conseguiu equilibrar explicação técnica com clareza didática. O uso de Grafos para ligar sabores demonstra entendimento real da estrutura de dados e aplicação prática do conceito." 🚀
Pontos Fortes destacados: