The course covers data structures and techniques for constructing efficient algorithms, including their analysis with respect to efficiency. It stresses the importance of adapting standard algorithms and data structures to the peculiarities of both the given problem and the underlying hardware, because efficiency does not only depend on the intrinsic asymptotic efficiency of an algorithm, but also on the context in which it is applied.
Typical algorithmic techniques are divide-and-conquer, greedy methods, and dynamic programming. As efficient data structures form the basis for many of these techniques, important data structures, their analysis and advantages and disadvantages depending on circumstances are covered as well. Examples of data structures to be covered are heaps, disjoint sets, and tree data structures.