This course introduces the fundamental principles of algorithms and algorithmic thinking. It focuses on how to design efficient algorithms, analyze their correctness and performance, and apply them to solve real-world computational problems. Students will learn how to compare algorithmic solutions, reason about time and space complexity, and select appropriate data structures to support algorithm design.
Course Outline
- Introduction to Algorithms
- What is an algorithm?
- Why algorithms matter
- Algorithmic problem-solving mindset
- Algorithm Analysis
- Time complexity and space complexity
- Big-O, Big-Ω, and Big-Θ notation
- Best, average, and worst-case analysis
- Basic Data Structures
- Arrays and strings
- Stacks and queues
- Linked lists
- Introduction to hash tables
- Algorithm Design Techniques
- Brute force
- Divide and conquer
- Greedy algorithms
- Introduction to dynamic programming
- Searching Algorithms
- Linear search
- Binary search
- Performance comparison
- Sorting Algorithms
- Bubble, Selection, and Insertion sort
- Merge sort and Quick sort
- Stability and efficiency trade-offs
- Recursion
- Recursive thinking
- Base cases and recursion trees
- Recursive vs iterative solutions
- Introduction to Graph Algorithms
- Graph representation
- Depth-First Search (DFS)
- Breadth-First Search (BFS)
- Algorithm Correctness
- Proving correctness
- Loop invariants
- Common algorithmic pitfalls
- Practical Applications
- Real-world algorithm examples
- Choosing the right algorithm
- Performance considerations in software systems

