Course Links

Exercises

Resources

External

Welcome to CSC212: Data Structures! We hope you will have fun in this course while learning a ton about programming. Below is some important information about how the course will run, as well as some specific “expectation-setting” details about what we will (and won’t!) cover.

Course Description

In this course, we will explore elementary data structures (linked lists, stacks, queues, trees, graphs) and algorithms (searching, sorting) in a variety of contexts, including event-driven applications with a graphical user interface. This course emphasizes object-oriented programming throughout, using the Java programming language. Prerequisites: CSC111.

Learning Goals

This course is designed to help you develop a robust toolbox for solving computational problems, and to approach programming with flexibility and resilience. We organize this study around three main themes. Upon successful completion of this course, students will be able to:

Theme 1: Knowledge of Data Structures and Abstractions
Theme 2: Application of Data Structures
Theme 3: Algorithms and Programming

Course Format

This is a programming-intensive course, designed to help early-stage programmers make the transition into developing software engineers. While programming can be a truly interesting, challenging and rewarding intellectual activity, it is almost impossible to learn it without a lot of practice. We want to devote as much class time as possible to actual programming with feedback from professors, teaching assistants, and peers.

For this reason, we will be teaching this course as a FLIPPED CLASSROOM. This means that we’ll ask you to watch short prerecorded lectures and complete some activities before class, and we’ll spend our time together in class doing activities, writing code, starting assignments, and applying the concepts from lecture in real-world contexts. However: this model only works if you commit to the process… and if this is your first experience in a flipped classroom, it might feel a little overwhelming. Here are some useful tips to help orient you to this model (adapted from UC Boulder’s Succeeding in a Flipped Classroom:

  1. Expect work to be continuous Rather than cramming for large exams that happen after classes, flipped classes require you to keep up with frequent assignments, readings, videos and quizzes that are due before class. One way to set yourself up for success is to get into the habit of completing your pre-class tasks at the beginning of the semester. Keep up with Slack and Moodle for updates and assignments.

  2. Show up present and prepared Be present in class, physically and mentally, to the best of your ability. Be ready engage in class discussions and activities. Ask questions to clarify your understanding of concepts, offer your own perspective, and try not to be afraid of giving “wrong” answers misconceptions and false starts are a normal, healthy part of learning (and we professors guarantee we’ll make plenty of our own mistakes for you to catch!)

  3. Use prerecorded lectures and readings to your advantage While watching recorded lectures may seem like a pain (especially in the context of COVID-19), they provide opportunities to learn at your own pace. If you benefit from rewatching videos or pausing to try something out on your own, please do! Many students find it helpful to take notes while watching prerecorded lectures, just like they would in a traditional class.

  4. Your education is everyone’s priority If you find yourself spending inordinate time debugging your programs without really making progress, it’s time to reach out before you fall behind, or it affects your work in other courses. Your professors and TAs are eager to help you find strategies that work for you, and that enable you to reach your goals in the course. In addition to us, the college has many resources for academic success, all available at no cost.

  5. Give honest feedback This course is an experiment, and as such we will ask for feedback often. We want to know what is going well for you and what is tough. Being open and constructive will help us to improve the class, both for future students and for you.

Course Materials

There is no required textbook for this course: all required readings will be made available through Moodle, and primary content delivery will come via recorded videos. However, there are a few recommended textbooks for those who find them useful as references. None of these textbooks are a perfect fit for the class, but we have drawn material from many of them and all are available for free online, or you can purchase a hard copy from your favorite bookstore:

  • Open Data Structures (in Java) (Pat Morin), Athabasca University Press, 2013. Offered as an introduction to the field of data structures and algorithms, Open Data Structures covers the implementation and analysis of data structures for sequences (lists), queues, priority queues, unordered dictionaries, ordered dictionaries, and graphs. Focusing on a mathematically rigorous approach that is fast, practical, and efficient, Morin clearly and briskly presents instruction along with source code..
  • Think Java: How to Think Like a Computer Scientist, 2nd Ed. (Allen Downey and Chris Mayfield.), O’Reilly, 2019. Think Java is a hands-on introduction to computer science and programming used by many universities and high schools around the world. Its conciseness, emphasis on vocabulary, and informal tone make it particularly appealing for readers with little or no experience. The book starts with the most basic programming concepts and gradually works its way to advanced object-oriented techniques. In this fully updated and expanded edition, authors Allen Downey and Chris Mayfield introduce programming as a means for solving interesting problems. Each chapter presents material for one week of a college course and includes exercises to help you practice what you’ve learned.

If you need help covering the cost of textbooks or other academic supplies (for this or any of your courses!) please fill out the Academic Funding Application found at socialnetwork.smith.edu/forms.

What We Will Cover

This course will provide a thorough overview of the foundations of data structures, and is scoped to a target audience of CSC majors who have completed a first course in programming. If this isn’t you, don’t worry! You’re still very much welcome in this course. Just be mindful that some self-study before the course starts may be necessary (see What We WON’T Cover).

Here’s a selection of topics we will cover:

  • Object-oriented programming in Java
  • Pointers, references and indirection.
  • Theory and usage of fundamental data structures:
    • Arrays
    • Linked Lists
    • Stacks
    • Queues
    • Hash Tables
    • Heaps
    • Trees
    • Graphs
  • Searching and Sorting Algorithms
  • Recursion

What We WON’T Cover

This course assumes that you have a solid foundation in programming, either through successful completion of CSC111, high school curriculum at at AP or IB level, or dedicated self-study. Proficiency with various computer environments and infrastructure will also come in handy. Because folks are coming to this class from a variety of backgrounds, we strongly recommend paging through The Missing Semester of Your CS Education to familiarize yourself with topics such as:

  • Shell Tools and Scripting
  • Editors (Vim)
  • Command-line Environment
  • Version Control (Git)
  • Debugging and Profiling

Additonally, knowledge of the following will likely prove useful in this class, but due to time constraints we will unfortunately not be covering the following topics (links to supplemental online courses through LinkedIn Learning are provided, which are available for free to all members of the Smith community):

  • Programming Foundations: Fundamentals (Been awhile since you took 111? This 2hr crash course will remind you of the key points. Taught in Python.)
  • Learning Java (Worried about making the leap from python to Java? This course is essentially a do-over of 111, but in Java instead of python.)
  • Java Code Challenges (Partway through the semester and you still feel like you just don’t quite “get” Java? Try these challenges to build your confidence!)

Communication expectations

All written communication regarding this course will take place via Slack (a cloud-based communcation platform that supports text, voice, and video). This includes:

  • announcements (in the #general channel)
  • questions about the material (in the #questions channel)
  • messages between individual students and the instructor

Even if you’re not used to Slack at first, it’s not too hard to learn. The advantages of having all course communications in one place are compelling. Use Slack!

Assessment

There are five forms of assessment in this course:

  • Weekly programming homework assignments
  • Regular written commentary and reflection
  • Video responses and in-class activities (both assessed for completion only)
  • Two written examinations (one midterm, one final)
  • One final programming project

Homework, Labs, and Lateness Policy

Weekly programming assignments will be introduced in class on Wednesdays, and we will work together to get started on them during class time. To help us maintain healthy coding practices, we will begin each Friday class session with a peer code review: you’ll bring your started-but-not-yet-finished code, lay out your plans for making progress, and talk through any bugs that have you stuck. Final submissions will be due Tuesdays at 11:59PM EST.

Keeping up with the assignments is crucial to success in this class. Because of this, we will utilize progress grades to encourage full, timely completion. There is one cumulative progress grade per assignment, with two possible outcomes:

  • 100% credit if all assignments to date have been submitted
  • 0% credit if any assignments due have not yet been submitted

Your progress average counts for 20% of the overall homework grade, and the remaining 80% of your homework grade is based on quality of work, regardless of when it was submitted.

Because we all have outside lives that sometimes intervene, every student will also have a self-managed budget of extension days. Use it wisely! Read details on how to secure an extension here.

In-class lab activities are designed to be completed during the scheduled class time in which they are assigned. Students present in class receive full credit for the work. If you miss a day, you are responsible for making up any missed activities within one week, preferably before the next class. Bear in mind that the lab is often a warmup for an upcoming assignent; labs should not interfere with beginning your work on the programming assignment.

Collaboration and Academic Integrity

Programming is more fun in groups! Students are strongly encouraged to form study groups and to collaborate in solving the assignments. Please ensure that all work you submit is ultimately the product of your own understanding rather than anyone else’s. You may consult online or print references on all assignments and labs. Standard language references showing syntax, usage, class javadoc, etc. need not be cited; nor does the course textbook. All other resources must be cited as described below.

The following information is required for all submitted work:

  1. The names of all collaborating students be listed at the top of the submission. If you worked alone, please state: “I did not collaborate with anyone on this assignment.
  2. A “References” section, with in-line citations to any external resources you used. Citations should include page numbers (if a printed resource) or a direct URL (if an online resource). If you did not use any resources in completing the assignment, please state: “I did not utilize any external resources in completing this assignment.” If you include a fragment of code from any source, you should also credit that source with a comment directly in the code.

Grading

Category Percentage
Coding/Written Assignments and Checkpoint Grades 60%
Exams 20%
Final Project 15%
Participation and Engagement 5%

Note that the final grade is based on our evaluation of your work, and every effort will be made to communicate expectations in advance through detailed rubrics. Although the grade will be largely based on the percentages shown above, we reserve the right to award extra credit for excellent work and out-of-the-box thinking. For example, while “Participation and Engagement” will look primarily at day-to-day engagement, we will also take note of contributions both in and out of class which demonstrate intellectual curisoity or clear understanding of a topic, as well as comments which help others to learn a difficult concept.

Accessibility

We aim to make this course accessible and welcoming to all. Please let us know if there are changes we can make towards meeting this goal. Smith College can also help facilitate support services and accommodations to all students with disabilities. To request an accommodation, please register with the Disability Services Office.

Acknowledgement

Some of the materials used in this course are derived from lectures, notes, or similar courses taught at other institutions. Appropriate references will be included on all such material.