Since the very beginning of computer science, the efficiency of computation has been a central topic. Concrete applicability of a computational method is heavily influenced by differences in the required resources (e.g. running time and memory space). The field of Computational Complexity studies such differences, and can be considered the dual of research on algorithm. While algorithm research studies ways of solving problems efficiently, computational complexity tries to understand what is the boundary of such exploration. It is not surprise that the two fields are deeply interconnected in meanings and methods.
Computational complexity is an highly dynamic and young field. Major questions have not yet been solved and we aren't even close to spot their weak points. Nevertheless the search of new mathematical tools and strategies brought to light an impressive amount of results about connections with cryptography, interactive systems and the nature of randomness.