Data Structures and Algorithms
Professor | Dr K Darcy Otto |
Title | Data Structures and Algorithms |
Code | CS 4388 |
Credits | 4 |
Term | Fall 2025 |
Times | Tues/Fri 14h10–16h00 |
Location | Dickinson 239 |
Delivery | Fully in-person |
Contact | |
Office Hours | Mon/Thurs 13h00-14h00, or by appointment |
How do we organize data to solve complex problems efficiently? This course studies the fundamental structures and algorithms that form the cornerstone of computational problem-solving. Building upon the programming foundations established in CS1, we will explore how algorithmic thinking and sophisticated data organization enables us to tackle increasingly challenging computational problems.
In this course, you will analyze how fast algorithms run and how much memory they use. These are skills you need to write programs that actually work on real data. You will implement classic data structures like arrays, lists, hash tables, trees, graphs, and stacks, and figure out when to use each one. The exercises we study will teach you to pick the right algorithmic approach for different problems.
We balances theory with hands-on implementation using the Racket language. You’ll get better at programming while learning to recognize elegant solutions. This course is a prerequisite for Artificial Intelligence.
Midterm | 35% | Comprehensive |
Final Examination | 45% | Comprehensive |
Engagement | 20% | Participation, Exercises |
Midterm and Final Examination: Both tests will cover everything we’ve discussed in class and read about. You’ll see conceptual questions, complexity analysis problems, and algorithm design challenges.
Engagement: Your engagement grade comes from completing exercises on time, active participation, and showing up regularly. The exercises are based on our readings, and are listed on the class schedule.
We use Racket because its clean presentation lets you focus on algorithms instead of fighting with syntax. More importantly, functional programming forces you to think recursively, which is exactly how many of the most powerful algorithms work. Tree traversals, graph searches, divide-and-conquer algorithms: they all become clearer when you’re not constantly mutating variables and tracking state.
Racket stands in the tradition of languages like Lisp and Scheme: languages created to explore the deepest ideas of computer science, not just to follow industry trends. Dijkstra once said that Lisp has been called “the most intelligent way to misuse a computer,” and he meant it as a compliment because “it has assisted a number of our most gifted fellow humans in thinking previously impossible thoughts.” That’s what we’re after here. Using Racket will change how you think about algorithmic problems, often revealing solutions that mirror the logical structure of the problems themselves.
Download Racket from here. There are versions for all modern Macs, Linux machines, and Windows. The file name will look something like:
racket-8.x-aarch64-macosx-cs.dmg
on an Apple Silicon Macracket-8.x-x86_64-macosx-cs.dmg
on an Intel Macracket-8.x-x86_64-win32-cs.exe
on a PCracket-8.x-x86_64-linux-cs.sh
on Linux
Install Racket: On a Mac, open the .dmg
file and drag the Racket folder to Applications. On a PC, run the .exe
installer and follow the prompts. On Linux, open a terminal and run: sh racket-8.x-x86_64-linux-cs.sh
.
Start DrRacket: On a Mac: this is in the Racket folder of your Applications list. If your computer complains that DrRacket is not from a “trusted developer,” go into the Finder, then Applications, right-click DrRacket, and click “Open” to bypass this. You only need to do this once. On a PC: this is in the Racket folder of your Applications list. On Linux: after installation, you can usually start DrRacket from your Applications menu. If not, open a terminal and run: drracket &
Lab computers in Dickinson have DrRacket pre-installed, if you prefer not to install it on your personal machine. You can also use them as a backup if your installation runs into problems.
Artificial intelligence can generate code, but it cannot decide what problems are worth solving, nor judge whether a solution is effective, ethical, or just. Computer science is less about mastering tools than about cultivating the habits of mind that let us interpret, understand, and evaluate. It asks how abstractions shape systems, how systems shape society, and how we might imagine technology serving human flourishing rather than undermining it. To study CS is therefore not only to learn how machines work, but to engage in broader questions about seeing clearly, reasoning correctly, and imagining responsibly in a world increasingly shaped by computation.
An overarching objective of this course is to help you develop as a student of the liberal arts. True students of the liberal arts are able to reflect on the context in which they live, and reason about what it means to live a meaningful and happy life. Thus, they are able to be more than just children of their own time. But this means we must be willing to put our ideas to the test, see our own errors, and develop intellectual courage and humility. It also helps not to take ourselves too seriously.