This course explores algorithms for problem solving in the real world. Emphasis is provided on extending known results by employing computational thinking to solve new problems. Formal techniques for proving correctness and analyzing the performance of algorithms will also be discussed. Hardness results, approximation and randomized algorithms will also be briefly surveyed in the course. The course will emphasize on parallel thinking and implementation of algorithms on existing and emerging parallel computer architectures.
Classification of algorithms, e.g., recursive, divide-and-conquer, greedy, etc. Data Structures and algorithm design and performance. Time and space complexity analysis.