Introduction to Algorithms (IALG) course is designed to introduce the algorithmic approach to programming. Data-structures and algorithms together form a solid base on which one can easily build programming expertise. Each algorithm is explained in detail, its usage and data-structure requirements. Implementations are discussed in C++ and STL implementation (if available) is discussed.
Design and analysis techniques such as greedy algorithms, amortized analysis and dynamic programming are discussed. Exponential complexity algorithms are introduced and approximate solutions touched upon. The course has various exercises around algorithms. The course can be completed in around two weeks time.
We also suggest you to go through our blog on Art of Programming: Data Structures to gain an insight into why it makes sense to learn more about data structures and algorithms.
Strong focus on hands-on programming experience
Gain insight into how to choose the right algorithm for your programming problem
Familiarity with C++ algorithm libraries
Discuss with the instructors on the forums as much as you want
Instructors and Forum Moderators
This course is taught by Anup Gangwar and Basant Dwivedi. They will be moderating the course forums as well as lead the contact sessions.
This course assumes a sufficient background in the 'C++' programming language, familiarity with Linux and good exposure to data-structures. If you have experience in working with any other UNIX system, then it is fine too. We recommend that you take up the courses User Level Linux, Programming With C++ and Data Structures to gain sufficient background before taking up this course.
Who should take the course
Students who want to learn algorithms used on a day-to-day basis in the industry
Job seekers or fresh hires who are looking forward to or starting a career in Embedded Systems, Electronic Design Automation, Networking, Databases or any other high-tech area having little or no programming experience of algorithms
This course is at beginners level. Most of the topics are treated with programming point of view. Focus is to expose you with the common algorithms, their complexity, basic idea behind these algorithms and popular algorithm design techniques. However, detailed theory behind individual algorihtms are not discussed. There are excellent text books such as "Introduction to Algorithms by Thomas H. Cormen et al." for detailed theory and proofs.
The first few sections provide the background which is necessary for further sections. Subsequent sections pick up one algorithm and delve deeper providing C++ as well as STL implementations wherever available. Table of content for this course is as follows.
What is a data structure
Why learn data structures
Integrating data structures in the program design
Asymptotic growth of functions
Commonly used functions and notations
Pseudo code conventions
Analysis of Data Structures
What should be analyzed
Memory usage analysis
Memory access analysis
What is sorting
Where is sorting used
Why is it important to have efficient sorting
Sorting - Merge Sort
Sorting - Quick Sort
Sorting - Heap Sort
What is search
Where is search used
Why is it important to have efficient search
Searching - Binary Search
Pseudo code - array implementation
Pseudo code - BST implementation
What are graph algorithms
Where are graph algorithms used
Why is it important to have efficient graph algorithms
Graph Algorithms - Topological sorting
Graph Algorithms - Connected components
Graph Algorithms - Dijkstra Algorithm
String Matching Algorithms
When will greedy strategy work
When to apply dynamic programming
STL vector analysis
Exponential Complexity Algorithms
The objective of this course as outlined above is to help you understand common algorithms and how to write programs around them. After finishing this course, you will be able to pick the right algorithm or design new ones for your programming problems. You will also be able to perform analysis and make appropriate trade-offs.