Goal of this course is to help you understand existing and to design new data structures and algorithms. This course is suitable for working professionals willing to relearn and refresh their algorithmic thinking skills and to those searching for jobs. The course would be quite rigorous where we shall focus on run time complexity and correctness proofs for all the algorithms. Knowledge of any programming language (trainer's preference would be C Language) is assumed along with some mathematical maturity.
Following skills can be acquired by taking this course:
- Argue the correctness of algorithms using inductive proofs and invariants
- Analyze worst-case running times of algorithms using asymptotic analysis
- Describe the divide-and-conquer paradigm and explain when an algorithmic design situation calls for it. Recite algorithms that employ this paradigm. Synthesize divide-and-conquer algorithms. Derive and solve recurrences describing the performance of divide-and-conquer algorithms.
- Describe the dynamic-programming paradigm and explain when an algorithmic design situation calls for it. Recite algorithms that employ this paradigm. Synthesize dynamic-programming algorithms, and analyze them.
- Describe the greedy paradigm and explain when an algorithmic design situation calls for it. Recite algorithms that employ this paradigm. Synthesize greedy algorithms, and analyze them
- Explain the major graph algorithms and their analyses. Employ graphs to model engineering problems, when appropriate. Synthesize new graph algorithms and algorithms that employ graph computations as key components, and analyze them.