The aim of the course is to provide students with the fundamental skills needed to develop algorithms using data structures and analyze their correctness and efficiency, so that they will be able to
• design programs that use computer resources efficiently,
• realize that there are problems that are impractical or even
impossible to solve by a computer.
The course is devoted to identify clean algorithmic problem formulations in complex issues from different areas of computing and, from this, how to design efficient algorithms for the resulting problems.
The students will be trained to apply algorithms mainly to process Graphs. The notions of computability and complexity will let the students acquire a strong formal tool to recognize when a problem is inherently complex independently of any algorithm developed to solve the problem. Since so many natural problems in computer science are NP-complete, the development of methods to deal with intractable problems has become a crucial issue in the study of algorithms. Thus, the course presents various solutions to tackle inherently complex problems by either designing an exact algorithm or try to approximate the problem or to find a randomized technique.