1. Big-O Complexity & Hardware Realities
Stop guessing performance — learn how CPU cycles and memory access dictate execution time.
The "WHY" Core Principle
CPUs execute billions of instructions per second, but memory access speed varies drastically. Big-O measures how operations scale as input size N grows toward infinity.
Interactive Visualizer
Interactive Big-O Complexity 2D Graph & Operation Profiler
Move the slider to observe operation growth curves smoothly scale as input size N increases.
Operations at N = 25
def get_first(arr):
return arr[0] # Direct memory offsetAnalogy: Jumping directly to a page number in an indexed book.
Operations at N = 25
while low <= high:
mid = (low + high) // 2 # Halve search spaceAnalogy: Finding a name in a phonebook by opening to the middle repeatedly.
Operations at N = 25
for item in arr:
if item == target: return True # Single sweepAnalogy: Reading every page in a book line by line from front to back.
Operations at N = 25
def merge_sort(arr):
# Divide array (log N) & merge halves (N)Analogy: Sorting a deck of cards by splitting into 2 piles recursively.
Operations at N = 25
for i in range(n):
for j in range(i + 1, n): # Compare every pairAnalogy: Comparing every card in a deck against every other card.
Operations at N = 25
def fib(n):
return fib(n-1) + fib(n-2) # 2 recursive calls per stepAnalogy: Trying every possible combination password lock.
Notice how O(1) and O(log N) remain near the bottom of the graph even as $N$ grows, while O(N²) and O(2ⁿ) curve steeply upward. This difference is why selecting the correct data structure prevents CPU bottlenecks!
Interactive Code Snippets (2 Lessons)
O(1) Constant Time — Direct Memory Offset
Why list indexing `arr[i]` or dict lookup `hashmap[key]` takes O(1) time regardless of whether N is 10 or 10,000,000.
In memory, a Python list is stored as a contiguous block of memory pointers. Finding element i requires a simple hardware multiplication: address = base_address + (i * 8 bytes).
CPython C Struct Detail: CPython PyListObject stores `ob_item` as an array of `PyObject*` pointers.
O(1) Constant Time — Direct Memory Offset
Pyodide WASM EngineType, edit code, and click 'Run & Profile' to see live runtime ms and operation count!
O(N²) Quadratic vs O(N) Linear Benchmark
Compare why nested loop duplicate check takes O(N²) while Set hash lookup drops execution time to O(N).
In O(N²), for N elements, the inner loop executes N(N-1)/2 comparisons. In O(N), a hash set uses object hashes to jump directly to memory buckets.
CPython C Struct Detail: PySet_Contains uses C hash code computation PyObject_Hash(key) modulo set capacity.
O(N²) Quadratic vs O(N) Linear Benchmark
Pyodide WASM EngineType, edit code, and click 'Run & Profile' to see live runtime ms and operation count!