There has been much recent progress in approximation algorithms for nonconvex continuous and discrete problems, from both a theoretical and a practical perspective. In discrete (or combinatorial) optimization many approaches have been developed recently that link the discrete universe to the continuous universe through geometric, analytic, and algebraic techniques. Such techniques include global optimization formulations, semidefinite programming, and spectral theory. As a result new approximate algorithms have been discovered and many new computational approaches have been developed. Similarly, for many continuous nonconvex optimization problems, new approximate algorithms have been developed based on semidefinite programming and new randomization techniques. On the other hand, computational complexity, originating from the interactions between computer science and numerical optimization, is one of the major theories that have revolutionized the approach to solving optimization problems and to analyzing their intrinsic difficulty. The main focus of complexity is the study of whether existing algorithms are efficient for the solution of problems, and which problems are likely to be tractable. The quest for developing efficient algorithms leads also to elegant general approaches for solving optimization problems, and reveals surprising connections among problems and their solutions. The two themes of approximation and complexity pervade this book. Audience: Faculty, graduate students, and researchers in mathematical programming, computer sciences and engineering.