| name | computer-science-algorithms |
| description | Choosing or implementing an algorithm or data structure — asymptotic complexity, data-structure selection, sorting & searching, dynamic programming, graph algorithms, divide & conquer, greedy algorithms, string/sequence algorithms, and the at-scale toolbox (Bloom filters, HyperLogLog, Count-Min Sketch, reservoir sampling, consistent hashing, external merge sort, Aho-Corasick, MinHash/LSH). Trigger on tasks involving "what's the right algorithm for…", performance-critical code, code with nested loops over the same input, recursive solutions, shortest-path / scheduling / matching / DP problems, code review for accidental O(n²) blowup, and any "how do I do X at scale / on a stream / without enough RAM" question — even if the user doesn't explicitly mention "algorithm" or "complexity." |
Community Classical Computer Science Algorithms Best Practices
A practitioner-oriented reference for choosing and implementing classical algorithms and data structures correctly. Organized by execution-lifecycle impact: the earliest decisions (asymptotic class, data-structure choice) cascade through everything else, so the rules near the top of the table matter most.
Scope: the patterns that show up in everyday production code review, reasonable interview / contest problems, and the at-scale toolbox (sketches, streaming, distributed primitives) — not an exhaustive cover of CLRS. Topics intentionally outside the current version: network flow, modular arithmetic, Bellman-Ford and Floyd-Warshall as standalone rules, SCC (Tarjan/Kosaraju), computational geometry, FFT, Manacher / Z-function as standalone rules. They're flagged inline in the relevant rules.
Distilled from CLRS (Introduction to Algorithms, 4th ed.), Sedgewick & Wayne (Algorithms, 4th ed., Princeton), Skiena's Algorithm Design Manual, Laaksonen's Competitive Programmer's Handbook, cp-algorithms.com, and the USACO Guide.
When to Apply
Use these rules when:
- Choosing an algorithm or data structure for a new problem ("what's the right way to do X?")
- Reviewing code for hidden O(n²) blowup — repeated
in-checks on lists, pop(0) on lists, string concatenation in loops, naive substring search
- Picking a DP state or recurrence, before writing the memoization
- Modeling a problem as a graph (BFS vs Dijkstra vs topological sort)
- Refactoring brute force / naive solutions that work on toy inputs but time out at scale
- Deciding whether greedy applies, or whether DP / branch-and-bound is required
Rule Categories By Priority
| # | Category | Prefix | Impact | Why it cascades |
|---|
| 1 | Asymptotic Complexity & Algorithm Selection | comp- | CRITICAL | Wrong O() class makes every other optimization irrelevant |
| 2 | Data Structure Selection | ds- | CRITICAL | The container determines which operations are cheap |
| 3 | Sorting & Searching | srch- | HIGH | Foundation for greedy, two-pointer, sweep-line, binary-search-on-the-answer |
| 4 | Dynamic Programming | dp- | HIGH | Exponential → polynomial transformations |
| 5 | Graph Algorithms | graph- | HIGH | Networks, dependencies, routing, scheduling all reduce to graphs |
| 6 | Divide & Conquer / Recursion | divide- | MEDIUM-HIGH | Logarithmic-factor speedups; stack-depth and recurrence traps |
| 7 | Greedy Algorithms | greedy- | MEDIUM | Fast when correct, silently wrong when not |
| 8 | String & Sequence Algorithms | str- | MEDIUM | Pattern matching, parsing, substring queries |
| 9 | Scale & Probabilistic Algorithms | scale- | MEDIUM | Sketches, streaming, distributed primitives — situational, decisive when they apply |
Quick Reference
1. Asymptotic Complexity & Algorithm Selection (CRITICAL)
2. Data Structure Selection (CRITICAL)
3. Sorting & Searching (HIGH)
4. Dynamic Programming (HIGH)
5. Graph Algorithms (HIGH)
6. Divide & Conquer / Recursion (MEDIUM-HIGH)
7. Greedy Algorithms (MEDIUM)
8. String & Sequence Algorithms (MEDIUM)
9. Scale & Probabilistic Algorithms (MEDIUM)
The "unusual but valuable at scale" toolbox — sketches that trade tiny accuracy loss for orders-of-magnitude memory wins, streaming primitives for inputs that don't fit in RAM, and distributed structures that survive sharding changes.
How to Use
Start with the category that matches the question:
- "What's the right algorithm for n = 10⁶?" →
comp- (input-bound)
- "I'm looking things up in a list inside a loop" →
ds-hash-map-for-keyed-lookup or comp-watch-for-quadratic-blowup-from-membership-in-list
- "My recursion is slow" →
dp-memoize-overlapping-subproblems and comp-derive-recurrences-via-master-theorem
- "Shortest path / connectivity / ordering tasks" →
graph-
- "Choose items to maximize value" → start with
greedy-prove-exchange-argument-before-using; fall back to dp-knapsack-pattern
- "Find / match strings" →
str-
- "Memory is the constraint, not time" / "Sample / count / deduplicate at scale" / "Sharding" →
scale-
Code examples are in Python (most readable across audiences). The reasoning generalizes to any language — equivalent stdlib primitives are listed where they differ.
Reference Files
Related Skills
complexity-optimizer — Static analysis that finds the patterns these rules diagnose