Algorithmic design, especially for hard problems, is more essential for
success in solving them than any standard improvement of current
computer tech- nologies. Because of this, the design of algorithms for
solving hard problems is the core of current algorithmic research from
the theoretical point of view as well as from the practical point of
view. There are many general text books on algorithmics, and several
specialized books devoted to particular approaches such as local search,
randomization, approximation algorithms, or heuristics. But there is no
textbook that focuses on the design of algorithms for hard computing
tasks, and that systematically explains, combines, and compares the main
possibilities for attacking hard algorithmic problems. As this topic is
fundamental for computer science, this book tries to close this gap.
Another motivation, and probably the main reason for writing this book,
is connected to education. The considered area has developed very
dynami- cally in recent years and the research on this topic discovered
several profound results, new concepts, and new methods. Some of the
achieved contributions are so fundamental that one can speak about
paradigms which should be in- cluded in the education of every computer
science student. Unfortunately, this is very far from reality. This is
because these paradigms are not sufficiently known in the computer
science community, and so they are insufficiently com- municated to
students and practitioners.