Amortized Analysis
Also Known As
amortized O(1)
amortized cost
potential method
aggregate analysis
TL;DR
Averaging the cost of an operation over a sequence — explaining why dynamic array append is O(1) amortised despite occasional O(n) resizes.
Explanation
Some operations are occasionally expensive but rarely so. Amortized analysis spreads the cost: a dynamic array doubles capacity when full — a resize is O(n) but happens so rarely that over n appends the average is O(1). The accounting method assigns 'credits' from cheap operations to pay for future expensive ones. PHP's array[] = $item is amortized O(1) for the same reason. Amortized != average: average considers random inputs; amortized considers worst-case sequences. The difference matters when budgeting for occasional spikes.
Common Misconception
✗ Amortized O(1) means every operation is O(1) — amortized O(1) means the average over a sequence is O(1); individual operations can still spike to O(n), which matters for real-time systems.
Why It Matters
Understanding amortized analysis explains why PHP's array_push is fast despite occasional internal reallocation, and why you must not rely on O(1) amortized in real-time code that cannot tolerate spikes.
Common Mistakes
- Confusing amortized O(1) with worst-case O(1) — occasional spikes still happen.
- Using dynamic arrays in hard real-time systems — the O(n) resize spike causes deadline misses.
- Not understanding that PHP unshift/shift are O(n) NOT O(1) amortized — they reindex every time.
- Assuming stack operations are always cheap — SplStack push/pop are O(1) amortized, but array_shift is O(n).
Avoid When
- Do not use amortized O(1) as a guarantee for real-time or latency-sensitive systems — the occasional O(n) resize still happens.
- Avoid citing amortized cost when your workload triggers worst-case operations systematically (e.g. always inserting at max-load).
When To Use
- When evaluating data structures whose worst-case single operation cost is misleading (dynamic arrays, hash table rehashing, splay trees).
- When choosing between two structures with similar average performance — amortized cost reveals the true cost per operation over a sequence.
- When documenting API complexity guarantees to callers who care about throughput rather than single-call latency.
Code Examples
💡 Note
The bad example assumes array append is always fast in a 16 ms real-time budget; the fix uses a pre-allocated structure to avoid unpredictable resize pauses in a timing-critical loop.
✗ Vulnerable
// Mistaking amortized for guaranteed:
function realtimeTask(SplDoublyLinkedList $queue): void {
// In a 16ms real-time frame:
$queue->push($data); // Usually O(1)... but occasionally O(n) on resize
// Frame budget exceeded! Dropped frame in a game/audio context
}
✓ Fixed
// Understand what 'amortized O(1)' means:
// For N total pushes to a dynamic array:
// - ~N pushes are O(1)
// - log(N) resizes are O(N) each
// Total: O(N) for N operations = O(1) amortized
// Pre-allocate to avoid all resize overhead:
$spl = new SplFixedArray(10000); // O(1) guaranteed access, no resize
for ($i = 0; $i < 10000; $i++) {
$spl[$i] = $data[$i]; // Always O(1) — no resize possible
}
Tags
🤝 Adopt this term
£79/year · your link shown here
Added
16 Mar 2026
Edited
31 Mar 2026
Views
28
🤖 AI Guestbook educational data only
|
|
Last 30 days
Agents 2
Amazonbot 1
No pings yesterday
Amazonbot 8
Perplexity 5
Unknown AI 3
Google 2
Ahrefs 2
SEMrush 1
Bing 1
Also referenced
How they use it
crawler 20
crawler_json 1
pre-tracking 1
Related categories
⚡
DEV INTEL
Tools & Severity
🟢 Low
⚙ Fix effort: Medium
⚡ Quick Fix
When a single operation is occasionally expensive but rarely so, measure the average cost per operation over N operations — PHP's array reallocation is O(n) occasionally but O(1) amortised
📦 Applies To
any
web
cli
🔗 Prerequisites
🔍 Detection Hints
Worst-case analysis of PHP array append showing O(n) when amortised cost is O(1); incorrect complexity claims for dynamic arrays
Auto-detectable:
✗ No
⚠ Related Problems
🤖 AI Agent
Confidence: Low
False Positives: High
✗ Manual fix
Fix: High
Context: Function