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

Bài giảng học phần Cấu trúc dữ liệu do tác giả Phan Chí Tùng biên soạn, thuộc Khoa Công nghệ Thông tin – Trường Đại học Bách Khoa (Đại học Đà Nẵng), xuất bản dưới dạng lưu hành nội bộ năm 2022. Trong chương trình đào tạo kỹ sư và cử nhân ngành Công nghệ Thông tin, Cấu trúc dữ liệu giữ vị trí học phần cơ sở ngành bắt buộc, đóng vai trò bản lề kết nối giữa học phần Kỹ thuật lập trình và các môn học chuyên sâu như Cơ sở dữ liệu, Hệ điều hành, Nguyên lý xây dựng chương trình dịch và Thiết kế giải thuật.

Mục tiêu học tập của tài liệu tập trung trang bị cho người học:

  • Khả năng phân biệt và phân loại các kiểu dữ liệu từ đơn giản (số nguyên, số thực, ký tự) đến có cấu trúc (mảng, chuỗi ký tự, bản ghi struct, con trỏ, tham chiếu).
  • Kỹ năng thiết kế, biểu diễn và thao tác trên các cấu trúc dữ liệu tuyến tính (danh sách đặc, danh sách liên kết đơn, kép, vòng, đa liên kết; ngăn xếp; hàng đợi) và phi tuyến tính (cây tổng quát, cây nhị phân, cây nhị phân tìm kiếm, cây cân bằng AVL).
  • Năng lực phân tích, cài đặt các giải thuật sắp xếp nội (Selection Sort, Insertion Sort, Bubble Sort, Merge Sort, Heap Sort, Quick Sort), sắp xếp ngoại (phương pháp trộn RUN, trộn tự nhiên) và các giải thuật tìm kiếm, bảng băm mở.

Cấu trúc giáo trình gồm 5 chương được biên soạn theo trình tự từ bản chất lưu trữ vật lý trong bộ nhớ RAM đến các cấu trúc dữ liệu trừu tượng hóa và thuật toán tối ưu hóa. Điểm đặc sắc của tài liệu là phương pháp tiếp cận gắn liền với việc mô hình hóa địa chỉ ô nhớ cụ thể (ví dụ: các nhãn địa chỉ 7TĐT, 8NLB, 5TĐT), minh họa thao tác con trỏ qua mã nguồn C/C++ trực quan và đưa các dữ liệu thực tế (như chuỗi bài báo về dịch bệnh COVID-19 năm 2020) vào việc giải thích nguyên lý phân mảnh và liên kết bộ nhớ.


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

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

Nội dung bài giảng được tổ chức thành 5 chương trọng tâm với progression logic đi từ thấp lên cao:

[Chương 1: Kiểu dữ liệu, Con trỏ, Đệ quy] 
  • Chương 1: Các khái niệm cơ bản: Thiết lập định nghĩa về dữ liệu, kiểu dữ liệu, cấu trúc dữ liệu và mối quan hệ giữa thuật toán với cấu trúc dữ liệu. Trình bày chi tiết các kiểu dữ liệu cơ bản trong ngôn ngữ C: kiểu đơn giản (char, int, long, float, double), kiểu có cấu trúc (mảng, chuỗi ký tự, bản ghi struct), kiểu con trỏ (toán tử địa chỉ &, toán tử giải tham chiếu *, cấp phát new, thu hồi delete), kiểu tham chiếu (&) và kỹ thuật đệ quy dựa trên 3 nguyên lý (tham số hóa, trường hợp dễ nhất, trường hợp tổng quát) qua bài toán giai thừa fact(n) và ước số chung lớn nhất uscln(x, y).
  • Chương 2: Danh sách: Khảo sát các hình thức biểu diễn danh sách:
    • Danh sách đặc: Lưu trữ kế tiếp bằng mảng một chiều với kích thước tĩnh Nmax.
    • Danh sách liên kết đơn: Cài đặt qua cấu trúc nút chứa dữ liệu và con trỏ next.
    • Danh sách đa liên kết: Nút chứa nhiều liên kết độc lập (ví dụ con trỏ next1 liên kết theo thứ tự họ tên, next2 theo thứ tự chiều cao).
    • Danh sách liên kết kép: Nút chứa đồng thời con trỏ liên kết trước pPrev và liên kết sau pNext.
    • Danh sách liên kết vòng: Nút cuối trỏ quay về nút đầu danh sách.
    • Danh sách hạn chế: Ngăn xếp (Stack - LIFO) và Hàng đợi (Queue - FIFO) được cài đặt bằng danh sách liên kết.
  • Chương 3: Cây: Nghiên cứu mô hình phân cấp phi tuyến tính:
    • Định nghĩa cây: Nút gốc (Root), nút lá, cấp của nút, cấp của cây, mức, chiều cao, đường đi.
    • Cây nhị phân: Định nghĩa, tính chất toán học ($2^{i-1}$ nút ở mức $i$), cây hoàn chỉnh, cây đầy đủ, biểu diễn bằng mảng và con trỏ. Ba phép duyệt cây: Duyệt trước (Pre-order), Duyệt giữa (In-order), Duyệt sau (Post-order).
    • Cây nhị phân tìm kiếm (BST): Cấu trúc định hướng khóa, các thao tác tìm kiếm, chèn nút và xóa nút sử dụng phần tử thế mạng.
    • Cây cân bằng hoàn toàn và Cây cân bằng AVL (Adelson-Velskii & Landis, 1962): Định nghĩa chỉ số cân bằng balFactor (LH, EH, RH), giới hạn chiều cao cây $h \approx \log_2 n$ để giữ chi phí tìm kiếm ở mức $O(\log_2 n)$.
    • Cây tổng quát và Cây biểu thức: Biến đổi cây tổng quát thành cây nhị phân tương đương (nguyên tắc con trái - em phải); biểu diễn biểu thức tiền tố (prefix), trung tố (infix) và hậu tố (postfix) Balan.
  • Chương 4: Sắp xếp thứ tự dữ liệu:
    • Sắp xếp nội: Trình bày giải thuật, phân tích độ phức tạp và mã nguồn C của các phương pháp: Lựa chọn trực tiếp (Selection Sort), Chèn trực tiếp (Insertion Sort), Chèn nhị phân, Nổi bọt (Bubble Sort), Trộn trực tiếp (Merge Sort - chi phí $O(n \log_2 n)$), Vun đống (Heap Sort của J. Williams trên cấu trúc mảng biểu diễn cây nhị phân hoàn chỉnh với hàm Shift), Sắp xếp nhanh (Quick Sort sử dụng kỹ thuật phân hoạch với phần tử chốt ở giữa).
    • Sắp xếp ngoại: Xử lý tập tin tuần tự và truy xuất ngẫu nhiên khi kích thước vượt quá bộ nhớ trong, tập trung vào phương pháp trộn RUN trên các tập tin trung gian $f_1, f_2$ và phương pháp trộn tự nhiên qua biến cờ eor (end of run).
  • Chương 5: Tìm kiếm dữ liệu: Khảo sát nhu cầu tìm kiếm, giải thuật tìm kiếm tuần tự ($O(n)$), tìm kiếm nhị phân ($O(\log_2 n)$) và cấu trúc dữ liệu bảng băm mở (Open Hash Table).

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

  • Lý thuyết trừu tượng hóa dữ liệu (Data Abstraction): Phân tách rõ ràng giữa định nghĩa toán học trừu tượng của một kiểu dữ liệu (ADT) với việc hiện thực hóa vật lý của nó trong bộ nhớ máy tính.
  • Nguyên lý quản lý tài nguyên bộ nhớ: Cơ chế cấp phát động trên vùng nhớ Heap (new, delete), quản trị địa chỉ ô nhớ qua con trỏ, và kỹ thuật giảm thiểu không gian lưu trữ phụ trợ trong các giải thuật sắp xếp tại chỗ (in-place sorting).
  • Phân tích tiệm cận thuật toán: Xác định cận trên và trường hợp tốt nhất/xấu nhất của thời gian thực thi thuật toán theo ký hiệu Big-$O$ ($O(1)$, $O(\log_2 n)$, $O(n)$, $O(n \log_2 n)$, $O(n^2)$) qua số lượng phép so sánh và phép gán/hoán vị.

Kỹ năng phát triển

  • Kỹ năng kỹ thuật (Technical skills): Cài đặt thuần thục các cấu trúc dữ liệu và giải thuật bằng ngôn ngữ C/C++; quản lý con trỏ, thao tác địa chỉ cấp thấp; thao tác vào/ra dữ liệu trên file nhị phân và file văn bản (FILE *, fopen, fscanf, fprintf).
  • Kỹ năng phân tích (Analytical skills): Khả năng so sánh đánh giá ưu nhược điểm giữa cấu trúc liên tục (mảng) và cấu trúc liên kết (con trỏ); lựa chọn giải thuật sắp xếp và tìm kiếm phù hợp với quy mô dữ liệu và giới hạn tài nguyên bộ nhớ.
  • Năng lực giải quyết vấn đề (Practical competencies): Xây dựng các chương trình ứng dụng hoàn chỉnh như quản lý hồ sơ sinh viên, chuyển đổi hệ cơ số bằng ngăn xếp, tính giá trị biểu thức số học qua cây biểu thức, và xử lý sắp xếp tập tin dữ liệu lớn trên đĩa từ.

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

Phương pháp tiếp cận sư phạm của giáo trình được xây dựng trên nguyên tắc kết hợp giữa giải thích hình thức toán học, trực quan hóa cấu trúc bộ nhớ và cung cấp mã nguồn mẫu C/C++ có thể thực thi ngay. Mỗi cấu trúc dữ liệu hoặc giải thuật đều tuân thủ tiến trình 4 bước:

  1. Nêu định nghĩa và điều kiện ràng buộc lý thuyết.
  2. Trực quan hóa cấu trúc dữ liệu trên sơ đồ bộ nhớ hoặc bảng trace trạng thái từng bước.
  3. Cài đặt các hàm thao tác chuẩn bằng ngôn ngữ lập trình C/C++.
  4. Đánh giá chi phí thuật toán (số phép so sánh, số phép gán, độ phức tạp $O$).
[1. Định nghĩa lý thuyết] 

Tài liệu sử dụng nhiều ví dụ và bài tập thực hành gắn với việc xây dựng kiểu dữ liệu người dùng tự định nghĩa:

  • Ví dụ quản lý sinh viên với bản ghi struct SVIEN (chứa các trường ht, cc, ns, t) và tính cân nặng tiêu chuẩn cntc theo công thức: $$\text{Cân nặng tiêu chuẩn (kg)} = \text{Chiều cao} \times 100 - 105$$
  • Ví dụ kiểu bản ghi hình chữ nhật struct HCN với các trường d, r, cv.
  • Ví dụ tính toán giá trị biểu thức toán học phức tạp thông qua cây biểu thức: $$(3 + 1)^3 / (9 - 5 + 2) - (3(7 - 4) + 6) = -13$$
  • Ví dụ về cơ chế xâu chuỗi thông tin dựa trên bài toán theo dõi các ca nhiễm dịch bệnh COVID-19 tại Việt Nam để giải thích tính chất lưu trữ phân tán của danh sách liên kết.

Phương pháp đánh giá trong học phần tập trung vào hai tiêu chí:

  • Đánh giá lý thuyết: Khả năng tái hiện các bước của thuật toán trên giấy thông qua bảng phân tích từng bước (như trace vòng lặp thuật toán Selection Sort, Quick Sort, dựng cây nhị phân tìm kiếm khi lần lượt thêm các khóa $50, 30, 40, 70, 20$).
  • Đánh giá kỹ năng lập trình: Khả năng viết đúng cú pháp các hàm thêm nút (InsertHead, AddTail, AddAfter, InsertStack), xóa nút (RemoveHead, RemoveTail, RemoveNode, delNode), giải phóng vùng nhớ và xử lý triệt để các trường hợp biên (danh sách rỗng, cây rỗng, con trỏ NULL).

Để tự học hiệu quả, người học được khuyến nghị vẽ lại mô hình liên kết của các con trỏ trước khi viết mã nguồn, gõ và biên dịch lại từng khối hàm con độc lập, kiểm tra các điều kiện dừng của đệ quy và tự chạy tay các trường hợp xấu nhất của giải thuật.


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

  • Nguồn gốc học thuật chuẩn mực: Giáo trình kế thừa và hệ thống hóa kiến thức từ các tài liệu tham khảo kinh điển trong và ngoài nước, bao gồm:
    • Data Structures and Algorithms của Alfred V. Aho & Jeffrey D. Ullman (1983).
    • Data Structures Using C and C++ của Yedidyah Langsam, Moshe J. Augenstein & Aaron M. Tenenbaum (1996).
    • Các công trình của các tác giả chuyên ngành tại Việt Nam: Đỗ Xuân Lôi (2003), Nguyễn Hồng Chương (2003), Lê Xuân Trường (1999), Đinh Mạnh Tường (2000), Nguyễn Trung Trực (2000).
  • Bổ sung nội dung sắp xếp ngoại (External Sort): Khác với nhiều bài giảng chỉ dừng lại ở sắp xếp nội trên mảng RAM, tài liệu của tác giả Phan Chí Tùng dành toàn bộ nửa sau Chương 4 để hướng dẫn chi tiết thuật toán sắp xếp ngoại với phương pháp trộn RUN và trộn tự nhiên. Phần này cung cấp đầy đủ mã nguồn C thao tác trực tiếp với các luồng tập tin (FILE *a, FILE *b, FILE *c, fopen, fscanf, fprintf), phục vụ trực tiếp cho việc xử lý các tập dữ liệu có kích thước vượt quá dung lượng bộ nhớ trong.
  • Trực quan hóa cấu trúc dữ liệu bộ nhớ RAM: Tài liệu thể hiện chi tiết cách thức các con trỏ lưu trữ địa chỉ của nhau trong bảng dữ liệu thực tế (như các địa chỉ ô nhớ giả định 7TĐT, 8NLB, 9TĐT, 5TĐT, 6NLB), giúp người học hình dung chính xác cách thức phân bổ bộ nhớ động khi liên kết đơn, liên kết kép hoặc liên kết vòng hoạt động.
  • Ứng dụng công nghệ thực tế: Trình bày rõ ràng các ứng dụng của cấu trúc dữ liệu trong việc xây dựng hệ điều hành (cây thư mục quản lý tập tin), trình biên dịch (cây cú pháp, chuyển đổi biểu thức trung tố sang tiền tố/hậu tố Balan) và hệ thống quản trị cơ sở dữ liệu (cây cân bằng AVL, bảng băm).

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

  • Sinh viên đại học chuyên ngành: Phù hợp cho sinh viên năm thứ nhất (học kỳ 2) hoặc năm thứ hai thuộc các ngành Công nghệ Thông tin, Kỹ thuật Phần mềm, Khoa học Máy tính, Hệ thống Thông tin, Kỹ thuật Máy tính và Mạng máy tính.
  • Kiến thức tiên quyết (Prerequisites): Người học cầ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 với ngôn ngữ C/C++. Cần nắm vững kiến thức về cú pháp cơ bản, các cấu trúc điều khiển rẽ nhánh (if-else, switch-case), vòng lặp (for, while, do-while), kỹ thuật viết và truyền tham số cho hàm, cấu trúc mảng một chiều và các toán tử số học.
  • Giảng viên đại học và cao đẳng: Sử dụng bài giảng làm tài liệu chuẩn để xây dựng đề cương môn học, biên soạn slide giảng dạy, thiết kế bài tập thực hành trên phòng máy và xây dựng ngân hàng câu hỏi kiểm tra, thi kết thúc học phần.
  • Kỹ sư phần mềm và người tự học: Phục vụ làm tài liệu tham khảo cho các lập trình viên cần củng cố lại nền tảng khoa học máy tính, nắm vững bản chất tổ chức bộ nhớ và cơ chế thực thi của các thuật toán kinh điển phục vụ cho việc tối ưu hóa hiệu năng phần mềm hoặc chuẩn bị cho các kỳ đánh giá kỹ thuật chuyên môn.

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

1. Giáo trình này phù hợp với đối tượng nào?

Tài liệu được biên soạn phục vụ đào tạo bậc đại học khối ngành Công nghệ Thông tin và Kỹ thuật Phần mềm. Giáo trình phù hợp cho sinh viên đang theo học môn Cấu trúc dữ liệu và giải thuật, cũng như kỹ sư phần mềm cần củng cố kiến thức nền tảng về tổ chức bộ nhớ và thuật toán.

2. Cần chuẩn bị những kiến thức nền tảng nào trước khi học?

Người học cần có kiến thức cơ bản về ngôn ngữ lập trình C hoặc C++, bao gồm cú pháp câu lệnh, cấu trúc điều khiển, kiểu dữ liệu mảng, và hiểu biết ban đầu về hàm. Các khái niệm phức tạp hơn như con trỏ, tham chiếu và đệ quy đã được hệ thống hóa lại chi tiết ngay trong Chương 1 của tài liệu.

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

Tài liệu tích hợp đầy đủ cả hai mảng: lý thuyết thuật toán và mã nguồn C/C++ hoàn chỉnh. Đặc biệt, giáo trình không chỉ dừng lại ở các thuật toán sắp xếp trên RAM (sắp xếp nội) mà còn đi sâu vào sắp xếp trên tập tin đĩa (sắp xếp ngoại qua phương pháp trộn RUN), đồng thời trực quan hóa cơ chế bộ nhớ thông qua các mô hình ô nhớ RAM cụ thể.

4. Phương pháp tự học giáo trình này như thế nào để đạt hiệu quả cao?

Người học nên kết hợp đọc lý thuyết, vẽ lại sơ đồ cấu trúc dữ liệu trên giấy, sau đó tự tay nhập và thực thi các đoạn mã nguồn mẫu trong giáo trình bằng các trình biên dịch C/C++ tiêu chuẩn. Tiếp theo, cần tự thực hiện bảng trace từng bước của các giải thuật (Selection Sort, Merge Sort, Quick Sort, Heap Sort) với các bộ dữ liệu nhỏ trước khi cài đặt giải thuật hoàn chỉnh.

5. Có những tài liệu tham khảo bổ trợ nào được khuyến nghị?

Người học có thể tham khảo thêm 8 tài liệu kinh điển được tác giả trích dẫn trong phần danh mục tham khảo, tiêu biểu như giáo trình của Đỗ Xuân Lôi (2003), Đinh Mạnh Tường (2000), Nguyễn Trung Trực (2000), cùng các sách quốc tế của Alfred V. Aho & Jeffrey D. Ullman (1983) và Yedidyah Langsam & Moshe J. Augenstein & Aaron M. Tenenbaum (1996).


Kết luận

Bài giảng Cấu trúc dữ liệu của tác giả Phan Chí Tùng (Khoa Công nghệ Thông tin – Trường Đại học Bách Khoa, Đại học Đà Nẵng, 2022) là tài liệu học thuật hoàn chỉnh, cung cấp hệ thống kiến thức nền tảng về việc mô hình hóa, tổ chức dữ liệu và thiết kế giải thuật trên ngôn ngữ lập trình C/C++.

Lộ trình học tập đề xuất theo tài liệu gồm:

  1. Củng cố bản chất con trỏ, kiểu dữ liệu bản ghi và đệ quy (Chương 1).
  2. Làm chủ các cấu trúc dữ liệu tuyến tính và danh sách hạn chế (Chương 2).
  3. Nghiên cứu cấu trúc phân cấp phi tuyến tính và cây cân bằng AVL (Chương 3).
  4. Cài đặt các giải thuật sắp xếp nội, sắp xếp ngoại và đánh giá độ phức tạp tính toán (Chương 4).
  5. Làm chủ các giải thuật tìm kiếm và cấu trúc bảng băm mở (Chương 5).

Người học nên kết hợp nghiên cứu bài giảng với việc thực hành cài đặt mã nguồn thực tế và tham khảo các tài liệu chuyên khảo được trích dẫn trong giáo trình để phát triển toàn diện tư duy giải thuật trong kỹ thuật phần mềm.