This course was a deep, practical pass over the algorithmic design techniques every engineer leans on: recognizing which technique a problem calls for, implementing it, and analyzing the result rigorously.
Design Techniques
I worked with greedy algorithms, divide-and-conquer, dynamic programming, and backtracking, implementing each and, more importantly, learning to recognize the problem structures where each applies. The course also revisited the standard sorting algorithms and their computational complexities as the baseline vocabulary of algorithm analysis.
Graph Algorithms
The graph module covered search and traversal, shortest paths, minimum spanning trees, and topological sorting. Given how much of AI reduces to computation over graphs (from search problems to message passing in graph neural networks), this material connected directly to my other Master's work.
Strings and Compression
We studied classical algorithms for string searching, string comparison, and text compression, the kind of algorithms that hide inside every tokenizer and indexing pipeline.
Computability and Complexity
The theory module addressed NP-completeness: the fundamental principles, practical implications, and proofs for specific problems. We also covered computability and undecidability with common examples of unsolvable problems. Knowing where the hard boundary lies, and what approximation or heuristics can still buy you, changes how you approach optimization problems in practice.
The assessment combined a graded project portfolio with a written exam, so the techniques had to hold up both in working code and under analysis on paper.