Skip to content

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ìtại sao.

🎯 Mục tiêu

Sau khi hoàn thành Phase 1, bạn sẽ:

  1. 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?)
  2. Implement Binary Search không bug — bao gồm overflow-safe mid = left + (right - left) / 2 và các biến thể upper/lower bound
  3. 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
  4. Đ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
  5. Áp dụng BFS, DFS, Dijkstra — với priority-queue thinking và nhận diện đúng bài toán
  6. Nhận dạng Dynamic Programming patterns — ở mức nhập môn: overlapping subproblems, optimal substructure, memoization vs tabulation
  7. 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ầuChi tiết
1Big O NotationHiể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
2Lập trình cơ bảnThành thạo ít nhất một trong C++, Java, hoặc Python. Biết dùng array, loop, function, recursion
3Module 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:

TrackThời gianPhong cáchPhù hợp với
🏃 Sprint3 ngày1 page/buổi, focus quiz + codeÔn phỏng vấn gấp, đã có nền tảng
📚 Standard1 tuần1-2 pages/ngày, làm đủ exercisesHọc nền tảng vững, muốn hiểu rõ
🔬 Deep2 tuần1 page/ngày + đọc reference pagesHiể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 trangBài luyện tậpMô tả
01-02Sorting ComparisonSo sánh performance các sorting algorithms trên các loại input khác nhau
03Binary Search VariantsImplement lower_bound, upper_bound, rotated array search
04-05Balanced BST OpsThao tác insert, delete, search trên BST + Heap operations
06Graph TraversalBFS/DFS trên các dạng graph khác nhau
06Shortest PathDijkstra + BFS shortest path trên weighted/unweighted graphs
07DP PatternsFibonacci, Knapsack, LCS — các classic DP problems
08Full Mock InterviewTự 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ếtLuyện tậpTổ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

  1. Đừ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.
  2. 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.
  3. 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?"
  4. 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.