This course emphasizes fundamental algorithms and advanced methods of algorithmic design, analysis and implementation. This class overs techniques used to analyze problems and algorithms (including asymptotic, upper/lower bounds, best/average/worst case analysis, amortized analysis, complexity), basic techniques used to design algorithms (including divide and conquer/greedy/dynamic programming/heuristics, choosing appropriate data structures) and important classical algorithms (including sorting, string, matrix, and graph algorithms) and data structures.