Table of contents Content Introduction to Algorithms Introduction Binary Search Big O notation Recap Selection sort How memory works Arrays and linked lists Selection sort Recap Recursion Recursion Base case and recursive case The stack Recap Quicksort Divide & conquer Quicksort Big O notation revisited Recap Hash tables Hash functions Use cases Collisions Performance Recap Breadth-first search Introduction to graph What is a graph Breadth-first search Implementing the graph Implementing the algorithm Recap Dijkstra's algorithm Working with Dijkstra's algorithm Terminology Trading for a piano Negative-weight edges Implementation Recap Greedy Algorithms The classroom scheduling problem The knapsack problem The set-covering problem NP-complete problems Traveling salesperson, step by step Recap Dynamic programming The knapsack problem Knapsack problem FAQ Longest common substring Recap K-nearest neighbors Classifying oranges vs. grapefruit Building a recommendations system Introduction to machine learning Recap Where to go next Trees Inverted indexes The Fourier transform Parallel algorithms MapReduce Bloom filters and HyperLogLog The SHA algorithms Locality-sensitive hashing Diffie-Hellman key exchange Linear programming Epilogue Answers to exercises Chapter 1 Chapter 2 Chapter 3 Chapter 4 Chapter 5 Chapter 6 Chapter 7 Chapter 8 Chapter 9 Chapter 10