Teaching

Here are the courses I teach at Northeastern.

Discrete Structures (CS 5002)

CS 5002 introduces the mathematical structures and methods that form the foundation of computer science. We will study basic logic, proof techniques, functions, number theory, algorithms, graphs, and trees. We will discuss counting techniques and apply the techniques to estimate the size of sets, the growth of functions, and the time complexity of algorithms. We will examine inductive and recursive definitions of structures and functions, as well as data structures such as arrays, lists, maps, stacks, and queues. (Course Syllabus).

Data Structures and Algorithms (CS 5008)

CS 5008 presents an integrated approach to the study of data structures, algorithms, and their application within systems topics. We introduce a variety of fundamental algorithmic techniques (divide-and-conquer, dynamic programming, graph algorithms) and systems topics (models of computation, computer architecture, compilation, system software, networking). The integration of topics is demonstrated through programming assignments in the C language that implement fundamental data structures (lists, queues, trees, maps, graphs) and algorithms as they are applied in computer systems. Additional breadth topics include programming applications that expose students to primitives of different subsystems using threads and sockets. (Course Syllabus)

Foundations of Artificial Intelligence (CS 5100)

CS 5100 introduces the fundamental problems, theories, and algorithms of the artificial intelligence field. Topics include heuristic search and game trees, automated deduction and its applications, problem solving and planning, and introduction to machine learning. Required course work includes the creation of working programs that solve problems, reason logically, and improve their own performance using techniques presented in the course. Coding assignments will be done in Python. (Course Syllabus).

Algorithms (CS 5800)

CS 5800 presents the mathematical techniques used for the design and analysis of computer algorithms. We will focus on algorithmic design paradigms and techniques for analyzing the correctness, time, and space complexity of algorithms. Topics may include asymptotic notation, recurrences, loop invariants, sorting and searching, advanced data structures, lower bounds, hashing, greedy algorithms, dynamic programming, graph algorithms, and NP-completeness. (Course Syllabus).