Design and Analysis of Algorithms

Course Goals

By the end of this course, you will have developed the following knowledge and skills:
  • You will know how to design and analyze algorithms, and clearly explain the steps of your design and analysis, justifying your claims with formal proof.
  • You will learn and understand several standard algorithmic design techniques, including greedy algorithms, divide and conquer, and dynamic programming.
  • You will be able to apply standard algorithmic design techniques to solve computational design problems of moderate difficulty. You will be able to describe and use these techniques in clear write-ups.
  • You will be able to identify problems that are computationally intractable and argue why these problems might be hard to solve efficiently.
  • You will learn how to design randomized and/or approximation algorithms, and determine when approximation and/or randomization are useful for a problem.
Above all, the goal of this course is to instill a deep understanding of how to think algorithmically about problems.

Student Responsibilities

CS41 covers material that is similar to what you saw in CS35 or CS21. However, the perspective is much different, and what you will be learning is different too. This course is much more about learning how to solve computational problems and analyze your solution(s), and less about implementing algorithms that we've gone over in class. To succeed in this course, you should consistently do the following:

  • Attend class and lab sessions.
    The primary introduction to course material is through class instruction. (Remotely) attending class is essential for understanding the subject. Lab sessions provide additional time to work on solutions. Lab attendance is mandatory.

    Lecture videos will be posted online shortly after lecture. However, I still expect you to attend lectures and actively participate in the learning process.

  • Participate actively in the learning process.
    The best way to learn algorithms material is through constant effort. During class we will often derive solutions collaboratively. Labs provide additional time to experiment with algorithmic solutions. There is a very strong correlation between students that ask questions and students that do well in this class.
  • Start the homework assignments early.
    CS41 is not a coding course, and it is extremely difficult to bang out solutions at the last minute. I understand that it is not always possible to put serious time into an assignment early. However, even 30-60 minutes will be helpful, to ensure that you understand what the problems ask of you and you start thinking about how to solve them early.
  • Seek help early.
    It is essential in this class that you not fall behind. If you find yourself falling behind, or if you're having trouble grasping a concept, come to office hours. Ask (and answer!) questions on Piazza. Set up an appointment to talk with me.

Partner Etiquette

The expectation is that you and your partner are working together on your partnered homework assignments. You should work together on planning, discussing, and writing up the problems. There may be short periods where you each go off and independently work on the problems, but you should frequently come together to talk about your progress as a team.

This is even more important in a remote learning environment. Your partner is there to help brainstorm and talk through ideas. You and your partner are equally responsible for coordinating times that you can meet on Zoom and/or Slack and work on the homework. The final submission has everyone's names on it and should represent work done as a team. You should not submit your name on work which is not your own.

Partnerships where partners work mostly independently tend to result in incomplete and buggy submissions, and do not help you learn the material thoroughly. Partnerships where partners work together for most of the time are much more productive and helpful in learning the material and successfully solving the problems.

If you have any issues with your partnership, please contact me as soon as issues arrive.

Academic Integrity

Note: in the following paragraphs, "code" refers to all homework solutions, including written programs but also proofs, analysis, written reports, etc.

Academic honesty is required in all your work. Under no circumstances may you hand in work done with (or by) someone else under your own name. Your code should never be shared with anyone; you may not examine or use code belonging to someone else, nor may you let anyone else look at or make a copy of your code. This includes, but is not limited to, obtaining solutions from students who previously took the course or code that can be found online. You may not share solutions after the due date of the assignment.

Discussing ideas and approaches to problems with others on a general level is fine (in fact, we encourage you to discuss general strategies with each other), but you should never read anyone else's code or let anyone else read your code. All code you submit must be your own with the following permissible exceptions: code distributed in class, code found in the course text book, and code worked on with an assigned partner. In these cases, you should always include detailed comments that indicates on which parts of the assignment you received help, and what your sources were.

Failure to abide by these rules constitutes academic dishonesty and will lead to a hearing of the College Judiciary Committee. According to the Faculty Handbook: "Because plagiarism is considered to be so serious a transgression, it is the opinion of the faculty that for the first offense, failure in the course and, as appropriate, suspension for a semester or deprivation of the degree in that year is suitable; for a second offense, the penalty should normally be expulsion."

Please contact me if you have any questions about what is permissible in this course.