Bỏ qua

Hướng dẫn sử dụng sách

Tip

Để có trải nghiệm đọc tốt nhất, khuyến nghị bạn nên đọc qua phần này.

Quy ước phong cách hành văn

  • Các chương/mục được đánh dấu * sau tiêu đề là nội dung tự chọn và có phần thử thách hơn. Nếu thời gian có hạn, bạn có thể bỏ qua chúng trong lần đọc đầu tiên.
  • Các thuật ngữ chuyên ngành sẽ được in đậm (trong phiên bản in và bản PDF) hoặc gạch chân (trong phiên bản web), ví dụ như mảng (array). Bạn nên ghi nhớ chúng vì điều này sẽ giúp ích cho bạn khi đọc các tài liệu kỹ thuật.
  • Nội dung trọng tâm và các câu tóm tắt sẽ được in đậm, đây là phần văn bản cần được đặc biệt lưu ý.
  • Các từ và cụm từ mang ý nghĩa đặc biệt sẽ được đặt trong "dấu ngoặc kép" để tránh mơ hồ.
  • Khi thuật ngữ có sự khác biệt giữa các ngôn ngữ lập trình, cuốn sách này sẽ tuân theo quy ước của Python; ví dụ như dùng None để biểu thị "null".
  • Cuốn sách này lược bỏ một phần phong cách chú thích thông thường của các ngôn ngữ lập trình để đổi lấy bố cục nội dung nhỏ gọn hơn. Chú thích chủ yếu được chia thành ba loại: chú thích tiêu đề, chú thích nội dung và chú thích nhiều dòng.
"""Chú thích tiêu đề, dùng để đánh dấu hàm, lớp, trường hợp kiểm thử, v.v."""

# Chú thích nội dung, dùng để giải thích chi tiết mã nguồn

"""
Chú thích
nhiều dòng
"""
/* Chú thích tiêu đề, dùng để đánh dấu hàm, lớp, trường hợp kiểm thử, v.v. */

// Chú thích nội dung, dùng để giải thích chi tiết mã nguồn

/**
 * Chú thích
 * nhiều dòng
 */
/* Chú thích tiêu đề, dùng để đánh dấu hàm, lớp, trường hợp kiểm thử, v.v. */

// Chú thích nội dung, dùng để giải thích chi tiết mã nguồn

/**
 * Chú thích
 * nhiều dòng
 */
/* Chú thích tiêu đề, dùng để đánh dấu hàm, lớp, trường hợp kiểm thử, v.v. */

// Chú thích nội dung, dùng để giải thích chi tiết mã nguồn

/**
 * Chú thích
 * nhiều dòng
 */
/* Chú thích tiêu đề, dùng để đánh dấu hàm, lớp, trường hợp kiểm thử, v.v. */

// Chú thích nội dung, dùng để giải thích chi tiết mã nguồn

/**
 * Chú thích
 * nhiều dòng
 */
/* Chú thích tiêu đề, dùng để đánh dấu hàm, lớp, trường hợp kiểm thử, v.v. */

// Chú thích nội dung, dùng để giải thích chi tiết mã nguồn

/**
 * Chú thích
 * nhiều dòng
 */
/* Chú thích tiêu đề, dùng để đánh dấu hàm, lớp, trường hợp kiểm thử, v.v. */

// Chú thích nội dung, dùng để giải thích chi tiết mã nguồn

/**
 * Chú thích
 * nhiều dòng
 */
/* Chú thích tiêu đề, dùng để đánh dấu hàm, lớp, trường hợp kiểm thử, v.v. */

// Chú thích nội dung, dùng để giải thích chi tiết mã nguồn

/**
 * Chú thích
 * nhiều dòng
 */
/* Chú thích tiêu đề, dùng để đánh dấu hàm, lớp, trường hợp kiểm thử, v.v. */

// Chú thích nội dung, dùng để giải thích chi tiết mã nguồn

/**
 * Chú thích
 * nhiều dòng
 */
/* Chú thích tiêu đề, dùng để đánh dấu hàm, lớp, trường hợp kiểm thử, v.v. */

// Chú thích nội dung, dùng để giải thích chi tiết mã nguồn

// Chú thích
// nhiều dòng
/* Chú thích tiêu đề, dùng để đánh dấu hàm, lớp, trường hợp kiểm thử, v.v. */

// Chú thích nội dung, dùng để giải thích chi tiết mã nguồn

/**
 * Chú thích
 * nhiều dòng
 */
/* Chú thích tiêu đề, dùng để đánh dấu hàm, lớp, trường hợp kiểm thử, v.v. */

// Chú thích nội dung, dùng để giải thích chi tiết mã nguồn

/**
 * Chú thích
 * nhiều dòng
 */
### Chú thích tiêu đề, dùng để đánh dấu hàm, lớp, trường hợp kiểm thử, v.v. ###

# Chú thích nội dung, dùng để giải thích chi tiết mã nguồn

# Chú thích
# nhiều dòng

Học tập hiệu quả với hình minh họa động

So với văn bản đơn thuần, video và hình ảnh có mật độ thông tin cao hơn cũng như cấu trúc rõ ràng hơn, giúp chúng dễ hiểu hơn. Trong cuốn sách này, các khái niệm trọng tâm và kiến thức khó chủ yếu được trình bày dưới dạng hình minh họa động, còn văn bản đóng vai trò giải thích và bổ sung.

Nếu trong khi đọc sách, bạn bắt gặp một hình minh họa động như hình dưới đây, hãy lấy hình ảnh làm chính, văn bản làm phụ, đồng thời kết hợp cả hai để hiểu rõ nội dung.

Ví dụ về hình minh họa động

Khắc sâu hiểu biết qua thực hành lập trình

Mã nguồn đi kèm của cuốn sách này được lưu trữ trên kho lưu trữ GitHub. Như được hiển thị trong hình bên dưới, mã nguồn đi kèm với các trường hợp kiểm thử và có thể chạy được chỉ với một cú nhấp chuột.

Nếu thời gian cho phép, khuyến nghị bạn nên tự gõ lại code. Nếu thời gian học tập có hạn, ít nhất hãy đọc qua và chạy thử tất cả code.

So với việc chỉ đọc code, việc tự tay viết code thường mang lại nhiều thành quả hơn. Bắt tay vào thực hành mới là thực sự học.

Ví dụ chạy code

Công tác chuẩn bị để chạy code chủ yếu gồm ba bước.

Bước 1: Cài đặt môi trường lập trình. Vui lòng làm theo hướng dẫn trong phần phụ lục. Nếu đã cài đặt rồi, bạn có thể bỏ qua bước này.

Bước 2: Clone hoặc tải xuống kho lưu trữ code. Truy cập kho lưu trữ GitHub. Nếu bạn đã cài đặt Git, bạn có thể clone kho lưu trữ này bằng lệnh sau:

git clone https://github.com/krahets/hello-algo.git

Ngoài ra, bạn cũng có thể nhấp vào nút "Download ZIP" như hình hiển thị dưới đây để tải trực tiếp file nén ZIP của kho lưu trữ và giải nén trên máy của mình.

Clone kho lưu trữ và tải xuống code

Bước 3: Chạy mã nguồn. Như được hiển thị trong hình bên dưới, đối với các khối code có tên file ở phía trên, bạn có thể tìm thấy các file mã nguồn tương ứng trong thư mục codes của kho lưu trữ. Các file mã nguồn này có thể được chạy chỉ với một cú nhấp chuột, giúp bạn tiết kiệm thời gian debug không cần thiết để tập trung vào nội dung học tập.

Khối code và file mã nguồn tương ứng

Ngoài việc chạy code tại máy cục bộ, phiên bản web cũng hỗ trợ chạy trực quan code Python (được phát triển dựa trên pythontutor). Như được hiển thị trong hình dưới đây, bạn có thể nhấp vào "Chạy trực quan" phía dưới khối code để mở rộng giao diện và quan sát quá trình thực thi của code thuật toán; bạn cũng có thể nhấp vào "Xem toàn màn hình" để có trải nghiệm đọc tốt hơn.

Chạy trực quan code Python

Cùng nhau tiến bộ qua thảo luận và đặt câu hỏi

Khi đọc sách, vui lòng không bỏ qua những điểm mà bạn vẫn chưa hiểu rõ. Hãy thoải mái đặt câu hỏi trong phần bình luận, tôi và các cộng sự sẽ cố gắng hết sức để giải đáp, thông thường là trong vòng hai ngày.

Như được hiển thị trong hình bên dưới, phiên bản web có phần bình luận ở cuối mỗi chương. Tôi khuyến khích bạn chú ý đến các cuộc thảo luận ở đây. Một mặt, bạn có thể hiểu được những vấn đề mà người khác gặp phải, từ đó tự trau dồi lỗ hổng kiến thức của bản thân và kích thích tư duy sâu sắc hơn. Mặt khác, hy vọng bạn sẽ chia sẻ kiến thức để trả lời câu hỏi của các độc giả khác, giúp đỡ mọi người cùng nhau tiến bộ.

Ví dụ về phần bình luận

Lộ trình học thuật toán

Nhìn chung, chúng ta có thể chia quá trình học cấu trúc dữ liệu và thuật toán thành ba giai đoạn.

  1. Giai đoạn 1: Nhập môn thuật toán. Chúng ta cần làm quen với đặc điểm cũng như cách dùng của các cấu trúc dữ liệu khác nhau, đồng thời học hỏi các nguyên lý, quy trình, công dụng và hiệu suất của các thuật toán.
  2. Giai đoạn 2: Luyện giải bài tập thuật toán. Khuyến nghị nên bắt đầu với các bài tập phổ biến và giải trước ít nhất 100 câu để làm quen với các dạng câu hỏi thuật toán phổ biến. Khi mới bắt đầu luyện tập, việc "quên kiến thức" có thể là một thử thách lớn, nhưng hãy yên tâm vì điều này hoàn toàn bình thường. Chúng ta có thể ôn lại các bài tập theo "đường cong quên lãng Ebbinghaus", sau khoảng 3 đến 5 lần ôn tập lặp lại, kiến thức thường sẽ được ghi nhớ sâu sắc. Để biết danh sách bài tập khuyến nghị và kế hoạch luyện tập, vui lòng tham khảo kho lưu trữ GitHub này.
  3. Giai đoạn 3: Xây dựng hệ thống kiến thức. Về mặt học tập, chúng ta có thể đọc các bài viết chuyên mục về thuật toán, các khung giải bài tập và giáo trình thuật toán để liên tục làm phong phú hệ thống kiến thức của mình. Về mặt luyện tập, bạn có thể thử sức với các chiến lược nâng cao như giải theo chủ đề chuyên biệt, một bài toán nhiều lời giải, một lời giải cho nhiều bài toán, v.v. Các chia sẻ kinh nghiệm giải đề liên quan có thể được tìm thấy trong nhiều cộng đồng khác nhau.

Như được hiển thị trong hình bên dưới, nội dung của cuốn sách này chủ yếu bao gồm "Giai đoạn 1", nhằm giúp bạn thực hiện việc học Giai đoạn 2 và Giai đoạn 3 một cách hiệu quả hơn.

Lộ trình học thuật toán