Introduction to Algorithms (csci2200)
Spring 2018
Piazza link | GitHub link | Useful links | Detailed schedule | Labs | Department's collaboration policy
Basic info
Meetings
- Lecture: Tu, Thu 2:30 - 3:55 (Searles 126)
- Lab: Fri 11:00 - 12:25 (Searles 126)
Prerequisites: csci 101 (Intro to CS) and csci
2101 (Data Structures).
Textbook:
We'll be using the following textbook:
Class webpage:
http://www.bowdoin.edu/~ltoma/teaching/cs231/2018spring/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. You can
bookmark this page, or follow the link from my website at Bowdoin. The class
does not have a Blackboard site.
Schedule: For useful links and detailed class
schedule, check detailed schedule.
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, argue their correctness
and analyze their efficiency.
- To start, we'll introduce asymptotic notation, summations and
recurrence relations, as well as basic proof techniques (induction
and contradiction).
- 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 some 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.
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:
- Be familiar with the fundamental algorithms and data structures
and the major design paradigms
- Be able to analyze the asymptotic performance of algorithms, compare
multiple algorithms for a problem and predict performance
- Be able to argue correctness of an algorithm
- Be able to come up with algorithms for new problems
- Have an appreciation of algorithms and an understanding of
their importance
- Have improved problem solving skills and ability for abstraction
Teaching style:
The goal of the class is not 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, we'll try to come up, as a group, with ideas and
solutions, and gradually refine them. Sometimes it is very effective
to see ideas that don't work, or ideas that lead nowhere. The boards
will ocasionally be messy, but being able to go through the messy
creative process is far more important.
As we come up with solutions, we'll try to generalize and derive
"techniques" that we can apply to other 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.
Labs
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.
Office hours, TAs and study groups
We have a fantastic set of TAs who are all eager to work with you:
- Cory Alini
- Dylan Parsons
- Will deBruyn
- Ezra Sunshine
- Dylan Hayton-Ruffner
Office hours and study groups:
- Office hours Laura: Tuesdays and Thursdays, 1:00 to 2:30. For
those who cannot come to office hours because of conflicts with
other classes, you can catch me on Tuesdays and Thursdays after
class; or, send me an email to set up a meeting at a different time.
- Study groups (in 224)
- Sundays: 7:30-9:30 Ezra
- Wednesdays 7:30-9:30 (Dylan Parsons)
- Thursdays 7-9 (Cory)
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.
- Exam 1: Friday February 23, in class (Searles 126)
- Exam 2: Friday April 13, in class (Searles 126)
- Exam 3: Monday May 14th (9am, Searles 126) <--- from polaris
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:
- 10 lab assignments (25%).
- Quizes (announced, in-class) (5%)
- 3 exams (65%).
- Class participation (5%)
Expectations
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
abstraction. 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:
- Plan accordingly, and allow plenty of time to
read the materials and work on the problem sets each week.
- Be pro-active about studying (use class materials and search for
resources on the internet)
- Encourage self-reflection: Try to formulate questions, and try to answer them yourself.
- 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.
- Practice. Practice. Practice.
- Don't be harsh on yourself if you are not doing as well as you
expected. Push yourself, don't focus on grades, enjoy the process!
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,
- All in-class and in-lab work, unless otherwise specified, is at
collaboration-level 0; that is, no restrictions.
- The homework assignments, unless otherwise specified, will be at
collaboration-level 1; that is, verbal collaboration without
solution sharing. You are allowed and encouraged to discuss ideas with
other class members, but the communication should be verbal and
additionally it can include diagrams on board. Noone is allowed to
take notes during the discussion (being able to recreate the solution
later frommemory is proof that you actually understood
it). Communication cannot include sharing pseudocode for the problem.
- Exams and quizes will be at collaboraytion-level 3
(professor clarifications only).
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.