Disciplina do curso de Engenharia de Software da PUC Minas
- 1°Sem 2025
- 2°Sem 2025
- Aulas em PDF
- Artigos sugeridos
- Cheat Sheets
- Listas de revisão
- Exercícios em Python
- Exemplos em Python
- Projetos em Python
- Trabalhos para entregar
- Plano de Ensino
- 📕 Algorithm Design – Jon Kleinberg & Éva Tardos (2005)
- 📘 The Algorithm Design Manual – Steven S. Skiena (2008)
- 📒 Introduction to Algorithms: A Creative Approach – Udi Manber (1989)
- 📕 Algoritmos – Thomas H. Cormen (2024)
- 📗 Algorithms – Robert Sedgewick (2011)
- 📙 Algorithms in a Nutshell – George Heineman (2016)
- 📒 Algorithms Illuminated (Volume 1) – Tim Roughgarden (2018)
- 📓 Algorithms (free PDF) – Jeff Erickson (2020)
- 📘 Problemas Clássicos de Ciência da Computação com Python – David Kopec (2019)
- 📒 Pense em Python: Como Cientista da Computação – Allen B. Downey (2016)
- 📙 Python Fluente: Programação Concisa e Eficaz – Luciano Ramalho (2015)
- 📔 Python Distilled – David Beazley (2021)
- 📗 Effective Python: 90 Specific Ways to Write Better Python – Brett Slatkin (2ª ed., 2020)
- 📕 Data Structures and Algorithms in Python – Michael T. Goodrich, Roberto Tamassia, Michael H. Goldwasser (2013)
- 📗 Backtracking Algorithms for the Day Before Your Coding Interview – Aditya Chatterjee, Ue Kiao (2022)
- 📙 Cracking the Coding Interview – Gayle Laakmann McDowell (2015)
- 📕 Elements of Programming Interviews – Adnan Aziz, Tsung-Hsien Lee, Amit Prakash (2015)
- 📘 Programming Interviews Exposed: Secrets to Landing Your Next Job – John Mongan, Noah Suojanen Kindler, Eric Giguère (2012)
- PyCharm
- JetBrains para estudantes
- Licenças JetBrains gratuitas via GitHub Student Developer Pack
- GitHub Student Developer Pack
⬇️ Veja o passo a passo de como obter o GitHub Student Developer Pack
Ao se cadastrar no GitHub Student Developer Pack, você garante acesso gratuito à versão profissional das ferramentas da JetBrains, como o PyCharm Professional 🧠💻. Essa é uma excelente oportunidade para utilizar recursos avançados de desenvolvimento, como depuração visual, análise de código, suporte a frameworks e muito mais — tudo sem custo para estudantes! 🚀
1️⃣ Adicione seu e-mail institucional da PUC Minas (terminado em @sga.pucminas.br
) como e-mail secundário na sua conta do GitHub em https://github.com/settings/emails
2️⃣ Acesse a caixa de entrada do e-mail e clique no link de confirmação enviado pelo GitHub.
3️⃣ Ao acessar o GitHub Student Developer Pack, permita que o navegador compartilhe sua localização atual 🌍.
4️⃣ Selecione "PUC Minas" como sua instituição, envie um print da sua carteirinha digital do app PUC Mobile ou um comprovante de matrícula recente como forma de verificação. Depois, aguarde até 2 dias úteis para que o selo GitHub Pro 🏅 seja ativado na sua conta.
5️⃣ Acesse: https://www.jetbrains.com/shop/eform/students
➡ Vá até a aba GitHub e clique em "Authorize with GitHub" 🔑.
6️⃣ Instale o PyCharm e, ao abrir o programa, vá em "Ativar licença". Escolha a opção "Log in with GitHub", faça login com sua conta GitHub (que já possui o selo GitHub Pro 🏅 e que você autorizou previamente no site da JetBrains — passo 5), e a licença Professional será ativada automaticamente 🎉.
🏁 Pronto! Agora você pode aproveitar todos os benefícios do GitHub Pro 🏅, incluindo:
- Acesso gratuito às ferramentas profissionais da JetBrains, como o PyCharm Professional 🧠💻
- GitHub Copilot com sugestões inteligentes de código (com testes gratuitos por tempo limitado) 🤖
- Repositórios privados ilimitados 🔒
- Insights avançados de contribuições, métricas e estatísticas dos seus projetos 📊
- Ferramentas de CI/CD integradas com GitHub Actions ⚙️
- Integrações com dezenas de serviços e ferramentas educacionais 🧩
Esses recursos ajudam a elevar seu aprendizado, organizar seus projetos e turbinar sua produtividade como desenvolvedor 💼🚀
🔗 Confira todos os detalhes do plano GitHub Pro para estudantes aqui:
- Python Tutor - Página principal
- Python Tutor - Python Compiler
Permite visualizar graficamente a execução passo a passo do código, mostrando como as variáveis, pilha de chamadas na memória e estruturas de dados evoluem ao longo da execução.
- Programiz - Compilador Online para Python
Ideal para quem não está com o ambiente configurado no VS Code ou PyCharm.
- Algorithm Visualizer - Website
- Algorithm Visualizer - GitHub
Projeto open source que oferece visualização passo a passo de vários algoritmos clássicos para facilitar o aprendizado.
- Big-O Cheat Sheet - Página principal
- Big-O Cheat Sheet - PDF
Um resumo rápido e visual das principais notações de complexidade de algoritmos (tempo e espaço), com exemplos comuns para ajudar na análise de desempenho.
- Recursion Cheat Sheet - Visualgo
Guia que explica os conceitos, exemplos e padrões de recursão, um paradigma fundamental para diversos algoritmos.
- Sound of Sorting - SoS - CheatSheet Um resumo visual dos principais algoritmos de ordenação, ilustrando seus passos, comparações e trocas de forma clara e didática, facilitando o entendimento do funcionamento interno de cada algoritmo.
- Sorting Algorithms Cheat Sheet - Interview Cake
Um resumo visual e prático dos principais algoritmos de ordenação, incluindo suas complexidades de tempo no melhor, médio e pior caso, além de características como estabilidade, memória usada e estratégias básicas.
- Data Structures Cheat Sheet - Tel Aviv University
Resumo abrangente com estruturas como árvores, heaps, hashing, union-find, algoritmos de ordenação e seleção, além de conceitos fundamentais como ordens de crescimento e análise amortizada. Ideal para revisão rápida e aprofundamento teórico. - Data Structures Cheat Sheet - Rice University
Tabela comparativa com as operações mais comuns em estruturas como Array, List, LinkedList, Stack, Queue e Dictionary. Inclui as complexidades de inserção, remoção, acesso e busca, ajudando a escolher a estrutura ideal para cada situação.
- States-based models with search optimization and MDP - Stanford University
Um guia compacto sobre modelos baseados em estados, incluindo técnicas de otimização de busca (search) e processos decisórios Markovianos (MDP), essenciais para inteligência artificial e aprendizado por reforço.
- CS 106B Section 8 - Graphs Cheat Sheet - Stanford University
Resumo prático com terminologias fundamentais de grafos e os algoritmos de busca mais usados, como busca em largura (BFS) e busca em profundidade (DFS). Inclui também problemas recomendados para praticar os conceitos.
- PyGMO - Página principal
- PyGMO - Documentação
- Travelling Salesman Problem with PyGMO - GitHub
Biblioteca para otimização global e metaheurísticas, útil para resolver problemas complexos como o Caixeiro Viajante com algoritmos evolutivos.
- PyGame - Página principal
- PyGame - Documentação
- Sudoku GUI Solver & Game in Python (Backtracking) - GitHub
Framework para desenvolvimento de jogos 2D em Python, excelente para criar visualizações interativas de algoritmos.
- PyAlgoViz
Biblioteca focada em visualização animada de algoritmos, especialmente de ordenação e busca, para fins educacionais.
- NetworkX - Página oficial
- NetworkX - Documentação
Biblioteca para criação, manipulação e análise de grafos e redes, facilitando a implementação e visualização de algoritmos de grafos.
- timeit - Documentação oficial
Módulo para medir o tempo de execução de pequenos trechos de código, essencial para análise experimental de algoritmos.
- cProfile - Documentação oficial
Ferramentas para profiling de código Python, permitindo identificar gargalos de desempenho em implementações.
- Graphviz - Site oficial
- PyGraphviz - GitHub
Ferramentas para criação e visualização de grafos e diagramas estruturados, úteis para representar grafos, árvores e fluxogramas.
Esta lista reúne artigos clássicos e essenciais para compreender a análise de algoritmos, incluindo fundamentos teóricos, complexidade computacional, paradigmas de projeto, estruturas de dados e algoritmos randômicos.
-
Alan Turing – "On Computable Numbers, with an Application to the Entscheidungsproblem" (1936)
- Origem da máquina de Turing e da noção de computabilidade.
- Trabalho seminal que fundamenta toda a teoria da computação.
-
Alan Turing – "Computing Machinery and Intelligence" (1950)
- Propõe o "Teste de Turing" e discute a possibilidade de máquinas pensarem.
- Marco inicial na inteligência artificial.
-
Stephen Cook – "The Complexity of Theorem-Proving Procedures" (1971)
- Introduz o conceito de NP-completude, base da teoria da complexidade.
- Fundamenta a distinção entre problemas eficientes e intratáveis.
-
Edsger Dijkstra – "A Note on Two Problems in Connexion with Graphs" (1959)
- Introduz o algoritmo de caminhos mínimos em grafos (algoritmo de Dijkstra).
- Artigo clássico e fundamental para grafos e otimização.
-
Robert Floyd – "Algorithm 97: Shortest Path" (1962)
- Introduz o algoritmo de Floyd-Warshall para encontrar caminhos mínimos entre todos os pares de vértices.
-
Anatolii Karatsuba & Yu. Ofman – "Multiplication of Multidigit Numbers on Automata" (1962)
- Primeiro algoritmo de multiplicação de números grandes com complexidade subquadrática (Karatsuba).
-
Richard Bellman – "Dynamic Programming" (1957)
-
Artigo fundacional do paradigma de programação dinâmica.
-
Também autor do livro Dynamic Programming (1972), que expande e consolida a teoria.
-
7.1 Richard Bellman – "Dynamic Programming" (1957, RAND Paper P-392)
- Artigo curto 10 páginas que introduz o paradigma de programação dinâmica.
- Enfatiza a ideia de decompor problemas em subproblemas sobrepostos.
- Publicado originalmente como um relatório técnico da RAND Corporation.
-
7.2 Richard Bellman – Dynamic Programming (Livro, 1972 – Sixth Printing, Princeton University Press)
- Versão expandida e consolidada da teoria com aplicações matemáticas, físicas e econômicas.
- Contém 365 páginas na edição de 1972 (Sexta impressão).
- Uma das obras mais citadas sobre o tema na literatura científica.
-
-
Richard Karp – "Reducibility Among Combinatorial Problems" (1972)
- Lista os primeiros 21 problemas NP-completos, formalizando a teoria da NP-completude.
- Artigo fundamental para o estudo da complexidade computacional e algoritmos.
-
Leonid Levin – "Universal Sequential Search Problems" (1973)
- Publicado originalmente em russo como "Universal’nye perebornye zadachi" na revista Problemy Peredachi Informatsii, vol. 9, nº 3.
- Artigo independente, publicado quase simultaneamente ao de Stephen Cook, que introduz formalmente a noção de problemas de busca NP-completos.
- Levin define seis problemas universais que capturam a dificuldade intrínseca dos problemas em NP.
- Reconhecido como co-descobridor da teoria da NP-completude.
-
Michael Sipser – Introduction to the Theory of Computation (Primeira edição: 1996; Terceira edição: 2012)
- Livro didático referência para teoria da computação, complexidade computacional e automatos.
- Aborda detalhadamente classes de problemas como P, NP, NP-completos e problemas indecidíveis.
- Muito utilizado em cursos de graduação e pós-graduação como base teórica para análise de algoritmos e teoria da complexidade.
- Livro na Amazon
-
Cormen, Leiserson, Rivest, Stein – Introduction to Algorithms (Primeira edição: 1990; Quarta edição: 2024)
- Livro referência para design e análise de algoritmos, cobrindo uma ampla gama de tópicos e paradigmas.
- Fundamental para estudantes de engenharia de software e ciência da computação.
- Livro na Amazon
-
Kenneth H. Rosen – Discrete Mathematics and Its Applications (8º edição: 2018)
- Um dos livros mais utilizados em cursos de matemática discreta para ciência da computação e engenharia.
- Abrange lógica, conjuntos, relações, grafos, combinatória e apresenta bons capítulos sobre algoritmos gulosos e programação dinâmica.
- Livro na Amazon
-
Donald Knuth – The Art of Computer Programming (Volumes publicados a partir de 1968)
-
Série clássica que compila algoritmos e análise formal detalhada.
-
Referência essencial para aprofundamento teórico e histórico.
-
13.1 Livro – The Art of Computer Programming
- Primeira edição publicada em 1968.
- Volumes sucessivos abrangem análise de algoritmos, estruturas de dados, técnicas avançadas, e mais.
- Boxed Set na Amazon
-
13.2 Donald Knuth – Tese: Finite Semifields and Projective Planes (1963)
- Tese de doutorado que contribui para matemática discreta e teoria dos planos projetivos.
-
-
Michael Rabin – "Probabilistic Algorithm for Testing Primality" (1980)
- Primeiro algoritmo probabilístico eficiente para teste de primalidade.
- Abre caminho para a utilização de aleatoriedade na construção de algoritmos rápidos.
-
Rajeev Motwani & Prabhakar Raghavan – Randomized Algorithms (Primeira edição: 1995)
- Livro que compila diversos algoritmos randômicos com fundamentação teórica rigorosa.
- Amplamente usado em cursos avançados de algoritmos.
- Livro na Amazon
-
Robert Tarjan – "Efficiency of a Good But Not Linear Set Union Algorithm" (1975)
- Introduz melhorias no algoritmo Union-Find, fundamentais para muitas aplicações em grafos.
- Combina técnicas de path compression e union by rank para eficiência quase linear.
-
Michael L. Fredman & Robert E. Tarjan – "Fibonacci Heaps and Their Uses in Improved Network Optimization Algorithms" (1987)
- Estrutura de dados avançada que melhora complexidade de operações em heaps.
- Aplicações em algoritmos de otimização de redes e grafos.
-
Jon Bentley – Programming Pearls (1986)
-
Série clássica sobre design e implementação prática de algoritmos.
-
18.1 Livro – Programming Pearls (1986)
- Coleção expandida de colunas originalmente publicadas na Communications of the ACM.
- Explora problemas reais, otimização e clareza de código em situações do cotidiano.
- Muito citado por engenheiros de software e usado em entrevistas técnicas.
- Livro na Amazon
-
18.2 Artigo – "Programming Pearls: Little Languages" (1986)
- Um dos artigos originais da série, publicado na Communications of the ACM.
- Foca em "linguagens pequenas" (little languages) como ferramentas poderosas para resolver problemas específicos.
- Documento curto de 11 páginas, frequentemente citado como inspiração para soluções elegantes.
-
-
Leslie Valiant – "A Theory of the Learnable" (1984)
- Introduz o modelo PAC (Provably Approximately Correct) para aprendizagem computacional.
- Importante conexão entre algoritmos, teoria da complexidade e inteligência artificial.
-
Shafi Goldwasser & Silvio Micali – "Probabilistic Encryption" (1984)
- Trabalho seminal na criptografia moderna, utilizando conceitos de complexidade computacional.
- Define a segurança semântica e o uso de algoritmos probabilísticos para encriptação.
- 2012 até 2016 - prakhar1989 - Algorithms (GitHub)
Coleção bem organizada de implementações em Python para algoritmos clássicos e estruturas de dados. Inclui exemplos práticos de grafos, ordenação, busca, programação dinâmica, divisão e conquista, estrutura de pilhas, filas, árvores, heaps e muito mais.
- 2025 - Sudoku Backtracking with Python
- 2020 - AI-Powered Sudoku Solver with Deep Learning and OpenCV - Article
- 2020 - AI-Powered Sudoku Solver with Deep Learning and OpenCV - GitHub
- 2019 - Tech with Tim - Learn how to create a Sudoku Solver using python and backtracking
- 2019 - Tech with Tim - Python Sudoku Solver Tutorial with Backtracking p.1
- 2019 - Tech with Tim - Python Sudoku Solver Tutorial with Backtracking p.2
- 2025 - Subset Sum Problem (Dynamic Programming)
- 2023 - Subset Sum Problem using Backtracking
- 2023 - Subset Sum is NP Complete
- 2025 - 0/1 Knapsack Problem (Dynamic Programming)
- 2025 - 0/1 Knapsack Problem - GeeksforGeeks Practice
- 2025 - 0/1 Knapsack Problem - W3Schools
- 2024 - Traveling Salesman Problem (TSP) Implementation
- 2014 - Traveling Salesman with Simulated Annealing, R, and Shiny - Post no Blog
- 2014 - Traveling Salesman with Simulated Annealing, R, and Shiny - GitHub
- 2022 - Comparing Flood Fill Algorithms in JavaScript
- 2020 - Algorithm to Flood Fill in Python - GitHub
- 2017 - A* Pathfinding Algorithm (Coding Challenge 51 - Part 1
- 2017 - A* Pathfinding Algorithm (Coding Challenge 51.2 - Part 2
- 2024 - Python Big O: the time complexities of different data structures in Python
- 2018 - Big-O: How Code Slows as Data Grows
- 2018 - Ned Batchelder - Big-O: How Code Slows as Data Grows - PyCon 2018
- 2018 - Visualizing Algorithm Complexity
- 2015 - Course - MIT - Design and Analysis of Algorithms
- 2024 - BenjDicken - Linguagens
- 2024 - BenjDicken - Repositório GitHub - Languages
- 2024 - BenjDicken no X - Post Languages
- 2024 - BenjDicken no X - Post Fibonacci
- 2013 - The Sound of Sorting - "Audibilization" and Visualization of Sorting Algorithms
- 2013 - 15 Sorting Algorithms in 6 Minutes
- 2023 - GitHub Sound of Sorting - SoS
- 2023 - Sound of Sorting - SoS - CheatSheet - PDF
BenjDicken-1863977678690541570.mp4
BenjDicken-1861811963434770665.mp4
15_Sorting_Algorithms_in_6_Minutes.mp4
Como você começa em uma casa, você fará 24 movimentos [(n x n) - 1] em um tabuleiro 5×5. | Um exemplo de passeio aberto de cavalo em um tabuleiro de xadrez 8x8. |
Backtracking para resolver o Problema das Oito Rainhas. | Solução de conflitos mínimos para 8 rainhas. |
Uma possível solução para o Problema do Caixeiro Viajante (Travelling Salesman Problem) usando um Algoritmo Evolutivo do PyGMO, um pacote Parallel Global Multiobjective Optimizer para Python:
Uma possível solução para visualizar o Flood Fill usando Python; e uma comparação de algoritmos Flood Fill com JavaScript:
Um Sudoku Autosolver gamificado em Python com Interface Gráfica, Pygame e Algoritmo de Backtracking; e um Sudoku Solver com IA, Deep Learning e OpenCV:
⬇️ Abaixo, outras duas possíveis soluções do Geeks for Geeks com complexidades O(n*9^(n*n)) e O(9^(n*n))
: