Piazza link | Useful links | Schedule
- Lecture: Tu, Thu 11:30 - 12:55 (Searles 126)
- Lab: Fri 10:00 - 11:25 (Searles 126)
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 (strongly suggested): Cormen, Leiserson, Rivest and
to Algorithms, 3rd Edition, McGraw Hill, New York, 1990. (bugs).
http://www.bowdoin.edu/~ltoma/teaching/cs231/2017spring/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 Syllabus.
Problem solving is at the heart of Computer Science and computational
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.
- To start, we'll introduce asymptotic notation, summations and
recurrence relations, as well as basic proof techniques (induction
- We'll discuss fundamental data structures such as search trees,
[augmented search trees], priority queues, [skip lists] and
union-find data structure.
- We'll introduce fundamental algorithmic problems such as
searching, sorting and selection, matrix multiplication, as well as
basic optimization and graph problems.
- We discuss solutions to these problems, while trying to
understand the guiding principles and illustrate techniques that can
be applied to other problems. We'll discuss fundamental algorithmic
techniques: divide-and-conquer, dynamic programming and greedy.
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.
At a broad level, the goal of the class is to give you the necessary
tools to find algorithms for new problems, from scratch.
In more detail,
...and more broadly:
- To be able to analyze the asymptotic performance of
algorithms, compare multiple algorithms for a problem and predict
- To be able to argue that an algorithm is correct
- To be familiar with the fundamental algorithms and data
structures and the major design paradigms
- To be able to apply
these techniques to new problems
- To get an appreciation of algorithms and an understanding of
- To improve problem solving skills and power of
- To develop a database of algorithms and techniques
which you'll use as building blocks to solve new problems
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 refine them until we
can refine no more. Sometimes it is very effective to see idea 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 instructions compared to
standard lecturing. The process of explaining an argument is
beneficial for everybody involved. You'll work in groups in class,
during labs, and in the study groups.
Expectations This will be a hard class. What
makes it hard is that coming up with algorithms is more an art than a
science: there are no recipes, and each problem is a new
problem. Furthermore, problems that seem very similar, may have very
Plan accordingly, and allow plenty of time to
read the materials and work on the problem sets each week.
To succeed in this class:
- Be pro-active about studying (use class materials and all
resources on the internet)
- Try to formulate questions
- Go to the study groups and talk to the TAs; Listen to your peers'
questions and get your questions answered.
- Solve all problems that are assigned in class and lab, even those
that are optional.
- Find a group of peers to work with. Explain your ideas to your
peers, and listen to their ideas. Try to argue why a solution is
correct, or prove it wrong by finding an instance where it does not
work (a counter-example). Take turns.
Office hours, TAs and study groups
Office hours and study groups:
- Office hours Laura: Mon 2:30 to 4, Tue 2:30 to 4, Fri 11:30 to 12:30
- Study groups
- Tuesdays 7-9pm [Dylan, Searles 224]
- Wednesdays 8-10pm [Anjulee, Searles 224]
- Thursdays 7-10pm [Cory and Clara, Searles 224]
Labs and Homework
The lab time is dedicated to more examples, demos and practice
problems. 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 do lecturing during labs, and lab-work during
The assignments will contain not only applications of the problems
discussed in class, but also new problems. Completing the assignment
is a learning process. Don't expect to sit down for a few
hours and solve everything in a breath (if you do, come talk to me
right away!). 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.
Homeworks, Exams and Grading policy
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 exams, each one about a
third through the semester (precise date TBD); the third exam is
during the final exam period. The exams will be a combination of
in-class and take-home. All exams will be open book and open notes,
and non-cumulative (to the extent possible).
Homework collaboration policy: You are encouraged
to work on problems in a group. You will find that you will gain a
better understanding of the material by discussing the problems with
your partners. However, you must write up the solutions
individually. Limit your collaborators to three or
less, and list the names of the collaborators on the homework.
Grading policy: The final grade is determined as
- Homework assignments (40%).
- 3 exams (60%).
- Class participation.
You are expected to follow Bowdoin's academic honor
code. Collaboration on homeworks is encouraged, however you are
responsible to write the solutions on your own, and list the names of
all your collaborators. You may not glance over someone else's written
solution, and you may not share your problems sets and exams with
anybody else, this term or in the future. Any violation will be
reported and treated according to Bowdoin's academic integrity