Author: Liang Huang

This book is intended for an introductory course on the design and analysis of algorithms, assuming that students have already taken a data structures course and are comfortable with recursion and big-\(O\) notations. We also assume that students are fluent in at least one of the three major languages: C/C++, Java, and Python. All coding examples are given in Python.

- Chapter 1: Data Structures
- 1.1: Quicksort and Binary Search Tree
- 1.2: Average-Case Analysis of Quicksort
- 1.3: Quickselect
- 1.4: Mergesort
- 1.5: Advanced Divide-n-Conquer: Recursion with byproduct
- 1.6: Priority queue and Binary Heap
- 1.7: Applications of Heap
- 1.8: Lowerbound of Sorting

- Chapter 2: Dynamic Programming
- 2.1: From Fibonacci to Bitstrings to Max Independent Set
- 2.2: Interpretations of DP: divide-n-conquer, graph, and semiring
- 2.3: DP beyond graphs; further interpretations of DP
- 2.4: Knapsack: Unbounded, 0-1, and Bounded
- 2.5: RNA Folding

- Chapter 3: Graph Algorithms
- 3.1: Graph Classifications and Representations
- 3.2: BFS & DFS
- 3.3: Topological Sort
- 3.4: Viterbi algorithm and General DP
- 3.5: Dijkstra’s algorithm for shortest-path
- 3.6: Prim’s algorithm for minimum spanning-tree