Parallel Algorithms
Use when analyzing fork-join parallel algorithms, work/span bounds, greedy scheduling, slackness, determinacy races, parallel loops, matrix multiplication, merge sort, reductions, scans, stencils, or randomized parallel algorithms.
Probabilistic Analysis And Randomized Algorithms
Use when analyzing randomized algorithms, probabilistic analysis, indicator random variables, hiring and secretary problems, random permutations, balls-and-bins, birthday paradox, streaks, or average-case versus expected-time reasoning.
Machine Learning Algorithms
Use when answering CLRS-style machine-learning algorithm questions about k-means clustering, Lloyd's procedure, multiplicative weights, weighted majority, online experts, gradient descent, projected gradient descent, convex optimization, linear regression, or regularization.
B Trees
Use when reasoning about B-trees, external-memory indexes, disk-block search trees, 2-3-4 trees, B-tree height bounds, node splits, top-down insertion, deletion cases, or database/storage index choices.
Minimun Spanning Trees
Use when solving, proving, implementing, or reviewing minimum spanning tree problems, including safe edges, cuts, light edges, Kruskal, Prim, union-find, priority queues, bottleneck trees, second-best trees, or MST update questions.
Amortized Algorithms
Use when analyzing sequences of data-structure operations with aggregate analysis, accounting credits, potential functions, binary counters, multipop stacks, dynamic tables, resizing policies, or amortized versus average-case reasoning
Online Algorithms
Use when analyzing online algorithms, competitive analysis, adversarial input, list update with move-to-front, online caching, paging, randomized marking, or ski-rental/elevator-style rent-or-buy decisions.
Tapl
TaPL; the foundational computer science textbook "Types and Programming Languages" by Benjamin Pierce, covering type systems, programming language theory, lambda calculus, and more.
Greedy Algorithms
Use when solving or proving greedy algorithms, including activity selection, fractional knapsack, Huffman coding, offline caching, exchange arguments, greedy-choice property, optimal substructure, or deciding whether dynamic programming is required instead.
Binary Search Trees
Use when reasoning about binary search trees, red-black trees, ordered dynamic sets, predecessor or successor queries, transplant-based deletion, rotations, balance invariants, or production ordered-container choices.
Linear Programming
Use when formulating, solving, proving, or reviewing linear-programming models, including standard form, feasibility, boundedness, simplex intuition, graph and flow LPs, duality, weak or strong duality, Farkas certificates, complementary slackness, or integer-LP caveats.
Characterizing Running Times
Use when analyzing algorithm running time, asymptotic notation, Big O, Omega, Theta, little-o, little-omega, growth-rate comparisons, loop bounds, recurrence terms, or textbook-style asymptotic exercises.
Elementary Graph Algorithms
Use when representing graphs or solving graph-search problems with adjacency lists, adjacency matrices, breadth-first search, depth-first search, topological sorting, strongly connected components, edge classification, reachability, articulation points, bridges, biconnected components, or Euler tours.
Matrix Operations
Use when solving CLRS-style matrix-operation problems involving linear systems, LU or LUP decomposition, pivoting, matrix inversion, symmetric positive-definite matrices, Schur complements, least-squares approximation, normal equations, pseudoinverses, or tridiagonal systems.
Np Completeness
Use when classifying decision problems as P, NP, NP-hard, NP-complete, or co-NP; proving polynomial-time reductions; reviewing SAT, 3-CNF-SAT, CLIQUE, VERTEX-COVER, HAM-CYCLE, TSP, SUBSET-SUM, encoding, or pseudo-polynomial complexity arguments.
Divide And Conquer
Use when analyzing divide-and-conquer algorithms, solving recurrences, applying Master theorem or Akra-Bazzi, using recursion trees or substitution, comparing matrix multiplication with Strassen, or checking theorem applicability under misleading shortcuts.
Hash Tables
Use when choosing, analyzing, or implementing hash tables, direct addressing, chaining, open addressing, universal hashing, load factors, probe bounds, deletion behavior, or cache-aware dictionary design under practical engineering constraints.
Matchings In Biparite Graphs
Use when solving, proving, implementing, or reviewing bipartite matching, Hopcroft-Karp, stable marriage, Gale-Shapley, Hungarian assignment, feasible labels, equality subgraphs, or augmenting-path matching arguments.
Sorting And Order Statistics
Use when choosing or analyzing sorting, heaps, priority queues, linear-time integer/distribution sorting, quicksort, selection, medians, quantiles, top-k, or order-statistic algorithms under practical engineering constraints.
Dynamic Programming
Use when solving dynamic programming problems, deriving optimal substructure recurrences, choosing memoization or bottom-up tables, reconstructing optimal choices, analyzing overlapping subproblems, LCS, matrix-chain multiplication, rod cutting, optimal BSTs, or DP production tradeoffs.
Polynomials And Fft
Use when multiplying polynomials, using coefficient or point-value representations, applying DFT or FFT, reasoning about roots of unity, convolution, FFT circuits, or exact modular Fourier transforms.
Csapp
CSAPP; "Computer Systems A Programmer's Perspective" by Randal E. Bryant and David R. O'Hallaron, covering computer architecture, systems programming, and performance optimization.
Sicp
SICP; the classic computer science textbook "Structure and Interpretation of Computer Programs" by Harold Abelson and Gerald Jay Sussman.
Maximum Flow
Use when solving, proving, implementing, or reviewing flow-network problems, including maximum flow, residual networks, augmenting paths, cuts, Ford-Fulkerson, Edmonds-Karp, bipartite matching reductions, vertex capacities, multiple sources and sinks, or min-cut certificates.
Clrs
Use when working with CLRS, Introduction to Algorithms by Cormen, Leiserson, Rivest, and Stein, including algorithm design, data structures, asymptotic analysis, recurrences, proof style, or textbook-grounded algorithm explanations.
Elementary Data Structures
Use when reasoning about elementary data structures, dynamic sets, arrays, matrices, stacks, queues, linked lists, sentinels, rooted trees, representation choices, invariants, locality, or pointer-based tradeoffs under practical engineering constraints.
Shortest Paths
Use when solving, proving, implementing, or reviewing weighted shortest-path problems, including single-source or all-pairs shortest paths, relaxation, negative edges or cycles, Dijkstra, Bellman-Ford, DAG paths, Floyd-Warshall, Johnson, difference constraints, transitive closure, arbitrage, or graph-path reductions.
Approximation Algorithms
Use when approximating NP-hard optimization problems, proving approximation ratios, checking PTAS or FPTAS claims, or reviewing CLRS vertex cover, metric TSP, set cover, randomized MAX-3-CNF, LP rounding, subset-sum trimming, bin packing, scheduling, clique, matching, spanning-tree, or knapsack approximation arguments.
String Matching
Use when solving exact pattern search, rolling-hash matching, finite-automaton matching, KMP prefix-function problems, suffix-array queries, LCP-array tasks, longest repeated/common substring problems, cyclic rotation tests, or Burrows-Wheeler transform exercises.
Data Structures For Disjoint Sets
Use when disjoint sets, union-find, dynamic connectivity, connected components, weighted union, union by rank, path compression, inverse Ackermann bounds, linked-list set representations, offline minimum, or offline LCA reasoning appears.
Augmenting Data Structures
Use when augmenting balanced trees or dynamic sets with maintained metadata, order-statistic trees, interval trees, rank/select queries, overlap search, red-black-tree augmentation theorems, or production choices around custom indexed structures.