[Bowdoin Computer Science]

Algorithms (csci2200)
Fall 2017

Piazza link | Useful links | Detailed schedule | Department's collaboration policy

Basic info


Prerequisites: csci 101 (Intro to CS) and csci 2101 (Data Structures). Generally speaking, a good mathematical background and good QR skills are not required, but are helpful.

Textbook: We'll be using the following textbook:

Cormen, Leiserson, Rivest and Stein, Introduction to Algorithms, 3rd Edition, McGraw Hill, New York, 1990. (bugs).

Class webpage: http://www.bowdoin.edu/~ltoma/teaching/cs231/2017fall/index.html. Note that this is a link from my personal website at Bowdoin. This site will contain all class-related material along the semester. The class does not have a Blackboard site.

Schedule: For useful links and detailed class schedule, check detailed schedule.

Office hours, TAs and study groups

We have a fantastic set of TAs who are all eager to work with you: Office hours and study groups:

Course overview

Problem solving is at the heart of Computer Science and computational thinking. This class is an introduction to problem solving through the design and analysis of algorithms. We'll introduce some fundamental algorithmic problems, talk about solutions for these problems, prove their correctness and analyze their efficiency.

The class is theoretical, however we'll use occasional programming assignments to help ground theoretical concepts. The work for the class will be a combination of problems sets and implementation of algorithms discussed in class.

Homeworks, Exams and grading

Homework: The weekly lab will contain problems to be solved in the lab, and a set that constitues the homework for the subsequent week. The homeworks will generally be due a week later (unless specified otherwise). Late assignments are not accepted (except in case of medical reasons).

Exams: There will be three in-class exams, all in Searles 126.

All exams are in class and cumulative, but with the emphasis on the new material that has not been covered in a previous exam. The exam are closed notes, except one sheet of paper that you can fill in as you like.

Grading policy: The final grade is determined as follows:

Course goals

The goal of the class is to give you the necessary tools so that you are able to design and analyze your own solutions to new problems.

At the end of this class you should:

Teaching style:

The goal of the class is not merely to cover a bunch of algorithms, but rather to emphasize the process of coming up with solutions. This process is not necessarily neat; it involves going back and forth, possibly many times, and struggling.

To this end, I will rarely start a class by presenting the algorithm. Instead, I will start by posing the problem, and asking for ideas. We'll try to understand properties of the problem, and, as a group, we'll try to come up with solutions and gradually refine them. Sometimes it is very effective to see ideas that don't work, or ideas that lead nowhere.

As we come up with solutions, we'll try to generalize and derive "techniques" that we can apply to other problems.

The most important skill to learn is abstraction and problem solving: the ability to think critically and solve new problems.

The course relies heavily on group work and peer instruction, so it is crucial that you attend all classes and all labs. There is a lot of research that shows the benefits of peer instruction compared to standard lecturing. The process of explaining an argument is beneficial for everybody involved. You'll work in groups in class and during labs.


You will probably find this class to be difficult. What makes it hard is that this material is new and different than Data Structures, and spans many levels of abstractions. Coming up with algorithms is more an art than a science: there is no systematic way to have an idea, or even to tell what sort of technique would work for a given problem. Problems that seem very similar, may have very different solutions. It is important that you know this ahead of time and you start preparing mentally for a difficult course.

That said, I believe in a growth mindset: if the material comes easy to you, it's because you have the right type of background and experience. If you have difficulty in the class, it's not because you are not smart, but because you don't have the right type of background----you'll just need to work harder to build it. You can do it.

Here are some suggestions for doing well in class:


The lab time is dedicated to working through (more) examples, demos and practice problems, and answering any questions that may come up during lectures. A lab will usually contain a set of problems to be completed in the lab, and a problem set that becomes the homework assignment for the following week.

Occasionaly we'll swap a lecture with a lab, that is, we'll do lecturing during labs, and lab-work during lectures.

The assignments will contain not only applications of the problems discussed in class, but also new problems that will require creative new ideas. Completing the assignment is a learning process (as you probably know from Data Structures). Do not expect to sit down for a few hours and solve everything at once (if you do, come talk to me!). Instead, expect a process: read the problems, understand what they are asking, come up with initial solutions, figure out why they work or not, try to formulate questions, come up with improvements. The whole process is supposed to be interactive between you, the group of people you collaborate withm your TAs, and myself.

Homework collaboration policy and academic integrity

All students are expected to be familiar withm and to comply with the department's collaboration policy.

Collaboration and discussion are crucial for this class. You are encouraged to work on problems in a group and you will most likely find that you will gain a better understanding of the material by discussing the problems with your partners. If you collaborate, you need to list the names of the collaborators on the front page of the homework.

However, our goal is to ensure that the collaboration is appropriate and effective, and that you become an independent problem solver capable to do work on your own. The department's official collaboration policy defines four levels of collaboration. Specifically for this class,

While peer instruction can be immensely useful, it an also harm. Once you found a solution, resist giving hints to your peers or leading them towards the answer. You are not helping them by doing so. Direct them towards the TAs who are trained to give help.

Remember that you are responsible for reading, understanding, and adhering to the department policy. If you have any questions about any aspects of the policy, please do not hesitate to ask for clarification.