Jurgen Schmidhuber
Scientific director of the Dalle Molle Institute for Artificial Intelligence (IDSIA) Research in Lugano, in Ticino in southern Switzerland, and Professor of Artificial Intelligence (Ordinarius) at the Faculty of Computer Science at the University of Lugano., Ph.D. - Technical University of Munich.

Note: the following books are not recommended by Professor Schmidhuber. They are books that have been used as reference texts in one/some courses he has taught.

Computational complexity is a branch of theoretical computer science that deals with the study of the resources required by algorithms to solve computational problems. It is concerned with the amount of resources, such as time and memory, that an algorithm needs to solve a problem of a given size. This is measured by the algorithm’s time complexity, which is a function that describes the running time of the algorithm as a function of the size of the input.

Complexity theory is a field of study that deals with the classification of computational problems according to their complexity. The most commonly used classification is the one based on the complexity class, which is a set of problems that can be solved by an algorithm with a similar time complexity. For example, the complexity class P contains all problems that can be solved in polynomial time, while the complexity class NP contains all problems that can be verified in polynomial time.

One of the most important concepts in complexity theory is the P versus NP problem, which is one of the seven Millennium Prize Problems. This problem asks whether all problems in the complexity class NP can also be solved in polynomial time, which would mean that P = NP. If this were true, it would have significant implications for the field of computer science, as it would mean that many problems that are currently considered intractable could be solved efficiently.

Another important concept in complexity theory is the theory of NP-completeness, which deals with the difficulty of solving problems in the complexity class NP. A problem is NP-complete if it is at least as hard as the hardest problem in NP. This means that an algorithm that can solve an NP-complete problem can also solve any other problem in NP in polynomial time.

The theory of NP-completeness plays a key role in the study of the complexity of algorithms and has important implications for the design and analysis of algorithms. It allows us to determine the complexity of a problem by reducing it to a known NP-complete problem, rather than having to find an algorithm for the problem itself.

In the field of quantum computing, the concept of quantum complexity theory is also studied, it deals with the complexity of problems that can be solved by quantum computers. It is a subfield of computational complexity and explores the advantages and limitations of quantum algorithms, as well as the relationship between quantum and classical complexity classes.

In conclusion, computational complexity and complexity theory are important branches of theoretical computer science that deal with the study of the resources required by algorithms to solve computational problems. They provide a framework for the classification of computational problems according to their complexity, and they have important implications for the design and analysis of algorithms, as well as the field of quantum computing.