This module studies techniques, such as dynamic programming and recursion, used for the design and analysis of algorithms and data structures. Some fundamental algorithmic problems are studied, such as searching, sorting and network flows and efficient algorithms for such problems. The emphasis of this module is on problem solving using efficient algorithms together with their formal analysis and implementation, thus enhancing the students’ toolbox for efficient programming.