## courses

We teach course about parallelism, algorithm engineering and general algorithm courses. If you are interested in our research, they’re also very useful courses for you to set up the background. You’re always welcome to take the courses if you like!

## Undergraduate-level

**CS141: Intermediate Data Strutures and Algorithms**

The course explores basic algorithm/data structure design and analysis. The topics cover general algorithm design techniques including analysis of algorithms, divide-and-conquer, the greedy method, dynamic programming, graph algorithms and basic parallel algorithms. It integrates knowledge of data structures, algorithms, and programming.

We usually have both written and programming assignments. We do so because we hope you can understand the algorithm more when you implement them, and, more importantly, learn how to apply algorithms to solve real-world problems.

If you are an undergraduate student who is interested in algorithms, or a non-CS student who wants to learn algorithms, we highly recommend the course.

Prerequisite: lower-division algorithm / data structure courses (e.g., UCR CS10C); familiar with basic programming;

**CS142: Algorithm Engineering**

CS 142 Algorithm engineering provides comprehensive training for designing, analyzing, implementing, and reasoning efficient algorithms. First, the students will receive a list of problems with real-world background, and solve them using the algorithmic knowledge from previous courses. Skills including problem formalization, algorithm design, optimization and implementation, and debugging will be exercised. Second, we will cover useful knowledge for parallelism, I/O-efficiency, and other system and architecture features to accelerate algorithms. At the end of the course, students will be equipped with knowledge in designing efficient algorithms in practice.

To graduate students: yes, you can take CS 142 to fulfil your electives requirement (12 units for PhD and 32 units for master’s). You can see the list of courses here.

Prerequisites: CS 141 with “B-” or better.

## Graduate-level

**CS214: Parallel Algorithms**

The course covers basic concepts of parallel shared-memory algorithms such as theoretical models, basic sequence algorithms, sorting, graph algoirhtms, various data structures, scheduling, and concurrency. A strong emphasis of the course is to combine theory and practice. In the course, you will learn how to **analyze the parallel algorithms in theory**, but also have the opportunity to **implement parallel algorithms on your own**!

If you are interested in parallel algorithms, this is the entry-level course you can consider!

**CS218: Design And Analysis Of Algorithms**

The course covers efficient algorithms and data structures for problems from a variety of areas such as sorting, searching, selection, linear algebra, graph theory, and combinatorial optimization. It will also cover techniques for algorithm design (greedy, divide-and-conquer, dynamic programming) and rigorous proofs of correctness and time- and space-complexity (amortized analysis, Master Theorem). In particular, we will also put a strong emphasis on the practice. In the course, we will consider both design and analyze the interesting algorithms in theory, and include some training to implement them!

If you are generally interested about algorithms, CS218 is a great course to learn some advanced topics in algorithms beyond undergraduate algorithm course.

**CS219: Advanced Algorithms**

This course provides comprehensive training for designing, analyzing, implementing, and reasoning efficient algorithms. Designing efficient algorithms is one of the most useful skills in computer science, and this course will boost your understanding and skills for it.

If you are consider working on research about algorithms, CS219 will cover many more advanced topics in design and analysis of algorithms.