Lời nói đầu¶
Vài năm trước, tôi đã chia sẻ lời giải cho loạt bài "Sword for Offer" trên LeetCode và nhận được nhiều sự động viên cũng như ủng hộ từ các độc giả. Trong quá trình trao đổi với bạn đọc, câu hỏi tôi thường gặp nhất là "làm thế nào để bắt đầu học thuật toán". Dần dần, tôi đã nảy sinh sự hứng thú sâu sắc đối với câu hỏi này.
Lao ngay vào giải bài tập dường như là phương pháp được ưa chuộng nhất — đơn giản, trực tiếp và hiệu quả. Tuy nhiên, giải bài tập cũng giống như chơi trò "Dò mìn": những người có khả năng tự học tốt có thể gỡ từng quả mìn một cách suôn sẻ, trong khi những người chưa vững nền tảng rất dễ bị "trầy da tróc vảy" và dần tháo lui trong thất bại. Đọc hết sách giáo khoa cũng là một phương pháp thường thấy, nhưng đối với những người đang tìm việc, luận văn tốt nghiệp, nộp CV, chuẩn bị cho bài thi viết và phỏng vấn đã tiêu hao phần lớn năng lượng của họ, khiến việc cày cuốc những cuốn sách dày cộp trở thành một thử thách vô cùng gian nan.
Nếu bạn cũng đang gặp phải những khó khăn tương tự, thật may mắn là cuốn sách này đã "tìm" thấy bạn. Cuốn sách này là câu trả lời của tôi cho câu hỏi đó — ngay cả khi nó không phải là lời giải tối ưu, thì ít nhất cũng là một nỗ lực tích cực. Mặc dù cuốn sách này không đủ giúp bạn trực tiếp nhận được lời mời làm việc (Offer), nhưng nó sẽ dẫn dắt bạn khám phá "bản đồ tri thức" về cấu trúc dữ liệu và thuật toán, giúp bạn hiểu rõ hình dáng, kích thước cũng như vị trí phân bố của những "quả mìn" khác nhau, và giúp bạn làm chủ các "phương pháp gỡ mìn" đa dạng. Với những kỹ năng này, tôi tin rằng bạn có thể giải bài tập và đọc tài liệu kỹ thuật một cách tự tin hơn, từ đó từng bước xây dựng nên một hệ thống kiến thức hoàn chỉnh.
Tôi vô cùng đồng ý với lời của Giáo sư Feynman: "Knowledge isn't free. You have to pay attention." (Tri thức không miễn phí. Bạn phải trả giá bằng sự chú ý). Theo nghĩa đó, cuốn sách này không hoàn toàn "miễn phí". Để không phụ lòng sự "chú ý" quý báu mà bạn dành cho cuốn sách, tôi sẽ cố gắng hết sức và dốc toàn bộ "sự chú ý" của mình để hoàn thiện tác phẩm này.
Tôi tự biết kiến thức và kinh nghiệm của bản thân còn hạn chế. Mặc dù nội dung cuốn sách đã được trau chuốt qua một khoảng thời gian, nhưng chắc chắn vẫn khó tránh khỏi nhiều sai sót, tôi chân thành mong nhận được những ý kiến đóng góp và sửa lỗi từ quý thầy cô cùng các bạn học sinh, sinh viên.
Hello, Thuật toán!
Sự ra đời của máy tính đã mang lại những thay đổi to lớn cho thế giới. Nhờ khả năng tính toán tốc độ cao và tính khả lập trình xuất sắc, máy tính đã trở thành phương tiện lý tưởng để thực thi các thuật toán và xử lý dữ liệu. Dù là đồ họa chân thực trong trò chơi điện tử, quyết định thông minh của xe tự lái, ván cờ vây tuyệt diệu của AlphaGo hay tương tác tự nhiên của ChatGPT, tất cả những ứng dụng này đều là minh chứng cho sự vận hành tinh tế của thuật toán trên máy tính.
Trên thực tế, trước khi máy tính ra đời, thuật toán và cấu trúc dữ liệu đã tồn tại ở khắp mọi ngóc ngách trên thế giới. Các thuật toán thời kỳ đầu tương đối đơn giản, chẳng hạn như phương pháp đếm thời cổ đại hay các bước chế tạo công cụ lao động. Khi nền văn minh tiến bộ, thuật toán dần trở nên tinh vi và phức tạp hơn. Từ kỹ nghệ khéo léo của các nghệ nhân, các sản phẩm công nghiệp giải phóng sức sản xuất, cho đến các quy luật khoa học vận hành vũ trụ, đằng sau hầu hết mọi điều bình dị hay kỳ diệu đều ẩn chứa tư duy thuật toán vô cùng tinh tế.
Tương tự như vậy, cấu trúc dữ liệu hiện hữu ở khắp mọi nơi: từ các mạng xã hội quy mô lớn đến hệ thống tàu điện ngầm nhỏ bé, nhiều hệ thống có thể được mô hình hóa dưới dạng "đồ thị" (graph); từ một quốc gia đến một gia đình, cấu trúc tổ chức chính của xã hội mang các đặc tính của "cây" (tree); quần áo mùa đông giống như một "ngăn xếp" (stack), lớp quần áo mặc vào đầu tiên sẽ là lớp được cởi ra sau cùng; ống đựng cầu lông hoạt động như một "hàng đợi" (queue), quả cầu lông được đưa vào từ đầu này và lấy ra từ đầu kia; một cuốn từ điển giống như một "bảng băm" (hash table), cho phép nhanh chóng tra cứu từ cần tìm.
Cuốn sách này nhằm mục đích giúp độc giả thấu hiểu các khái niệm cốt lõi của thuật toán và cấu trúc dữ liệu thông qua các hình ảnh động minh họa rõ ràng, dễ hiểu cùng các ví dụ mã nguồn có thể chạy được, từ đó có thể tự triển khai chúng trong lập trình. Trên cơ sở đó, cuốn sách hướng tới việc hé mở những biểu hiện sinh động của thuật toán trong thế giới phức tạp, đồng thời thể hiện vẻ đẹp của thuật toán. Hy vọng cuốn sách này sẽ giúp ích cho bạn!
