Cấu trúc dữ liệu và thuật toán – Nguyễn Đức Nghĩa: Giáo trình đào tạo ngành Công nghệ Thông tin

Tổng quan về giáo trình

Giáo trình Cấu trúc dữ liệu và thuật toán do PGS. TS. Nguyễn Đức Nghĩa biên soạn, được Nhà xuất bản Bách Khoa Hà Nội phát hành (Ấn bản lần thứ ba, năm 2021, mã biên mục CIP: BKF0030p-CIP, bản quyền thuộc Trường Đại học Bách Khoa Hà Nội). Đây là tài liệu giảng dạy chính thức cho học phần cốt lõi cùng tên thuộc chương trình đào tạo kỹ sư và cử nhân ngành Công nghệ Thông tin của Đại học Bách Khoa Hà Nội. Nội dung cuốn sách được thiết kế chuẩn hóa cho thời lượng giảng dạy quy chuẩn là 60 tiết lý thuyết và bài tập.

Mục tiêu học tập của giáo trình tập trung vào việc trang bị cho sinh viên:

  • Khả năng hình thức hóa bài toán tính toán $\mathcal{P}: {0, 1}^* \to {0, 1}^*$ và nắm vững các tiêu chuẩn kỹ thuật của một thuật toán (tính xác định, tính dừng, tính đơn trị, tính đúng đắn và tính tổng quát).
  • Phương pháp luận phân tích và đánh giá độ phức tạp tính toán về mặt thời gian và không gian bộ nhớ dựa trên các công cụ toán học tiệm cận ($\Theta, \Omega, O$).
  • Nguyên lý tổ chức, lưu trữ và thao tác trên các cấu trúc dữ liệu kinh điển từ tuyến tính đến phi tuyến tính.
  • Phương pháp thiết kế và tối ưu hóa giải thuật thông qua các kỹ thuật: chia để trị (Divide-and-Conquer), quy hoạch động (Dynamic Programming), quay lui (Backtracking) và đệ quy có nhớ.

Giáo trình được cấu trúc thành 7 chương logic, tiếp cận từ việc xây dựng nền tảng lý thuyết phân tích thuật toán, khảo sát các cấu trúc dữ liệu cơ bản, đến việc đi sâu vào các nhóm thuật toán chuyên biệt như sắp xếp, tìm kiếm, xử lý xâu ký tự và giải thuật trên đồ thị. Điểm đặc sắc trong phương pháp trình bày của tác giả là việc sử dụng các bài toán mẫu (tiêu biểu như bài toán tìm dãy con có trọng lượng lớn nhất) ngay từ chương mở đầu để đối sánh trực quan hiệu năng giữa 4 thuật toán tương ứng với 4 lớp độ phức tạp: duyệt trực tiếp $O(n^3)$, rút gọn vòng lặp $O(n^2)$, chia để trị $O(n \log n)$ và quy hoạch động $O(n)$.


Nội dung kiến thức cốt lõi

Các chương và chủ đề chính

Giáo trình phân chia toàn bộ khối lượng kiến thức thành 7 chương với tiến trình sư phạm chặt chẽ:

  1. Chương 1. Các khái niệm cơ bản: Định nghĩa bài toán tính toán, các đặc trưng thuật toán; độ phức tạp tính toán và các loại thời gian tính (tốt nhất, tồi nhất, trung bình); hệ thống ký hiệu tiệm cận $O, \Omega, \Theta$; giả ngôn ngữ và cấu trúc điều khiển; các kỹ thuật phân tích thuật toán qua cấu trúc tuần tự, vòng lặp for, while, repeat và phương pháp xác định câu lệnh đặc trưng (minh họa qua thuật toán tìm kiếm nhị phân và thuật toán sắp xếp theo nguyên lý chuồng bồ câu - Pigeonhole Sorting).
  2. Chương 2. Thuật toán đệ quy: Bản chất của đệ quy, hàm đệ quy ($n!$, dãy Fibonacci, hệ số nhị thức $C(n, k)$), tập hợp và cây định nghĩa đệ quy; phương pháp thiết kế thuật toán chia để trị với sơ đồ tổng quát D-and-C, thuật toán sắp xếp trộn (Merge-Sort), bài toán Tháp Hà Nội; kỹ thuật phân tích thời gian đệ quy bằng phương pháp thế và Định lý thợ rút gọn (Master Theorem) cho công thức $T(n) = aT(n/b) + cn^k$; kỹ thuật đệ quy có nhớ giải quyết bài toán con trùng lặp; thuật toán quay lui.
  3. Chương 3. Các cấu trúc dữ liệu cơ bản: Khái niệm kiểu dữ liệu trừu tượng (ADT); danh sách tuyến tính cùng hai phương thức cài đặt (mảng tĩnh liên tục và danh sách móc nối động: đơn, kép, vòng); kiểu dữ liệu trừu tượng ngăn xếp (Stack) và hàng đợi (Queue) kèm các thuật toán thao tác cơ bản và ứng dụng.
  4. Chương 4. Cây: Định nghĩa cây có gốc, cây có thứ tự; cấu trúc và tính chất của cây nhị phân (Binary Tree), các phương pháp biểu diễn cây; các ứng dụng chuyên sâu gồm cây nhị phân biểu thức (Binary Expression Trees), cây quyết định (Decision Trees) và thuật toán nén dữ liệu mã Huffman (Huffman Code).
  5. Chương 5. Các thuật toán sắp xếp: Phân loại bài toán sắp xếp; ba thuật toán sắp xếp cơ bản độ phức tạp $O(n^2)$ gồm sắp xếp chèn (Insertion Sort), sắp xếp lựa chọn (Selection Sort), sắp xếp nổi bọt (Bubble Sort); các thuật toán sắp xếp nâng cao độ phức tạp $O(n \log n)$ gồm sắp xếp nhanh (Quick Sort với phép phân đoạn) và sắp xếp vun đống (Heap Sort dựa trên cấu trúc Heap và hàng đợi có ưu tiên Priority Queue); chứng minh cận dưới $\Omega(n \log n)$ cho bài toán sắp xếp so sánh; các thuật toán sắp xếp không so sánh có thời gian tuyến tính gồm sắp xếp đếm (Counting Sort), sắp xếp theo cơ số (Radix Sort) và sắp xếp phân cụm (Bucket Sort).
  6. Chương 6. Tìm kiếm và bảng băm: Kỹ thuật tìm kiếm tuần tự và tìm kiếm nhị phân; cấu trúc cây nhị phân tìm kiếm (BST) và cây nhị phân tìm kiếm cân bằng (cây AVL) cùng các phép quay cân bằng; các giải thuật tìm kiếm xâu mẫu (String searching) gồm thuật toán trực tiếp (Naïve), thuật toán Boyer-Moore, thuật toán Rabin-Karp và thuật toán Knuth-Morris-Pratt (KMP); kỹ thuật định địa chỉ trực tiếp và bảng băm (Hash Tables) cùng các dạng hàm băm.
  7. Chương 7. Đồ thị và các thuật toán đồ thị: Khái niệm đường đi, chu trình, tính liên thông; kỹ thuật biểu diễn đồ thị bằng ma trận kề và danh sách kề; các thuật toán duyệt đồ thị theo chiều rộng (BFS) và theo chiều sâu (DFS); bài toán sắp xếp tô-pô trên đồ thị không chu trình (DAG); bài toán tô màu đỉnh và bao đóng truyền ứng; bài toán cây khung nhỏ nhất với thuật toán Kruskal (sử dụng cấu trúc dữ liệu biểu diễn phân hoạch Disjoint Set); bài toán đường đi ngắn nhất nguồn đơn với thuật toán Dijkstra.

Kiến thức nền tảng được xây dựng

  • Nền tảng lý thuyết phân tích tiệm cận: Thiết lập cơ sở toán học để đánh giá hiệu năng giải thuật độc lập với cấu hình phần cứng; cung cấp công cụ toán học xác định các hằng số $c, n_0$ cho các cận tiệm cận và giải phương trình truy hồi thông qua Định lý thợ rút gọn.
  • Nguyên lý thiết kế giải thuật: Xây dựng tư duy giải quyết vấn đề có cấu trúc thông qua việc chia nhỏ bài toán thành các bài toán con đồng dạng (Chia để trị), lưu trữ kết quả trung gian để tránh tính toán lặp (Quy hoạch động, Đệ quy có nhớ), và duyệt không gian trạng thái có cắt tỉa (Quay lui).
  • Mô hình hóa dữ liệu trừu tượng: Định hình ranh giới kỹ thuật giữa giao diện logic của kiểu dữ liệu (ADT) và cấu trúc dữ liệu cụ thể trong bộ nhớ vật lý máy tính (mảng tuần tự vs liên kết con trỏ móc nối).

Kỹ năng phát triển

  • Kỹ năng kỹ thuật (Technical skills): Chuyển dịch chính xác từ mô hình mã giả quy chuẩn sang mã nguồn lập trình ngôn ngữ C/C++; quản lý bộ nhớ động và thao tác con trỏ trong các cấu trúc danh sách, cây AVL, heap và đồ thị.
  • Kỹ năng phân tích (Analytical skills): Nhận diện cấu trúc bài toán để lựa chọn giải thuật phù hợp; tính toán số lượng phép toán cơ bản thông qua câu lệnh đặc trưng để xác định chính xác cấp độ phức tạp $O(1), O(\log n), O(n), O(n \log n), O(n^2), O(n^3)$ hoặc $O(2^n)$.
  • Năng lực ứng dụng thực tiễn (Practical competencies): Vận dụng các thuật toán chuẩn để giải quyết các bài toán kỹ thuật như nén dữ liệu (Huffman), kiểm tra số nguyên tố (Is_prime, Lagre_Prime), tìm kiếm chuỗi văn bản (KMP, Boyer-Moore) và tối ưu hóa mạng lưới đường đi (Dijkstra, Kruskal).

Phương pháp giảng dạy và học tập

Giáo trình triển khai phương pháp tiếp cận sư phạm đi từ cụ thể đến trừu tượng. Đối với từng chủ đề, tài liệu luôn bắt đầu bằng việc phát biểu bài toán kỹ thuật rõ ràng dưới dạng toán học, đưa ra thuật toán trực tiếp đơn giản nhất, chỉ ra điểm nghẽn hiệu năng qua số lượng phép toán cơ bản, sau đó đề xuất các thuật toán cải tiến với cấu trúc dữ liệu nâng cao.

Hệ thống bài tập cuối mỗi chương được thiết kế đa dạng nhằm phục vụ các hình thức đánh giá khác nhau:

  • Bài tập phân tích toán học: Yêu cầu người học chứng minh các đẳng thức tiệm cận, xác định thứ tự tốc độ tăng của các hàm số ($N \log N, N^2, (\log N)^{10}, 2^N$), thiết lập và giải công thức đệ quy xác định số phép toán cộng/nhân.
  • Bài tập theo dõi thực thi (Trace algorithm): Mô phỏng từng bước biến đổi của cấu trúc dữ liệu qua từng vòng lặp hoặc lệnh gọi đệ quy (như quá trình phân chia mảng trong Merge Sort, dịch chuyển đĩa trong bài toán Tháp Hà Nội).
  • Bài tập thiết kế và tối ưu: Đòi hỏi sinh viên nâng cấp thuật toán từ thời gian tính bậc hai $O(n^2)$ xuống thời gian tính tuyến tính $O(n)$, ví dụ như bài toán tìm người đặc biệt trong ma trận quan hệ $K[n \times n]$ hoặc bài toán tìm khoảng cách nhỏ nhất giữa hai phần tử trong mảng (MinDistance).

Toàn bộ thuật toán đều được cung cấp mã giả song song với các đoạn chương trình viết bằng ngôn ngữ C hoàn chỉnh (như hàm max, swap, Is_prime, Binary_Search, FibIter, Fact, C(n,k), Merge, HanoiTower). Điều này cho phép sinh viên tự học có thể trực tiếp thực thi mã nguồn trên máy tính, đối chiếu thời gian chạy thực nghiệm với thời gian tính toán lý thuyết.


Điểm nổi bật và cập nhật

  1. Chuẩn hóa hệ thống lý thuyết tiệm cận ở ấn bản lần thứ ba (2021): Ấn bản cập nhật định nghĩa chặt chẽ về các loại thời gian tính (tốt nhất, tồi nhất, trung bình), chuẩn hóa định dạng các ký hiệu toán học $\Theta, \Omega, O$, đồng thời tích hợp chi tiết 3 trường hợp của Định lý thợ rút gọn (Master Theorem) dùng để đánh giá độ phức tạp của các giải thuật chia để trị.
  2. Đối sánh định lượng hiệu năng thực nghiệm: Giáo trình cung cấp bảng quy đổi thời gian tính cụ thể dựa trên giả thiết máy tính thực hiện $10^8$ phép tính/giây với các kích thước dữ liệu $n = 10, 100, 10000, 10^6$. Qua đó minh họa rõ sự khác biệt giữa thuật toán đa thức hiệu quả và thuật toán hàm mũ không khả thi (thời gian vượt quá $10^{25}$ thế kỷ đối với $n=100$).
  3. Tích hợp các giải thuật tìm kiếm chuỗi văn bản nâng cao: Khác với các tài liệu cấu trúc dữ liệu truyền thống chỉ dừng ở tìm kiếm tuần tự và nhị phân, cuốn sách dành một phần chuyên sâu trong Chương 6 để phân tích và cài đặt 4 giải thuật tìm kiếm xâu mẫu kinh điển: Naïve, Boyer-Moore, Rabin-Karp và Knuth-Morris-Pratt (KMP).
  4. Liên hệ mật thiết với các bài toán tin học ứng dụng: Nội dung gắn liền với các bài toán kỹ thuật như nén tập tin không mất mát thông tin qua cây mã Huffman, biểu diễn cây quyết định, tối ưu hóa hàng đợi tiến trình trong hệ điều hành bằng Heap/Priority Queue, và các bài toán đồ thị cơ bản trong mạng máy tính (sắp xếp tô-pô, tìm cây khung Kruskal với Disjoint Set, tìm đường đi ngắn nhất Dijkstra).

Đối tượng sử dụng giáo trình

  • Sinh viên đại học chuyên ngành: Sinh viên năm thứ nhất và năm thứ hai các ngành Công nghệ Thông tin, Khoa học Máy tính, Kỹ thuật Phần mềm, Hệ thống Thông tin và Kỹ thuật Máy tính tại Đại học Bách Khoa Hà Nội cũng như các trường đại học kỹ thuật trên cả nước.
  • Yêu cầu kiến thức tiên quyết (Prerequisites):
    • Toán rời rạc và Giải tích cơ sở: Nắm vững phương pháp chứng minh quy nạp toán học, đại số logic, lý thuyết tập hợp, phép đếm tổ hợp và giới hạn hàm số.
    • Lập trình cơ bản: Đã hoàn thành học phần nhập môn lập trình hoặc kỹ thuật lập trình, hiểu rõ cú pháp ngôn ngữ C/C++, cơ chế truyền tham số, cấu trúc mảng, biến con trỏ và cấp phát bộ nhớ.
  • Giảng viên đại học: Sử dụng cuốn sách làm khung đề cương chi tiết cho học phần Cấu trúc dữ liệu và Thuật toán (thời lượng 60 tiết), phân bổ nội dung theo 7 chương tương ứng với các buổi giảng dạy lý thuyết, bài tập trên lớp và nội dung đồ án lập trình.
  • Kỹ sư và người tự học: Phù hợp làm tài liệu tra cứu học thuật cho các lập trình viên cần củng cố kiến thức nền tảng về tối ưu giải thuật, phân tích độ phức tạp phục vụ nghiên cứu phát triển phần mềm hoặc chuẩn bị cho các kỳ thi đánh giá năng lực kỹ thuật.

Câu hỏi thường gặp

1. Giáo trình này phù hợp với ai?

Giáo trình được biên soạn phục vụ trực tiếp cho sinh viên đại học ngành Công nghệ Thông tin học môn Cấu trúc dữ liệu và Thuật toán, đồng thời là tài liệu tham khảo cho học viên cao học và kỹ sư phần mềm cần củng cố nền tảng giải thuật.

2. Cần chuẩn bị kiến thức nền nào trước khi học giáo trình?

Người học cần nắm vững kiến thức về Toán rời rạc (chứng minh quy nạp, tổ hợp, logic), Giải tích cơ bản (hàm số, giới hạn) và kỹ năng lập trình bằng ngôn ngữ C/C++ (đặc biệt là con trỏ, hàm và cấu trúc mảng).

3. Điểm khác biệt của giáo trình so với các tài liệu khác là gì?

Giáo trình duy trì tính hình thức hóa toán học chặt chẽ, kết hợp việc so sánh nhiều cách tiếp cận trên cùng một bài toán cụ thể (như bài toán tìm dãy con lớn nhất với 4 thuật toán khác nhau), cùng hệ thống thuật toán nâng cao được viết chi tiết như KMP, Boyer-Moore, cây AVL và Định lý thợ rút gọn.

4. Làm sao để tự học giáo trình này đạt hiệu quả cao?

Người học nên kết hợp việc giải các bài tập toán học trên giấy (chứng minh tiệm cận, thiết lập công thức đệ quy) với việc tự tay gõ lại, biên dịch và chạy thử nghiệm các đoạn mã C được tác giả cung cấp trong sách trên các bộ dữ liệu kiểm thử thực tế.

5. Có tài liệu bổ trợ nào kèm theo cuốn sách?

Cuốn sách bao gồm hệ thống bài tập phong phú cuối mỗi chương, các bảng tính toán thời gian thực nghiệm, danh mục tài liệu tham khảo chuyên ngành và phần phụ lục hỗ trợ tra cứu thuật ngữ và giải thuật.


Kết luận

Giáo trình Cấu trúc dữ liệu và thuật toán của tác giả Nguyễn Đức Nghĩa là tài liệu học thuật chuẩn mực, hệ thống hóa toàn diện các kiến thức nền tảng và nâng cao về cấu trúc dữ liệu và thiết kế giải thuật cho khối ngành Công nghệ Thông tin.

Lộ trình học tập khuyến nghị bắt đầu từ việc nắm vững kỹ thuật phân tích độ phức tạp và thuật toán đệ quy (Chương 1–2), làm chủ các cấu trúc dữ liệu cơ bản và cấu trúc cây (Chương 3–4), rèn luyện kỹ năng phân tích giải thuật qua các thuật toán sắp xếp và tìm kiếm (Chương 5–6), sau đó hoàn thiện với các giải thuật đồ thị phức tạp (Chương 7). Người học nên kết hợp nghiên cứu giáo trình cùng việc tham khảo các tài liệu quốc tế được trích dẫn và thực hành lập trình thường xuyên trên máy tính.