C++ Data Structures and Algorithm Design Principles
Course Description Overview
C++ is a mature multi-paradigm programming language that enables you to write high-level code with a high degree of control over the hardware. Today, significant parts of software infrastructure, including databases, browsers, multimedia frameworks, and GUI toolkits, are written in C++.
This course starts by introducing C++ data structures and how to store data using linked lists, arrays, stacks, and queues. In later chapters, the course explains the basic algorithm design paradigms, such as the greedy approach and the divide-and-conquer approach, which are used to solve a large variety of computational problems. Finally, you will learn the advanced technique of dynamic programming to develop optimized implementations of several algorithms discussed in the course.
By the end of this course, you will have learned how to implement standard data structures and algorithms in efficient and scalable C++ 14 code.
After completing this course, you will be able to:
- Build applications using hash tables, dictionaries, and sets
- Implement a URL shortening service using a bloom filter
- Apply common algorithms such as heapsort and merge sort for string data types
- Use C++ template metaprogramming to write code libraries
- Explore how modern hardware affects the actual run-time performance of programs
- Use appropriate modern C++ idioms like std::array instead of C-style arrays
We also recommend that you have the following software installed in advance:
- Operating system: Windows 7 SP1 32/64-bit, Windows 8.1 32/64-bit or Windows 10 32/64-bit, Ubuntu 14.04 or later, or macOS Sierra or later
- Browser: Google Chrome or Mozilla Firefox
- Any modern compiler and IDE (optional) that supports the C++ 14 standard
For the optimal student experience, we recommend the following hardware
configuration:
- Any entry-level PC/Mac with Windows, Linux, or macOS is sufficient
- Processor: Intel Core 2 Duo, Athlon X2, or better
- Memory: 4 GB RAM
- Storage: 10 GB available space
Lesson 1: Lists, Stacks, and Queues
- Contiguous Versus Linked Data Structures
- std::array
- std::vector
- std::forward_list
- Iterators
- std::list
- std::deque
- Container Adapters
- Benchmarking
Lesson 2: Trees, Heaps, and Graphs
- Non-Linear Problems
- Tree – It's Upside Down!
- Variants of Trees
- Heaps
- Graphs
Lesson 3: Hash Tables and Bloom Filters
- Hash Tables
- Collisions in Hash Tables
- C++ Hash Tables
- Bloom Filters
Lesson 4: Divide and Conquer
- Binary Search
- Understanding the Divide-and-Conquer Approach
- Sorting Using Divide and Conquer
- C++ Standard Library Tools for Divide and Conquer
- Dividing and Conquering at a Higher Abstraction Level – MapReduce
Lesson 5: Greedy Algorithms
- Basic Greedy Algorithms
- The Knapsack Problem(s)
- The Vertex Coloring Problem
Lesson 6: Graph Algorithms I
- The Graph Traversal Problem
- Prim's MST Algorithm
- Dijkstra's Shortest Path Algorithm
Lesson 7: Graph Algorithms II
- Revisiting the Shortest Path Problem
- The Bellman-Ford Algorithm
- The Bellman-Ford Algorithm (Part II) – Negative Weight Cycles
- Johnson's Algorithm
- Strongly Connected Components
- Kosaraju's Algorithm
- Choosing the Right Approach
Lesson 8: Dynamic Programming I
- What Is Dynamic Programming?
- Memoization – the Top-Down Approach
- Tabulation – the Bottom-Up Approach
- Subset Sum Problem
- Dynamic Programming on Strings and Sequences
Lesson 9: Dynamic Programming II
- An Overview of P Versus NP
- Reconsidering the Subset Sum Problem
- The Knapsack Problem
- Graphs and Dynamic Programming