CPSC 327 Data Structures and Algorithms Spring 2024

CPSC 327 Course Information

On this page:


Course Description and Objectives

At the heart of computer science is the development of efficient algorithms for solving problems. This course focuses on the design and analysis of data structures and algorithms, continuing the study of data structures begun in CPSC 225 with a focus on more advanced structures (hashtables, heaps, balanced binary trees, graphs, and building your own data structure for a particular application), common algorithmic approaches (iterative, recursive, divide-and-conquer, greedy, backtracking, branch-and-bound, dynamic programming), and covering topics such as correctness, efficiency, complexity, and NP-completeness.

The course has three main goals (and several subgoals):

  • developing the skill of analyzing a problem and creating an efficient and provably correct solution to that problem, which includes:
    • gaining a working knowledge of algorithmic efficiency, to inform the algorithm- and program-design process by providing a basis for comparing solutions and defining good solutions
    • developing a toolbox of known data structures and algorithmic strategies which can be used to solve many common problems
    • developing the knowledge of how to think about algorithms and data structures, for when a "canned" data structure or algorithm might not be sufficient
  • fostering an appreciation for the practical value of studying algorithms and data structures
  • developing other skills useful in computer science: abstract thinking, comfort with the idea of tradeoffs, and a habit of critical reflection

By the end of the course, the successful student should be able to:

  • describe and discuss different ways in which the efficiency of an algorithm can be determined
  • define big-Oh notation
  • discuss the pros and cons of asymptotic measures (big-Oh) and experimental measures of algorithm efficiency
  • define the difference between best case, worst case, and average case running time/space
  • determine the (best, worst, average) running time/space of an iterative or recursive algorithm
  • arrange algorithms from fast to slow based on their asymptotic running times
  • define: iterative algorithm, recursive algorithm, divide-and-conquer, greedy, recursive backtracking, branch-and-bound, dynamic programming
  • give examples of algorithms utilizing each approach
  • for each approach, identify the problem characteristics that make that approach suitable (or not suitable)
  • identify the steps for developing algorithms of each type
  • develop algorithms for a new problem using suitable approach(es)
  • convincingly justify the correctness of the resulting algorithm
  • identify the key properties and typical operations of each ADT
  • give examples of applications of each ADT
  • match the needs of the problem to an appropriate ADT
  • compare and contrast the time- and space-efficiency of different implementations of ADTs and discuss situations in which each implementation is most appropriate
  • define and implement basic graph algorithms (e.g. depth-first search, breadth-first search, topological sort, shortest path), determine their running times, and discuss their applications
  • define P, NP, NP-hard, and NP-complete and give examples of relevant problems
  • describe several important NP-complete problems (e.g. 3SAT, vertex cover, clique, knapsack, TSP)
  • discuss and apply algorithmic strategies (e.g. backtracking, branch-and-bound) for dealing with NP-complete problems

Prerequisites

CPSC 225 is required.
This course builds directly on the material in CPSC 225 (and 124): programming in Java, fundamental program constructs such as loops and conditionals, basic abstract data types (lists, stacks, queues, and binary trees), how those data types are implemented (using arrays, linked lists, and other linked structures), and recursion.

CPSC 229 is helpful, but not essential.
The most relevant topics from 229 are the idea of a formal mathematical proof, and specific proof techniques such as induction and proof by contradiction. The topics of Turing machines and computability will also make an appearance. While prior exposure to this material is helpful, no knowledge is assumed and all of these topics will be introduced as needed.


Required Materials
Textbook

The Algorithm Design Manual (3rd ed)
Steven S Skiena
Springer, 2020
ISBN 978-3030542559 (hardcover), 978-3030542580 (softcover), 978-3030542566 (ebook)

This is both a textbook for learning how to design algorithms and data structures, and a useful reference with an extensive catalog of algorithmic problems that arise in practice. I hope that you will enjoy reading the book during the course and that you will want to hang on to the book afterwards to use in your future algorithmic endeavors.

If you are buying the book on Amazon or elsewhere, note that the third edition has a very similar-looking cover to the second edition. Look for "Third Edition" on the cover and/or check the ISBN to make sure you are getting the right version.

Additional material will be handed out or posted on the course webpage.

Software

There will be several programming assignments which involve programming in Java. The tools that you need (Java 17, JavaFX, Eclipse) are available on the lab computers in Rosenberg 009 (reboot them to Linux) and Lansing 310, or you can install them on your own computer.

Information on how to set up your own computer will be provided in advance of the first programming assignment.


Assignments and Evaluation

Readings and Warmups: Readings introduce and augment material discussed in class, and warmups help you self-assess what concepts you understand from the reading and what needs further attention. Warmups are thus most effective when completed before class - they are due the night before the class for which the reading is listed so that points of confusion can be addressed in class. As these are meant as diagnostic tools and not reading quizzes, grading is based on submission rather than correctness, however, they will be more effective if you take them seriously and attempt to answer the questions correctly.

Homework and Programming Assignments: Hands-on practice is essential for learning and mastery, and homework problems provide an opportunity to tackle problems for yourself. To encourage timely engagement with the material and to support the process of skill-building, homeworks will typically be small (one or two problems) and assigned/due every class period, with (in most cases) an opportunity to revise and resubmit for credit after they have been handed back. Most homework will involve written solutions, but there will also be a few programming assignments.

Exams: Exams assess what you, individually, have mastered. There will be three midterm exams in the first half of the semester covering core skills and "toolbox elements" - analysis of algorithms, ADTs and data structures, and graphs and graph algorithms - and a final exam covering the design and development of data structures and algorithms. All will be take-home exams. The dates of the exams are on the schedule page. More details about each exam will be announced prior to the exam.

Grades: Final grades in this course will be computed as follows:

  • Homework and programming assignments: 50% (approx 40% homework and 10% programming assignments)
  • Exams: 40% (8% each midterm, 16% final)
  • Engagement: 10%

Engagement: Learning isn't a passive activity where you simply read about something or sit back and watch someone else do things; you need to work with the material by thinking about it, trying to apply it, asking questions about it, and so forth and you will get more out of the course and will be more successful if you are engaged in the course. "Engagement" covers aspects of participation in the course other than completing graded assignments and exams: warmups, attendance, contributing to class, and asking questions (on warmups, in class, at office hours). The minimum expectations for a passing engagement grade are that you complete 50% of the warmups and satisfy the attendance policy. For full credit (and your own learning), you should demonstrate greater engagement through some of the following: completing more warmups, missing fewer classes, participating in class, regularlying respond to "do you have questions?" prompts, coming to office hours, etc.

Extra Credit: There may be some opportunities to earn extra credit on homeworks, programming assignments, and exams by going above and beyond the requirements of the assignment and/or tackling some harder problems. You are encouraged to take advantage of these opportunities to challenge yourself!

If you are concerned about your grade, come to office hours to get help and be sure to take advantage of the revise and resubmit option for homework problems. Staying on top of things and seeking help as soon as possible when you need it is the best route to success.


Time Expectations

The expectations for this course are that you attend all scheduled class meetings (3 hours per week), spend approximately 8 hours per week (*) on average on additional work (readings and warmups, homework and programming assignments, exams, studying) outside of class, and attend at least 5 hours of problem sessions over the course of the semester. If you can't make it to the scheduled problem sessions, this expectation can also be satisfied by coming to office hours. (5 hours = e.g. one problem session every three weeks or a 20-minute office hours visit every week)

(*) The assigned work is intended to take about this much time, though your experience may vary. However, if you routinely spend much less time, you may not be successfully mastering the material, and if you routinely spend substantially more time, especially if you feel like you are spinning your wheels and not making progress, you should come to office hours for help.