Table of Contents

Copyright

Brief Table of Contents

Table of Contents

Preface

Acknowledgments

About this Book

Chapter 1. Introduction to Algorithms

Introduction

What you’ll learn about performance

What you’ll learn about solving problems

Binary search

A better way to search

Exercises

Running time

Big O notation

Algorithm running times grow at different rates

Visualizing different Big O run times

Big O establishes a worst-case run time

Some common Big O run times

Exercises

The traveling salesperson

Recap

Chapter 2. Selection Sort

How memory works

Arrays and linked lists

Linked lists

Arrays

Terminology

Exercise

Inserting into the middle of a list

Deletions

Exercises

Selection sort

Example Code Listing

Recap

Chapter 3. Recursion

Recursion

Base case and recursive case

The stack

The call stack

Exercise

The call stack with recursion

Exercise

Recap

Chapter 4. Quicksort

Divide & conquer

Exercises

Quicksort

Big O notation revisited

Merge sort vs. quicksort

Average case vs. worst case

Exercises

Recap

Chapter 5. Hash Tables

Hash functions

Exercises

Use cases

Using hash tables for lookups

Preventing duplicate entries

Using hash tables as a cache

Recap

Collisions

Performance

Load factor

A good hash function

Exercises

Recap

Chapter 6. Breadth-first Search

Introduction to graphs

What is a graph?

Breadth-first search

Finding the shortest path

Queues

Exercises

Implementing the graph

Implementing the algorithm

Running time

Exercise

Recap

Chapter 7. Dijkstra’s algorithm

Working with Dijkstra’s algorithm

Terminology

Trading for a piano

Negative-weight edges

Implementation

Exercise

Recap

Chapter 8. Greedy algorithms

The classroom scheduling problem

The knapsack problem

Exercises

The set-covering problem

Approximation algorithms

Exercises

NP-complete problems

Traveling salesperson, step by step

How do you tell if a problem is NP-complete?

Exercises

Recap

Chapter 9. Dynamic programming

The knapsack problem

The simple solution

Dynamic programming

Knapsack problem FAQ

What happens if you add an item?

Exercise

What happens if you change the order of the rows?

Can you fill in the grid column-wise instead of row-wise?

What happens if you add a smaller item?

Can you steal fractions of an item?

Optimizing your travel itinerary

Handling items that depend on each other

Is it possible that the solution will require more than two sub-knapsacks?

Is it possible that the best solution doesn’t fill the knapsack completely?

Exercise

Longest common substring

Making the grid

Filling in the grid

The solution

Longest common subsequence

Longest common subsequence—solution

Exercise

Recap

Chapter 10. K-nearest neighbors

Classifying oranges vs. grapefruit

Building a recommendations system

Feature extraction

Exercises

Regression

Picking good features

Exercise

Introduction to machine learning

OCR

Building a spam filter

Predicting the stock market

Recap

Chapter 11. Where to go next

Trees

Inverted indexes

The Fourier transform

Parallel algorithms

MapReduce

Why are distributed algorithms useful?

The map function

The reduce function

Bloom filters and HyperLogLog

Bloom filters

HyperLogLog

The SHA algorithms

Comparing files

Checking passwords

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

Index