Starting from the basics of computability, this undergraduate introduction focuses on the P versus NP Question and the theory of NP-completeness.This undergraduate introduction to computational complexity offers a wide perspective on two central issues in theoretical computer science. The book starts with the relevant background in computability, including Turing machines, search and decision problems, algorithms, circuits, and complexity classes, and then focuses on the P-versus-NP Question and the theory of NP-completeness.This undergraduate introduction to computational complexity offers a wide perspective on two central issues in theoretical computer science. The book starts with the relevant background in computability, including Turing machines, search and decision problems, algorithms, circuits, and complexity classes, and then focuses on the P-versus-NP Question and the theory of NP-completeness.The focus of this book is the P-versus-NP Question and the theory of NP-completeness. It also provides adequate preliminaries regarding computational problems and computational models. The P-versus-NP Question asks whether or not finding solutions is harder than checking the correctness of solutions. An alternative formulation asks whether or not discovering proofs is harder than verifying their correctness. It is widely believed that the answer to these equivalent formulations is positive, and this is captured by saying that P is different from NP. Although the P-versus-NP Question remains unresolved, the theory of NP-completeness offers evidence for the intractability of specific problems in NP by showing that they are universal for the entire class. Amazingly enough, NP-complete problems exist, and furthermore hundreds of natural computational problems arising in many different areas of mathematics and science are NP-complete.1. Computational tasks and models; 2. The P versus NP Question; 3. Polynomial-time reductions; 4. NP-completeness; 5. Three relatively adlÕ