"Introduction to Algorithms" là một cuốn sách giáo trình toàn diện và chuyên sâu về các thuật toán và cấu trúc dữ liệu cơ bản, cùng các kỹ thuật thiết kế và phân tích thuật toán. Mục tiêu của sách là cung cấp một nền tảng toán học vững chắc để phân tích hiệu quả (thời gian và không gian) của thuật toán.
Cuốn sách thường được chia thành các phần chính sau:
I. Nền Tảng (Foundations)
Phần này giới thiệu các công cụ toán học và khái niệm cơ bản để phân tích thuật toán:
Cơ sở toán học: Đánh giá độ phức tạp thuật toán bằng ký hiệu tiệm cận (Big O Notation) như O, Ω, Θ.
Cấu trúc dữ liệu cơ bản: Giới thiệu các cấu trúc dữ liệu cốt lõi như danh sách liên kết (linked lists), ngăn xếp (stacks), hàng đợi (queues), và cây (trees).
Kỹ thuật đệ quy: Phân tích các thuật toán đệ quy bằng Master Theorem và phương pháp cây đệ quy.
II. Phân loại và Phân tích Thuật toán Cốt lõi
Phần lớn nội dung tập trung vào việc trình bày chi tiết các nhóm thuật toán và cấu trúc dữ liệu nền tảng:
Nhóm Thuật toán Ví dụ và Ứng dụng
Sắp xếp Merge Sort, Heap Sort, Quick Sort (và phân tích trường hợp xấu nhất/trung bình).
Cấu trúc dữ liệu nâng cao Cấu trúc dữ liệu Heap, Hashing (Bảng băm), Cây tìm kiếm nhị phân cân bằng (Red-Black Trees).
Kỹ thuật thiết kế Chia để trị (Divide-and-Conquer), Quy hoạch động (Dynamic Programming) – giải quyết các bài toán tối ưu hóa phức tạp bằng cách chia thành các bài toán con, Thuật toán Tham lam (Greedy Algorithms).
III. Thuật toán trên Đồ thị (Graph Algorithms)
Đây là một trong những phần quan trọng nhất, giải quyết các bài toán liên quan đến mạng lưới và mối quan hệ:
Tìm kiếm: Duyệt theo chiều rộng (BFS), Duyệt theo chiều sâu (DFS).
Đường đi ngắn nhất: Thuật toán Dijkstra (cho trọng số không âm), thuật toán Bellman-Ford (cho trọng số âm), thuật toán Floyd-Warshall (cho tất cả các cặp đỉnh).
Cây bao trùm tối thiểu (MST): Thuật toán Prim và Kruskal để tìm cây bao trùm có tổng trọng số nhỏ nhất.
Luồng cực đại: Giới thiệu về Luồng (Flow) và Thuật toán Ford-Fulkerson.
IV. Các Chủ đề Chuyên sâu và Giới hạn
Phần cuối cùng mở rộng sang các lĩnh vực phức tạp hơn và giới hạn của việc tính toán:
Các thuật toán trên chuỗi (Strings): Tìm kiếm chuỗi (Knuth-Morris-Pratt).
Tính toán hình học (Computational Geometry): Các thuật toán liên quan đến tọa độ và hình dạng.
Lập trình song song (Parallel Algorithms): Giới thiệu các mô hình thuật toán chạy song song.
Giới hạn tính toán: Phân loại độ phức tạp thuật toán (Complexity Classes) như P (Polynomial time) và NP (Non-deterministic Polynomial time), và thảo luận về các bài toán NP-Complete và NP-Hard (những bài toán không thể giải quyết hiệu quả bằng thuật toán Deterministic hiện tại).