C++ Data Structures and Algorithm Design Principles
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