This follow-on course to data structures (e.g., EN.605.202 Data Structures) providing a survey of computer algorithms, examines fundamental techniques in algorithm design and analysis, and develops problem-solving skills required in all programs of study involving data science. Topics include advanced data structures for data science (tree structures, disjoint set data structures), algorithm analysis and computational complexity (recurrence relations, big-O notation, introduction to complexity classes (P, NP and NP-completeness)), data transformations (FFTs, principal component analysis), design paradigms (divide and conquer, greedy heuristic, dynamic programming), and graph algorithms (depth-first and breadth-first search, ordered and unordered trees). Advanced topics are selected from among the following: approximation algorithms, computational geometry, data preprocessing methods, data analysis, linear programming, multi-threaded algorithms, matrix operations, and statistical learning methods. The course will draw on applications from Data Science. Course Prerequisite(s): EN.605.202 Data Structures or equivalent, and EN.605.201 Introduction to Programming Using Java or equivalent. EN.605.203 Discrete Mathematics or equivalent is recommended. Course Note(s): This required foundation course must be taken before other 605.xxx courses in the degree. This course does not satisfy the foundation course requirement for Bioinformatics, Computer Science, or Cybersecurity. Students can only earn credit for one of EN.605.620, EN.605.621, or EN.685.621.