Collections
2025 Dec
My Grad School Application Odyssey and Advice
A candid PhD application postmortem: interviews, visits, and decision-making
2023 Feb
Queuing Theory: Understanding Waiting Lines
Queueing theory for latency: Little’s Law, utilization knee, Erlang-C, and variability
2023 Jan
Are you Sure your Linux PID is the Process ID?
Linux PID vs TID vs TGID: how threads show up in /proc and tools like htop
2022 Jul
A Glimpse of Survival Analysis
Survival analysis for systems: censoring, KM curves, log-rank tests, and Cox models
2022 Jan
Connecting Bayesian to Regularization
Bayesian priors as regularizers: Laplace→L1 (Lasso) and Gaussian→L2 (Ridge)
2021 Oct
Good Reads
A rolling list of books I enjoyed, with short notes on why they stuck
2021 Aug
My Take on TED Talks
A rolling log of TED takeaways on conversation, self-control, imposters, and memory
2020 Aug
SSH Proxy Jump
SSH key auth and proxy jumps: keygen, key distribution, and practical config patterns
2020 Feb
Autoencoders and VAEs
Autoencoders vs VAEs: latent compression, KL regularization, and reparameterization
2019 Sep
Hey system call! Where on earth are you?
Where syscalls live, why UNIX has a ‘narrow waist’, and what read/write really mean
fork( ) yourself!
fork() explained: process duplication, return values, zombies, and shell process flow
2018 May
All-Pairs Shortest-Paths (Floyd-Warshall Algorithm)
Floyd–Warshall all-pairs shortest paths: DP recurrence, intuition, and Python example
Single-Source Shortest-Paths (Dijkstra Algorithm)
Dijkstra’s algorithm: relaxation, invariants, and priority-queue runtime tradeoffs
2018 Apr
Performance of the Java Collections Framework
A compact Big-O cheat sheet for core Java Collections Framework operations
Huffman Encoding
Huffman coding: prefix-free codes, greedy merging, and heap-based runtime analysis
Fractional knapsack
Fractional knapsack: value-density greedy strategy and why it differs from 0-1 knapsack
DP vs. Greedy (the activity-selection problem)
DP vs greedy through activity selection: optimal substructure, greedy choice, pseudocode
Dynamic Programming Part2
DP practice set: Fibonacci, max-subarray, 0-1 knapsack, and LCS intuition
Rod Cutting (DP Intro)
Rod-cutting as DP: brute force vs memoization vs bottom-up, plus solution reconstruction
AVL Search Tree
AVL trees: balance invariants, rotations, and why height stays O(log n)
Binary Search Tree (BST)
Binary search trees: core operations, successors, insertion, and deletion via transplant
Tree Basics & Tricks
Tree terminology, traversals, and a few practical iterative traversal tricks
2018 Mar
Hashing
Hash tables from direct addressing to chaining and open addressing, with probe analysis
Doubly Linked-List
Doubly linked lists with and without sentinels, plus search/insert/delete pseudocode
Priority Queue (Using Max-Heap)
Priority queue via max-heap: extract-max, increase-key, insert, and heapify mechanics
2018 Feb
Stack & Queue
Stack and circular queue pseudocode with overflow/underflow checks and wrap-around logic
Bucket Sort
Bucket sort for roughly uniform inputs, with insertion sort per bucket and runtime notes
Radix Sort
Radix sort from least-significant digit upward, and why stability is required
2018 Jan
Decision Tree
Decision trees for comparison sorts, and why comparison sorting needs Ω(n log n)
Counting Sort
Stable counting sort in Θ(n+k), with pseudocode and Scala/Python implementations
2017 Dec
Randomized Sort
Randomized quicksort: random pivots to avoid adversarial inputs and worst-case splits
Quick Sort
Quicksort partitioning intuition, loop invariants, and best/average/worst-case analysis
2017 Nov
Heap Sort
Heap sort explained with max-heapify intuition, CLRS notes, and sample implementations
2017 Oct
Merge Sort
Merge sort via divide-and-conquer, with sentinels, recursion tree analysis, and code
2017 Sep
Insertion Sort
Iterative + recursive insertion sort, with complexity notes and Python/Scala examples