This course will introduce the basic principles and techniques for the design, analysis, and implementation of efficient algorithms and data representations.
It will first define the concept of algorithm and discuss the differences between decision and optimization algorithms. It will then introduce the asymptotic notation for analyzing the efficiency of algorithms and formal methods for establishing their correctness.
The core of the course will then be a discussion of several algorithmic techniques, including greedy algorithms, dynamic programming, integer linear programming, recursion, and divide-and-conquer methods, with examples of applications to combinatorial structures, such as numbers, sets, and graphs. Data structures supporting these techniques will be considered, including arrays, stacks, and queues. The course will be concluded with an introduction to complexity theory and the notion of the hardness of problems, and with a brief analysis of the additional challenges posed by Big Data from the algorithmic perspective.