CSE 3500: Algorithms and Complexity

Spring 2018

This course is for undergraduate students to learn basic concepts and techniques in
algorithms and complexity.

Lectures. Monday and Wednesday, 3:35-4:50 pm.

Yufeng Wu (yufeng.wu@uconn.edu), ITE 235. Office hour: Monday and Wednesday,
10:00-12:00 am or by appointment.

Graders: Vinayak Gupta (vinayak.gupta@uconn.edu)

Prerequisites. CSE 2100 (Data structure and intro. to algorithms) and CSE 2500
(Introduction to discrete systems).
Some topics need some basic knowledge of probabilities.
Moreover, you need to know how to program. We may have programming assignments in this class.
You can use any programming language for these assignments.

Textbook: The required textbook is: Algorithm Design by Kleinberg and Tardos, 2006.
Several chapters are available online at the above web page.
Many lectures are based on this book, although we will sometimes
cover topics not in the book (where notes and handout will be provided) and of course
we can not cover every chapter of the book.

Occasionally I will also use some materials from a classic algorithm textbook:
Introduction to Algorithms, 3rd edition
by Thomas Cormen, Charles Leiserson, Ronald Rivest, and Clifford Stein. MIT Press, 2009.

Outline. This course is lecture-based. The planned subjects are the following (subject to change).

1) Fundamental concepts of algorithms. Asymptotic order of growth. Basic running time analysis.
Graph related topics.

2) Basic algorithm techniques.
Divide and conquer. Dynamic programming. Greedy algorithms.
Algorithms for graphs: basic algorithms, minimum spanning tree and shortest path. 

3) Advanced algorithms and complexity.
NP-completeness. Algorithms for NP-complete problems.
If time permits, the following topics may be covered: algorithms on numbers, network flows,
approximation algorithm and randomized algorithms.

For more details on planned topics, please look at the planned schedule (from the course web page).

Homework. We will have homework every one to two weeks.  Work hard on them, even though
homework does not carry big weights on grading. This is the best way to learn the materials
and prepare for exams. Much of what you learn from this course comes from the homework.
Your solutions should be concise, correct and legible. Some of the problems may be challenging,
depending on your background. If you can not solve a problem, briefly explain where the difficulty is.
You are required to submit the homework electronically (in PDF format). We appreciate greatly
if you typeset the homework. One good typesetting tool is Latex. Latex is a bit difficult to pick up
but it is very powerful. Every computer scientist I know uses Latex. You can get started on Latex from here.
Or you may type the English part and write by hand, very clearly, any mathematical parts, and then scan it.
Note: you need to acknowledge any source of ideas other than the textbook. You must always
write up the solutions on your own.

How to write up an algorithm? A frequently asked question is how to write up an algorithm for homework or exams.
Here is my suggestion. Do not write detailed code, and try to limit the amount of pseudo-code you write.
The way I like to see a written algorithm is: (i) have a clear structure (i.e. mark the main steps 1, 2, 3, ..,
but note I won't have too many steps: that can be very confusing to follow;
and ensure control flow such as loops as clearly stated), and (ii) use concise English sentences
to explain what each step is supposed to do; you can use Math symbols here but don't over-use them.
Check out the lecture notes to see how algorithms are usually written. You should note that
it is almost always necessary to explain the following aspects: (i) why you algorithm is correct?
(ii) how fast does your algorithm run (expressed in asymptotic notations)? For example,
if you are asked to design e.g. a linear-time algorithm, you have to justify why your algorithm
runs in linear time. Again, you should never give an algorithm without analysis
(e.g. for its correctness and running time).

Programming assignment: while this course is mostly theoretical, I have found that it can be useful to
put what is covered in class into action. I plan to assign one programming assignment. In this
assignment, you will have chances to implement algorithms and also evaluate their performance.

Exams. There are two in-class exams for this course and a final exam. Exams will be closed book and notes
but you are allowed one (two for the final) 8 1/2 by 11 review sheet.

Grading. Homework and programming assignments (15%), exam 1 (20%), exam 2 (25%), and final (40%).

Academic integrity: students in this class are expected to follow the academic integrity code of UCONN.
For homework, you may discuss with other students about the general ideas. But you must write up the
solution yourself.

How to do well in this class? Learning algorithm is not easy. I have the following advice based on my
past experience in teaching this course.
The most important thing to do for this class is thinking.
Don't just copy down what I said in class. It is far more important to think and follow the logic. This class
is about learning problem solving skills using algorithm. Getting such skills is far more important than knowing
or memorizing a specific algorithm.