Giao diện
Bản đồ học DSA Phase 1 — Lộ trình nền tảng thuật toán
Bạn đang cầm bản đồ của toàn bộ Phase 1 — giai đoạn nền tảng trong hành trình chinh phục Algorithms & Data Structures. Từ những thuật toán sắp xếp đầu tiên cho đến Graph traversal và Dynamic Programming, mọi thứ bạn cần để tự tin bước vào vòng phỏng vấn kỹ thuật đều nằm trong 10 trang tiếp theo.
Đây không phải sách giáo khoa. Penalgo Phase 1 là một trải nghiệm học có hướng dẫn — mỗi bài đều kèm phân tích trade-off thực tế, interview patterns phổ biến, và tư duy production-grade mà anh em sẽ dùng hàng ngày trong công việc. Mình thiết kế lộ trình này để bạn không chỉ hiểu thuật toán, mà còn biết khi nào dùng cái gì và tại sao.
🎯 Mục tiêu
Sau khi hoàn thành Phase 1, bạn sẽ:
- Nắm vững 7 thuật toán sắp xếp — và biết chọn đúng thuật toán cho đúng tình huống (stable sort? nearly-sorted data? memory constraint?)
- Implement Binary Search không bug — bao gồm overflow-safe
mid = left + (right - left) / 2và các biến thể upper/lower bound - Phân tích trade-off giữa Array, Linked List, Stack, Queue — không chỉ Big O mà còn cache locality, memory overhead
- Điều hướng Tree, Heap & Graph — từ biểu diễn (adjacency list vs matrix) đến các thao tác cơ bản
- Áp dụng BFS, DFS, Dijkstra — với priority-queue thinking và nhận diện đúng bài toán
- Nhận dạng Dynamic Programming patterns — ở mức nhập môn: overlapping subproblems, optimal substructure, memoization vs tabulation
- Kết nối DSA → System Design interviews — hiểu cách kiến thức thuật toán ảnh hưởng đến thiết kế hệ thống thực tế
📋 Prerequisites — Bạn cần gì trước khi bắt đầu?
Phase 1 giả định bạn đã có nền tảng sau:
| # | Yêu cầu | Chi tiết |
|---|---|---|
| 1 | Big O Notation | Hiểu O(1), O(n), O(n log n), O(n²). Biết phân tích time & space complexity cơ bản → Đọc bài Complexity |
| 2 | Lập trình cơ bản | Thành thạo ít nhất một trong C++, Java, hoặc Python. Biết dùng array, loop, function, recursion |
| 3 | Module 0: Algorithmic Mindset | Đã đọc qua tư duy giải thuật — cách chia nhỏ bài toán, nhận dạng pattern → Module 0 |
💡 HPN Pro Tip
Nếu bạn chưa tự tin về Big O, hãy dành 30 phút đọc lại bài Complexity Analysis trước. Phase 1 dùng Big O notation ở mọi trang — đó là ngôn ngữ chung của anh em.
🗺️ Dependency Map — Bản đồ phụ thuộc
Dưới đây là toàn cảnh 10 trang của Phase 1 và cách chúng kết nối với nhau. Mỗi mũi tên nghĩa là "nên học trước khi sang trang tiếp":
┌─────────────────────────────────────────────┐
│ 00 Bản đồ DSA (📍 BẠN ĐANG Ở ĐÂY) │
└────────────────────┬────────────────────────┘
│
▼
┌────────────────────────────────────────────┐
│ 01 Sorting O(n²) │
│ Bubble · Selection · Insertion │
└────────────────────┬───────────────────────┘
│
▼
┌────────────────────────────────────────────┐
│ 02 Sorting Hiệu Quả │
│ Merge · Quick · Heap · Counting/Radix │
└────────────────────┬───────────────────────┘
│
▼
┌────────────────────────────────────────────┐
│ 03 Tìm Kiếm │
│ Binary Search · Two Pointers · Variants │
└────────────────────┬───────────────────────┘
│
▼
┌────────────────────────────────────────────┐
│ 04 Cấu Trúc Tuyến Tính │
│ Array · Linked List · Stack · Queue │
└────────────────────┬───────────────────────┘
│
▼
┌────────────────────────────────────────────┐
│ 05 Tree, Heap & Graph │
│ BST · Heap · Adjacency List/Matrix │
└────────────────────┬───────────────────────┘
│
▼
┌────────────────────────────────────────────┐
│ 06 BFS, DFS & Dijkstra │
│ Graph Traversal · Shortest Path │
└────────────────────┬───────────────────────┘
│
▼
┌────────────────────────────────────────────┐
│ 07 DP Nhập Môn │
│ Memoization · Tabulation · Patterns │
└──────────┬─────────────────┬───────────────┘
│ │
▼ ▼
┌────────────────────────┐ ┌──────────────────────────┐
│ 08 Bẫy Phỏng Vấn │ │ 09 DSA → System Design │
│ Common Mistakes & │ │ Cầu nối từ thuật toán │
│ Interview Patterns │ │ sang thiết kế hệ thống │
└────────────────────────┘ └──────────────────────────┘💡 HPN Pro Tip
Bạn nên đi theo thứ tự từ 01 → 09. Mỗi trang xây dựng trên kiến thức của trang trước. Tuy nhiên, nếu đã có nền tảng sorting, bạn có thể nhảy thẳng đến trang 03 (Tìm Kiếm) sau khi skim qua 01-02.
⚡ Ba Learning Tracks — Chọn tốc độ phù hợp
Không phải ai cũng có cùng thời gian và mục tiêu. Hãy chọn track phù hợp với bạn:
| Track | Thời gian | Phong cách | Phù hợp với |
|---|---|---|---|
| 🏃 Sprint | 3 ngày | 1 page/buổi, focus quiz + code | Ôn phỏng vấn gấp, đã có nền tảng |
| 📚 Standard | 1 tuần | 1-2 pages/ngày, làm đủ exercises | Học nền tảng vững, muốn hiểu rõ |
| 🔬 Deep | 2 tuần | 1 page/ngày + đọc reference pages | Hiểu sâu từ gốc, nghiên cứu kỹ |
Gợi ý: Nếu bạn không chắc, bắt đầu với Standard. Bạn luôn có thể tăng/giảm tốc sau vài trang đầu.
📖 Page-by-Page Overview
00 — Bản đồ DSA (Trang hiện tại)
Tổng quan lộ trình, dependency map, và cách chọn learning track. Đây là trang bạn đang đọc — la bàn cho toàn bộ Phase 1.
- Tags:
roadmap·overview·navigation - Thời gian đọc: ~10-15 phút
- 📍 Bạn đang ở đây!
01 — Sorting O(n²): Bubble, Selection, Insertion
Ba thuật toán sắp xếp cơ bản nhất — không nhanh, nhưng là nền tảng tư duy. Bạn sẽ hiểu tại sao Insertion Sort lại thực tế hơn Bubble Sort, và khi nào O(n²) vẫn chấp nhận được.
- Tags:
bubble-sort·selection-sort·insertion-sort·stability - Thời gian đọc: ~30-40 phút
- 🔗 Đọc bài →
02 — Sorting Hiệu Quả: Merge, Quick, Heap & Beyond
Nhảy lên O(n log n) với Merge Sort, Quick Sort, Heap Sort. So sánh chi tiết: khi nào dùng cái nào? Tại sao Quick Sort nhanh hơn Merge Sort trong thực tế dù cùng Big O? Bonus: Counting Sort và Radix Sort cho trường hợp đặc biệt.
- Tags:
merge-sort·quick-sort·heap-sort·counting-sort·radix-sort - Thời gian đọc: ~40-50 phút
- 🔗 Đọc bài →
03 — Tìm Kiếm: Binary Search & Variants
Binary Search — thuật toán mà 90% lập trình viên implement sai lần đầu. Bạn sẽ master overflow-safe mid, lower/upper bound, và áp dụng Two Pointers pattern. Bài này là bước ngoặt từ "biết thuật toán" sang "dùng được thuật toán".
- Tags:
binary-search·two-pointers·upper-bound·lower-bound - Thời gian đọc: ~35-45 phút
- 🔗 Đọc bài →
04 — Cấu Trúc Tuyến Tính: Array, Linked List, Stack, Queue
Bốn cấu trúc dữ liệu nền tảng và trade-off thực tế giữa chúng. Không chỉ Big O trên giấy — mình sẽ bàn về cache locality, memory fragmentation, và tại sao Array thường thắng Linked List trong production.
- Tags:
array·linked-list·stack·queue·cache-locality - Thời gian đọc: ~40-50 phút
- 🔗 Đọc bài →
05 — Tree, Heap & Graph: Cấu Trúc Phi Tuyến
Từ Binary Search Tree đến Min/Max Heap, từ Adjacency List đến Adjacency Matrix. Trang này mở ra thế giới phi tuyến — nơi mà hầu hết bài phỏng vấn medium/hard xuất hiện.
- Tags:
bst·heap·graph·adjacency-list·adjacency-matrix - Thời gian đọc: ~45-55 phút
- 🔗 Đọc bài →
06 — BFS, DFS & Dijkstra: Duyệt và Tìm Đường
Ba thuật toán graph quan trọng nhất. BFS cho shortest path trên unweighted graph, DFS cho topological sort và cycle detection, Dijkstra cho weighted shortest path. Priority Queue thinking là kỹ năng bạn sẽ dùng lại ở System Design.
- Tags:
bfs·dfs·dijkstra·priority-queue·shortest-path - Thời gian đọc: ~45-55 phút
- 🔗 Đọc bài →
07 — DP Nhập Môn: Dynamic Programming Patterns
Dynamic Programming — chủ đề khiến nhiều người sợ nhất. Mình sẽ demystify nó: bắt đầu từ recursion → memoization → tabulation. Bạn sẽ nhận dạng 4-5 DP patterns phổ biến nhất và biết cách tiếp cận bài DP mới.
- Tags:
dynamic-programming·memoization·tabulation·optimal-substructure - Thời gian đọc: ~50-60 phút
- 🔗 Đọc bài →
08 — Bẫy Phỏng Vấn: Common Mistakes & Interview Patterns
Tổng hợp những sai lầm phổ biến nhất khi phỏng vấn DSA: off-by-one errors, quên edge cases, chọn sai data structure. Kèm theo checklist và mental models để tránh "bẫy" mà interviewer hay đặt.
- Tags:
interview·common-mistakes·edge-cases·patterns - Thời gian đọc: ~30-40 phút
- 🔗 Đọc bài →
09 — DSA → System Design: Cầu Nối Hai Thế Giới
Trang cuối Phase 1 kết nối mọi thứ bạn đã học vào bức tranh lớn hơn: System Design. Consistent Hashing dùng Binary Search, Load Balancing dùng Heap, Graph algorithms trong social networks. Đây là bước đệm hoàn hảo sang Phase 2.
- Tags:
system-design·consistent-hashing·load-balancing·real-world - Thời gian đọc: ~35-45 phút
- 🔗 Đọc bài →
🏋️ Practice Sequence — Luyện tập theo lộ trình
Đừng chỉ đọc — hãy code. Dưới đây là thứ tự luyện tập được thiết kế để củng cố kiến thức ngay sau mỗi nhóm bài:
| Sau trang | Bài luyện tập | Mô tả |
|---|---|---|
| 01-02 | Sorting Comparison | So sánh performance các sorting algorithms trên các loại input khác nhau |
| 03 | Binary Search Variants | Implement lower_bound, upper_bound, rotated array search |
| 04-05 | Balanced BST Ops | Thao tác insert, delete, search trên BST + Heap operations |
| 06 | Graph Traversal | BFS/DFS trên các dạng graph khác nhau |
| 06 | Shortest Path | Dijkstra + BFS shortest path trên weighted/unweighted graphs |
| 07 | DP Patterns | Fibonacci, Knapsack, LCS — các classic DP problems |
| 08 | Full Mock Interview | Tự chấm với checklist từ trang 08, mô phỏng phỏng vấn thật |
💡 HPN Pro Tip
Quy tắc 70-30: dành 30% thời gian đọc lý thuyết, 70% thời gian code và luyện tập. Đọc hiểu xong một trang? Nhảy ngay vào practice tương ứng trước khi sang trang tiếp theo.
⏱️ Estimated Total Time — Ước tính tổng thời gian
| Track | Đọc lý thuyết | Luyện tập | Tổng cộng |
|---|---|---|---|
| 🏃 Sprint | ~4 giờ | ~4 giờ | ~8 giờ |
| 📚 Standard | ~6 giờ | ~6 giờ | ~12 giờ |
| 🔬 Deep | ~8 giờ | ~12 giờ | ~20 giờ |
Thời gian trên là ước tính cho một developer đã có kinh nghiệm lập trình cơ bản. Nếu bạn mới bắt đầu, hãy nhân đôi thời gian và đừng vội — nền tảng vững sẽ giúp bạn tiết kiệm rất nhiều thời gian ở Phase 2 và Phase 3.
🧭 Lời khuyên trước khi bắt đầu
- Đừng skip bài tập. Đọc mà không code giống như xem người khác tập gym — bạn sẽ không mạnh hơn.
- Ghi chú bằng ngôn ngữ của bạn. Khi đọc xong một thuật toán, hãy viết lại bằng lời của chính mình — nếu không giải thích được, bạn chưa thật sự hiểu.
- So sánh là vũ khí. Luôn tự hỏi: "Thuật toán A khác thuật toán B ở điểm nào? Khi nào dùng A, khi nào dùng B?"
- Sai là tốt. Bug, wrong answer, timeout — tất cả đều là cơ hội học. Debug là kỹ năng quan trọng không kém coding.