Computer Science: Algorithms, Theory, and Machines

This course introduces the broader discipline of computer science to people having a basic familiarity with Java programming. It covers the second half of our book Computer Science: An Interdisciplinary Approach (the first half is covered in our Coursera course Computer Science: Programming with a Purpose, to be released in the fall of 2018). Our intent is to demystify computation and to build awareness about the substantial intellectual underpinnings and rich history of the field of computer science.

First, we introduce classic algorithms along with scientific techniques for evaluating performance, in the context of modern applications. Next, we introduce classic theoretical models that allow us to address fundamental questions about computation, such as computability, universality, and intractability. We conclude with machine architecture (including machine-language programming and its relationship to coding in Java) and logic design (including a full CPU design built from the ground up).

The course emphasizes the relationships between applications programming, the theory of computation, real computers, and the field's history and evolution, including the nature of the contributions of Boole, Shannon, Turing, von Neumann, and others.

Who is this class for? Learning to program is just a prerequisite for learning the fundamental precepts of computer science. This course is for people who know how to program and want a broad introduction to the discipline. It is based on the second half of our book Computer Science: An Interdisciplinary Approach.

Course Status

In Session 

What Learners Say

"Very pedagogical and enjoyable introduction to CS. Another great Princeton University Coursera course."

"Professors Sedgewick and Wayne succeed in explaining a lot of useful concepts in a very limited amount of time. The course requires you to dig deeper in the subject but it lays a very solid base for further knowledge development."

"This course is the perfect introduction to anybody who is interested in learning how a computer works from scratch. The first few weeks cover some important algorithms and data structures which are at the heart of our computational infrastructure. The latter half covers theoretical concepts like the Turing Machine, Intractability and the design of the CPU. Programming assignments would have made the course more challenging and fun. But in a nutshell, I highly recommend this course to any person looking for an introductory computer science course which covers some important topics in the vast domain of computer science."