Big-O & Phân tích độ phức tạp
FoundationNền tảng của mọi thứ khác. Không hiểu Big-O thì không thể đánh giá đoạn code mình viết là nhanh hay chậm.
🎯 Mục tiêu học tập
- Định nghĩa Big-O, Big-Θ, Big-Ω và ý nghĩa trực quan của từng cái
- Phân tích được độ phức tạp time/space của bất kỳ đoạn code nào
- Hiểu khái niệm amortized analysis qua ví dụ dynamic array
- So sánh trực quan tốc độ tăng giữa O(1), O(log n), O(n), O(n log n), O(n²), O(2ⁿ), O(n!)
📖 Nội dung chi tiết
- 1.1 Tại sao cần Big-O? — câu chuyện n=1000 vs n=1,000,000
- 1.2 Định nghĩa toán học của Big-O (đơn giản hoá cho lập trình viên)
- 1.3 Quy tắc đếm: bỏ hằng số, giữ bậc cao nhất, nested loop
- 1.4 Big-Θ và Big-Ω — khi nào thực sự cần phân biệt
- 1.5 Space complexity — stack từ đệ quy, output space
- 1.6 Amortized analysis qua dynamic array (push() trung bình O(1))
- 1.7 Best case / Worst case / Average case
- 1.8 Big-O của các thao tác phổ biến (Array, Object, Map, Set trong JS)
💡 Câu hỏi phỏng vấn kinh điển
- Big-O của hai vòng for lồng nhau nhưng chạy trên hai mảng khác nhau là gì? (đáp án: O(n·m), không phải O(n²))
- Tại sao
Array.prototype.pushtrong JS được coi là O(1) dù thực ra có lúc phải resize? - Phân biệt O(log n) và O(√n)?