CSCI 3104, Spring 2017

Time: Tuesday, Thursday, 12:30pm - 1:45pm
Room: CHEM 140

Instructor: Aaron Clauset
Office: ECOT 743
Office hours: Tuesday 2:15-3:00pm and Thursday 10:00-11:30am
Email: zzilm.xozfhvg@xlolizwl.vwf (an Atbash cipher)
Teaching Assistants: Nora Connor, Ram Das Diwakaran, Nehal Ram Kamat, Santhanakrishnan Ramani, and Wanshan Yang
Office hours: See course Moodle page
Course information: Syllabus (read this first)

Algorithms are the heart of computer science, and their essential nature is to automate some aspect of the collecting, organizing and processing of information. Today, information of all kinds is increasingly available in enormous quantities. However, our ability to make sense of all this information, to manage, organize and search it, and to use it for practical purposes, e.g., self-driving cars, adaptive computation, search algorithms for the Internet or for social networks, artificial intelligence, and many scientific applications, relies on the design of efficient algorithms, that is, algorithms that are efficient with time and space resources, and which provide guarantees on their performance.

This undergraduate-level course will cover topics related to algorithm design and analysis. Topics will include asymptotic analysis, time and space constraints, dynamic programming, divide and conquer, greedy algorithms, graph algorithms, computability, and a selection of advanced topics. The focus throughout will be on algorithmic thinking, performance guarantees and boundary cases, efficient solutions to practical problems and understanding how to analyze algorithms. Advanced topics will cover a selection of modern algorithms, many of which come from real-world applications.

Learning Goals
In this course, students will

  • become familiar with standard algorithms for abstract problem solving;
  • learn how to mathematically prove properties of algorithms, including their correctness;
  • analyze the time and space complexity of algorithms;
  • understand the relative merits or demerits of different algorithms in practice;
  • adapt and combine algorithms to solve problems that may arise in practice; and,
  • learn common strategies in the design of new algorithms for emerging applications.

Introduction to Algorithms (3rd ed.), by Cormen, Leiserson, Rivest and Stein
(aka "CLRS"; available at the CU Bookstore).

Week 1: Fundamentals of algorithms
Week 2: Time and space complexity
Week 3: Divide and conquer
Week 4: Efficient data structures
Week 5: Greedy algorithms
Week 6: Dynamic programming, Knapsack
Week 7: Dynamic programming, Sequences
Week 8: Midterm exam
Week 9: Graph algorithms, SSSP
Week 10: Graph algorithms, APSP
Week 11: Spring Break
Week 12: Graph algorithms, MST
Week 13: Graph algorithms, Max-flow
Week 14: Stable matchings
Week 15: Problems in P and NP
Week 16: Internet algorithms
Week 17: Final exam (scheduled)

Problem Sets
There will be 10 problem sets. Problem sets will always be due on Thursday. A LaTeX template for writing up your solutions can be found here. All problem set files and submissions will be through the course Moodle page

There will be a midterm exam (in class), and a final exam. There may also be pop or online quizzes during the semester.

Advice on writing proofs, by Cathy O'Neil.
Advice on proofs by induction, by Jeff Erickson (UIUC)
Mathematics for Computer Scientists; advice by Eric Lehman (Google), F. Thomson Leighton (MIT) and Albert R Meyer (MIT)
TeXShop (LaTeX installation for Mac OS X)
MiKTeX (LaTeX instalation for Windows)
TeX Live (LaTeX instalation for Linux)
LaTeX resources and guides (here, here, here and here).
Algorithms Course Materials by Jeff Erickson (UIUC)
Algorithm Design, by J. Kleinberg and E. Tardos (textbook)
Algorithms, by S. Dasgupta, C. Papadimitriou and U. Vazirani (textbook)