CSCI 2101B
Data Structures

Bowdoin College
Fall 2021
Instructor: Sean Barker

Course Overview

This course builds on the programming skills acquired in an introductory computer science course and couples work on program design, analysis, and verification with an introduction to the study of data structures. Data structures capture common ways in which to store and manipulate data, and are essential to the design of complex computer programs. The use of appropriate data structures allows for both efficiency (e.g. memory usage and runtime) and scalability (e.g. large data sets) of algorithms. We will study some of the most important and frequently used data structures, such as lists, stacks, queues, trees, and hash tables, and will analyze their efficiency in a mathematical framework. Along the way, we will emphasize the development of clear, modular programs that are easy to read, debug, analyze, and modify. Lab assignments will involve writing complex programs in the Java programming language.

Primary course goals include:


CSCI 1101 (Introduction to Computer Science) or CSCI 1103 (Programming with Data) or permission of the instructor. You should be comfortable working in a programming language such as Python, Java, or C, but you are not expected to have prior experience with Java specifically.


Instructor: Sean Barker
Office: Searles 220
Phone: 207-798-4220
Office Hours: Tues/Wed 1:30-3, Thurs 11-12:30, or by appointment.

Learning Assistants (LAs):
Amanda Smith
Aurora Theriault
Ben Heinrich
Bruce Tang
Darien Gillespie
Griffin Ott
Ryan Donlan
Yi Yang

Class Information

Mondays, Wednesdays, and Fridays, 10:05 AM - 11:30 AM
Classroom: Searles 128

Course Requirements

Attendance and participation during class and lab sessions, completion of roughly weekly programming assignments, and three exams (two midterms and a final). Evaluation will be as follows:

Labs will be a mix of individual and group assignments and will be evaluated on program correctness, sound design, and proper coding style.

Deadlines and Flex Days

Lab assignments in this class will demand a significant time commitment on your part, and it is critical that you budget your time accordingly. To provide reasonable flexibility with deadlines, you are allotted three flex days for the semester, each of which may be used to submit a lab up to 24 hours late (up to 72 hours late if all flex days are applied at once). For group projects, applying a flex day uses a flex day from each group member's allotment, but only requires that at least one group member has a flex day remaining. Beyond the use of flex days, assignments will not be accepted after the posted due dates unless alternate arrangements have been approved in advance of the deadline. If you have an unusual situation that you foresee impacting your ability to meet a deadline, please let me know as soon as possible so that we can make a plan.


We will make limited use of the following free textbook:


D. Bailey. Java Structures: Data Structures in Java for the Principled Programmer, Root 7 Edition (2007). Available as a free PDF download.

While you are welcome to print portions of the electronic copy of the book, be wary of hard copies of earlier editions (e.g. the 2nd edition pictured), which are significantly different.

Electronic Communication

We will use Slack to facilitate communication and discussion outside of class. In general, you should prefer messaging me on Slack (aka sending me a DM) over sending me email, as it is faster, more convenient, and likely to result in quicker responses. For this class, Slack will serve as an email replacement as well as a general-purpose discussion board and a repository of important class information.

Here is the CSCI 2101 Slack.

Guidelines on Group Work

Collaboration is important and valuable in computer science, and some assignments in this course will permit working in a group. This section describes expectations and requirements for completing group work in this course.

For all group work, a single copy of the assignment will be submitted. Group members are expected to fully collaborate on the work, and all group members are responsible for understanding all parts of the assignment. In other words, it is not acceptable to simply split the work between the group members and complete the parts independently.  For programming assignments completed in groups, most or all programming should be done with all group members working in front of a single (physical or virtual) computer.  Group members should take turns ‘driving’ (writing code) and ‘directing’ (looking at the code, discussing, and offering suggestions).

Note that this requirement means that you should choose your group members carefully and deliberately.  In particular, you should consider both your working styles and schedules; you cannot be an effective team if you cannot find suitable chunks of time to collaborate synchronously.

Forming a group: Each assignment that permits group work is given a "group deadline", which is the date by which groups must be determined (typically a few days after the assignment is released). To form a group, DM me on Slack with your group members. If you want to work in a group but don't have a partner in mind, let me know and I can try to match you. If I do not hear from you and you previously worked in a group, I will assume that you are working in the same group as before. You may also opt to dissolve a group and work solo, even if you worked in a group on a prior assignment. Group changes following the group deadline are not permitted without prior approval.

In the event that your group is not working smoothly for any reason and you do not believe it will be resolved, you should let me know as soon as possible. I can't address a problem that I don’t know exists!

Group reports: Each student working in a group is required to send me an individual group report at the conclusion of each group assignment. Your group report must (1) identify your partner(s), (2) summarize your own contributions to the assignment, and (3) summarize your partners' contributions to the assignment. The purpose of these reports is to provide mutual accountability within your group and to ensure that groups are functioning well. These reports do not need to be overly detailed and are often of the form "I worked with my partner on the entirety of the project together at the same time." Note that I reserve the right to adjust individual grades up or down from the group grade in cases of clear inequity, although this is not done routinely. Group reports should be DM'd to me on Slack and are due at the same time of the assignment itself. Your assignment will not be considered submitted until both the assignment and your group report is received!

Collaboration Policy and Honor Code

Please review the Computer Science Collaboration Policy. You are responsible for reading, understanding, and adhering to this policy.

Group work follows the standard guidelines described above, with the exception that collaboration between members within the group is unrestricted and does not need to be cited. Any collaborations outside of the group must follow the standard guidelines.


Feedback is welcome on all aspects of the course as we go, either by DM on Slack or by using the anonymous feedback form. All forms of feedback are welcome (and the sooner that feedback is provided, the more likely it is that adjustments can be made in response).