Fall 2017

- Lecture: Tu, Thu 11:30 - 12:55 (Searles 126)
- Lab: Fri 1:00 - 2: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:**
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.

- Cory Alini
- Ethan Zhou
- Jack Ward
- Dylan Parsons
- Will DeBruyn
- Duncan Gans

- Office hours Laura: Tue 2:30 to 4, Thu 2:30 to 4. For those who cannot come talk to me on Tue or Thu because of conflicts with other classes, please send me an email to set up meetings on Fri before lab.
- Study groups (in 224)
- Sundays: 7:30-9:30 (Ethan)
- Wednesdays 7:30-9:30 (Cory)
- Thursdays 7-9 (Jack)

- 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 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.

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

- Exam 1: Thu Oct 12 (11:30am)
- Exam 2: Fri Nov 10 (11:30am)
- Exam 3: Dec 18 (9am)

**Grading policy:** The final grade is determined as
follows:

- 11 lab assignments (20%).
- 3 exams (65%).
- Quizes (announced, in-class) (10%)
- Class participation (5%)

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 developed an appreciation of algorithms and an understanding of their importance
- Have improved problem solving skills and power of abstraction

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.

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!

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.

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.