Agent Skills: dot-skills Algorithmic Complexity (Big-O) Best Practices

Algorithmic complexity (Big-O) review — finding nested loops, N+1 queries, exponential recursion, quadratic string builds, and other accidental complexity blowups. Covers Python, JavaScript/TypeScript, Java, Go, and similar languages. Use whenever writing, reviewing, or refactoring code where Big-O matters. Trigger even when the user doesn't mention "Big-O" explicitly — if they're reviewing code for performance, refactoring a hot path, asking "why is this slow," or working with data that scales (loops, recursions, collections, ORM access), apply this skill to classify the time/space complexity and suggest the fix. Especially trigger on tasks like "review for performance," "find slow code," "make this faster," "this code is O(n²)," or when reading code that processes collections.

UncategorizedID: pproenca/dot-skills/algorithmic-complexity-review

Install this agent skill to your local

pnpm dlx add-skill https://github.com/pproenca/dot-skills/tree/HEAD/skills/.experimental/algorithmic-complexity-review

Skill Files

Browse the full folder contents for algorithmic-complexity-review.

Download Skill

Loading file tree…

skills/.experimental/algorithmic-complexity-review/SKILL.md

Skill Metadata

Name
algorithmic-complexity-review
Description
Algorithmic complexity (Big-O) review — finding nested loops, N+1 queries, exponential recursion, quadratic string builds, and other accidental complexity blowups. Covers Python, JavaScript/TypeScript, Java, Go, and similar languages. Use whenever writing, reviewing, or refactoring code where Big-O matters. Trigger even when the user doesn't mention "Big-O" explicitly — if they're reviewing code for performance, refactoring a hot path, asking "why is this slow," or working with data that scales (loops, recursions, collections, ORM access), apply this skill to classify the time/space complexity and suggest the fix. Especially trigger on tasks like "review for performance," "find slow code," "make this faster," "this code is O(n²)," or when reading code that processes collections.

dot-skills Algorithmic Complexity (Big-O) Best Practices

Find, classify, and fix algorithmic complexity (Big-O) problems in code — language-agnostic. The 39 rules across 8 categories cover the patterns responsible for the vast majority of accidental quadratic, exponential, and N+1 blowups in production code: nested iteration, loop-invariant I/O, data-structure mismatch, recursion explosions, redundant computation, collection-building anti-patterns, search/sort selection, and space traps.

When to Apply

Use this skill when:

  • Reviewing a pull request or function for performance regressions
  • Asked "why is this slow?" or "can we make this faster?"
  • Refactoring a hot path or a function that handles user-scaled input
  • Reading code that contains: nested loops, .includes/.find/x in list inside iteration, ORM access in a loop, recursion without memoization, string/array building via += or spread, file/database I/O inside iteration
  • Reviewing code that processes lists, trees, or streams whose size will grow

Workflow: Find, Classify, Fix

The skill is structured for a three-step workflow on any code under review:

1. Find — Scan for the Suspicion Patterns

Look for these structural signals first (highest hit rate):

| Signal | Likely Category | First Rule to Check | |--------|-----------------|---------------------| | Two nested for loops | nested- | nested-explicit-quadratic-loops | | .includes / .find / x in list inside a loop | nested- | nested-includes-in-loop | | ORM access inside a loop (for o in orders: o.customer.x) | io- | io-n-plus-one-query | | await fetch in for-of | io- | io-sequential-await-in-loop | | array.find to "join" two arrays | ds- | ds-hashmap-for-keyed-access | | Recursive function with overlapping arguments | rec- | rec-memoize-overlapping-subproblems | | s = s + part or [...acc, x] in a loop | build- | build-avoid-quadratic-string-concat, build-avoid-spread-in-reducer | | sorted(...) called inside a loop | search- | search-sort-once-outside-loop | | readlines() / loading whole files | space- | space-stream-dont-load |

2. Classify — Derive the Big-O

Compute complexity from the code structure:

| Structure | Complexity | |-----------|------------| | Single loop over n items, O(1) body | O(n) | | Two nested loops over n / m items | O(nm) | | Loop calling an O(n) operation (.includes, .find, x in list) | O(nm), often misread as O(n) | | Recursive f(n) = f(n-1) + f(n-2) without memoization | O(2ⁿ) | | Recursive f(n) = 2*f(n/2) + O(n) | O(n log n) | | Recursive f(n) = 2*f(n/2) + O(1) | O(n) (full tree traversal) | | Recursive f(n) = f(n/2) + O(1) | O(log n) | | s = s + part in a loop | O(n²) (string immutability) | | [...acc, x] in a reduce | O(n²) (copy-on-spread) | | Query/RPC inside loop over n items | O(n) round trips |

When in doubt, ask: "As input doubles, does runtime roughly double (linear), quadruple (quadratic), or do something worse (exponential)?" That's the practical complexity class.

3. Fix — Apply the Pattern From the Matching Rule

Each reference file in references/ is a {category}-{slug}.md containing:

  • WHY the pattern matters (the cascade effect)
  • An Incorrect code example with the cost annotated
  • A Correct example with the minimal diff
  • When NOT to apply the fix (the rule has exceptions)

The minimal diff philosophy is intentional: the goal is for the agent to see exactly how few lines need to change to flip the complexity class.

Rule Categories by Priority

| # | Category | Prefix | Impact | Rules | |---|----------|--------|--------|-------| | 1 | Nested Iteration Patterns | nested- | CRITICAL | 6 | | 2 | Loop-Invariant I/O and N+1 | io- | CRITICAL | 5 | | 3 | Data Structure Mismatch | ds- | HIGH | 6 | | 4 | Recursion Complexity | rec- | HIGH | 5 | | 5 | Redundant Computation | compute- | MEDIUM-HIGH | 5 | | 6 | Collection Building | build- | MEDIUM | 4 | | 7 | Search & Sort Selection | search- | MEDIUM | 4 | | 8 | Space Complexity Traps | space- | LOW-MEDIUM | 4 |

See references/_sections.md for the full ordering rationale.

Quick Reference

1. Nested Iteration Patterns (CRITICAL)

2. Loop-Invariant I/O and N+1 Queries (CRITICAL)

3. Data Structure Mismatch (HIGH)

4. Recursion Complexity (HIGH)

5. Redundant Computation (MEDIUM-HIGH)

6. Collection Building (MEDIUM)

7. Search & Sort Selection (MEDIUM)

8. Space Complexity Traps (LOW-MEDIUM)

How to Use

  1. Start with the Find signal table above to locate the most likely pattern.
  2. Open the matching reference file for the WHY and the minimal-diff fix.
  3. If you're classifying complexity from scratch, use the Classify table to derive Big-O from code structure.
  4. When proposing a fix, quote the rule by file path so reviewers can verify the reasoning.
  5. See references/_sections.md for category ordering rationale, and assets/templates/_template.md when adding new rules.

Reference Files

| File | Description | |------|-------------| | references/_sections.md | Category definitions, impact levels, and ordering rationale | | assets/templates/_template.md | Template for adding new rules | | metadata.json | Discipline, type, and source references |

Related Skills

  • bug-review — Multi-pass PR bug review (this skill is a focused complement for performance issues specifically)
  • A language-specific best-practices skill (React, Python, Go) — covers idioms beyond Big-O; pair with this skill for performance-critical reviews