[Đang viết...]
### Vì sao TAOCP Vol 1 khó đọc
- Toàn bộ chương 1 nói về kiến thức toán cho phân tích thuật toán. Nội dung không quá khó (trừ phần bài tập), nhưng tốc độ rất nhanh và không đi sâu (những phần được đào sâu thì nằm trong phần bài tập). Cho nên muốn đọc TAOCP hiệu quả thì tốt nhất là bạn nên đọc Concrete Mathematics (CMath) của Knuth trước, sau đó lướt sơ qua phần 1 của cuốn này; đừng quá bận tâm đến bài tập trong chương này nếu bạn đã làm kha khá bài tập bên CMath.
- Ngôn ngữ MIX: do không dùng ngôn ngữ bậc cao hơn đồng thời được thiết kế theo hệ thống máy tính thời 1960s, MIX rất bất tiện và đôi khi khá rối. Nếu đã biết hợp ngữ thì phần này sẽ tương đối dễ chịu. Nhưng mình khuyến khích đọc để biết thời xa xưa dân tình viết code thế nào, phần bài tập có thể tự viết lại bằng ngôn ngữ khác. Chuyện này ảnh hưởng khá nhiều đến Chương 2 của sách, khi mà Knuth tận dụng 1 số tính năng hơi quái dị của MIX để tiết kiệm bộ nhớ cho CTDL.
- Phong cách chứng minh của Knuth: rất "cô đọng", thậm chí có phần hơn "informal" khi Knuth thấy nó dễ hoặc là Knuth sẽ chứng minh dạng tổng quát (đôi khi không trực quan). Theo mình thì với cùng 1 Theorem, người đọc nên tham khảo thêm CLRS để hiểu rõ từng bước chứng minh, sau đó quay lại đọc phần Knuth viết sẽ thấy dễ hiểu hơn nhiều.
## Đánh giá một số chương
1. 1.2 Mathematical Preliminaries: đây là rào cản lớn nhất cho những ai muốn tiếp cận TAOCP mặc dù những kiến thức phần này được sử dụng ở từng chương trong sách. Nếu để ý bạn sẽ thấy Knuth luôn cập nhật thêm bài tập trong phần này để lượng kiến thức nền đủ để bạn hiểu được những chứng minh, dù là mới nhất liên quan đến thuật toán. Cách tốt nhất để đọc phần này (và không muốn đọc toàn bộ CMath) là làm toàn bộ bài tập nào dưới < 25 hoặc M20 hoặc HM < 15. Dĩ nhiên, mình đề xuất là đọc CMath thay vì tốn quá nhiều thời gian vào đây.
2. MIX: Đừng quá quan tâm, bởi tương lai Knuth sẽ thay bằng MMIX và trong Volume 4 đã hoàn toàn thay bằng MMIX. Ngôn ngữ này không quá khó để đọc, tuy nhiên chi phí cho một số câu lệnh có tương đối khác so với câu lệnh tương tự với phần cứng hiện nay.
3. 2.2 Linear Lists: Đây là phần hay nhất, nhưng cũng là phần gây nhiều trở ngại: Knuth rất thích dùng pointer, nhưng pointer trong MIX khá là free style, nó thậm chí không có type dẫn đến chuyện Knuth muốn làm gì thì làm với pointer. Điều đó dẫn đến chuyện bạn hầu như không thể viết lại kiểu 1-1 với thiết kế của các CTDL được đề cập trong sách. Phần này có khá nhiều ví dụ hấp dẫn, điển hình gồm chương trình giả lập thang máy, các toán tử trên đa thức, topological sort.
4. 2.3 Trees: Phần hay nhất trong sách. Lưu ý: một số chứng minh Knuth sử dụng cho cả trường hợp cây/đồ thị vô hạn, nên để dễ tiếp thu hơn, mình khuyến khích đọc phần chứng minh bên CLRS hơn.
Vậy bạn có nên đọc TAOCP Vol 1 không? Theo mình, nếu bạn là sinh viên năm 1-2 thì tốt nhất nên tạm gác cuốn này lại. Có nhiều cuốn dẫn nhập với các tiếp cận nhẹ nhàng hơn: đơn cử nhưng loạt sách về thuật toán của Robert Sedgewick (Sedgewick cũng là học trò của Knuth, và luận văn của ông là về phân tích độ phức tạp của Quick Sort - nếu đọc Volumne 3 phần Sắp xếp bạn sẽ để ý thấy có khác nhiều chỉ dẫn có tên của Sedgewick, hẳn là Knuth đã giao đống bài tập về cho Sedgewick làm). Dưới đây là một số cuốn mà mình nghĩ sẽ phù hợp với năm 1-2 hơn:
- Introduction to Computer Science.
- Algorithms.
- Algorithms Design Manual.
- Algorithms by Jeff
Mình đánh giá cao CLRS nhưng mình nghĩ CLRS nên dành đọc sau khi bạn đã đọc xong Algorithms của Sedgewick.