I am teaching the following courses (all course materials are posted on Canvas).

  • EECS 330: Data Structures and Algorithms. This is the first course on data structures and algorithms. The course covers fundamental algorithmic design paradigms and analysis techniques. The topics include divide-and-conquer algorithms, greedy algorithms, dynamic programming algorithms, along with elementary data structures, such as arrays, linked list, heaps, hashing, disjoint sets, trees, graphs, etc. Many specific problems (e.g., sorting, shortest path, minimum spanning trees) and their algorithmic solutions will be introduced, and analyses will be provided.

  • EECS 690/700: Algorithms for HPC. This course introduces basic models, algorithms and optimization techniques for high-performance computing (HPC). It covers techniques to parallelize classical applications (e.g., matrix and graph algorithms) as well as algorithms to facilitate efficient job execution on HPC platforms (e.g., resource scheduling, fault tolerance). Students will also have the chance to learn about the intersection of HPC and machine learning and to do a course project on a related topic.

  • EECS 835 Advanced Data Science. (Renamed from EECS 731 Introduction to Data Science prior to 2023)
    This course introduces the basic tools, models, and mathematical foundations in support of data processing, analysis and exploration. The course will survey various topics in data science by providing a comprehensive review of both theory and practice. The materials covered include: Python libraries (numpy, matplotlib, pandas, sklearn, etc.), mathematical foundations (linear algebra, probabilities, statistics), and machine learning models (e.g., regression, classification, clustering, neural networks).