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

Tài liệu bài giảng thuộc học phần Cấu trúc Dữ liệu và Giải thuật (Data Structure and Algorithms - mã môn CO2003), được biên soạn bởi TS. Nguyễn Đức Dũng (Duc Dung Nguyen, PhD. - nddung@hcmut.vn) thuộc Khoa Khoa học và Kỹ thuật Máy tính, Trường Đại học Bách Khoa – ĐHQG TP.HCM. Trong chương trình đào tạo kỹ sư Công nghệ Thông tin và Khoa học Máy tính, đây là môn học cơ sở ngành bắt buộc, cung cấp các nguyên lý tổ chức dữ liệu bộ nhớ và thiết kế giải thuật tối ưu.

Tài liệu tập trung vào Chương 7: Cây AVL (Chapter 7 - AVL Tree) với quy mô 76 slide, được xây dựng nhằm đáp ứng các chuẩn đầu ra (Learning Outcomes) từ L.1 đến L.8 của môn học. Cụ thể, bài giảng trang bị cho người học khả năng:

  • L.1: Mô tả các khái niệm cây nhị phân (binary tree), cây nhị phân hoàn chỉnh (complete binary tree), cây nhị phân cân bằng (balanced binary tree), cây AVL (AVL tree), cây đa phân (multi-way tree).
  • L.2 & L.3: Mô tả cấu trúc lưu trữ và các phương thức cần thiết cho cấu trúc cây bằng mã giả (pseudocode).
  • L.4: Xác định tầm quan trọng của đặc tính cân bằng trong cây và đưa ra ví dụ chứng minh.
  • L.5: Nhận diện các trường hợp mất cân bằng của cây AVL và B-Tree, trình bày phương pháp tái cân bằng từng bước bằng sơ đồ.
  • L.6 & L.7: Cài đặt cây nhị phân và cây AVL bằng ngôn ngữ C/C++; ứng dụng cấu trúc cây để giải quyết bài toán tìm kiếm thực tế.
  • L.8: Phân tích độ phức tạp thuật toán và xây dựng chương trình thử nghiệm đánh giá hiệu năng.

Tài liệu tiếp cận kiến thức theo phương pháp quy nạp: bắt đầu từ phân tích giới hạn của Cây tìm kiếm nhị phân thông thường (BST), định nghĩa toán học về độ cân bằng, chuẩn hóa 4 trường hợp mất cân bằng, đến xây dựng mã giả hoàn chỉnh cho các thao tác chèn, xóa và tái cân bằng. Nguồn tư liệu thuật toán và hình ảnh minh họa được trích xuất từ giáo trình quốc tế Data Structures - A Pseudocode Approach with C++ (Richard F. Gilberg & Behrouz A. Forouzan).


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

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

Cấu trúc bài giảng Chương 7 phân định thành các khối chủ đề theo tiến trình logic chặt chẽ:

  1. Khái niệm Cây AVL (AVL Tree Concepts):

    • Định nghĩa: Cây AVL (được đặt tên theo hai nhà toán học G.M. Adel'son-Vel'skii và E.M. Landis) là một cây tìm kiếm nhị phân (Binary Search Tree - BST) thỏa mãn đồng thời hai điều kiện:
      1. Đặc tính BST: Khóa tại mỗi nút lớn hơn tất cả các khóa ở cây con bên trái và nhỏ hơn hoặc bằng các khóa ở cây con bên phải.
      2. Đặc tính cân bằng: Hiệu số chiều cao giữa cây con trái ($H_L$) và cây con phải ($H_R$) của nút đó không vượt quá 1 ($|H_L - H_R| \le 1$), và các cây con cũng là cây AVL.
    • Hệ số cân bằng (Balance Factor): Được phân loại thành 3 trạng thái cụ thể:
      • left_higher (LH): $H_L = H_R + 1$
      • equal_height (EH): $H_L = H_R$
      • right_higher (RH): $H_R = H_L + 1$
    • Phân loại cây AVL và Non-AVL: Minh họa qua các cây dữ liệu mẫu (ví dụ cây chứa các khóa 8, 5, 10, 3, 6, 9, 12, 1, 4, 7 là cây AVL; các cây có nhánh lệch tạo chênh lệch chiều cao lớn hơn 1 được xác định là Non-AVL).
  2. Lý do sử dụng Cây AVL và Các trường hợp mất cân bằng (Why AVL Trees & Balancing Trees):

    • Nguyên nhân suy biến: Khi dữ liệu được chèn vào BST theo thứ tự sắp xếp ($1, 2, 3, \dots$), BST sẽ suy biến thành danh sách liên kết, đẩy độ phức tạp tìm kiếm lên mức $O(n)$. Cây AVL đảm bảo cấu trúc luôn cân bằng, duy trì độ phức tạp tìm kiếm ở mức tối ưu $O(\log_2 n)$.
    • 4 trường hợp mất cân bằng:
      • Left of Left (LL): Cây con trái của một cây đang ở trạng thái lệch trái (LH) tiếp tục bị lệch trái. Khắc phục bằng một phép quay đơn sang phải (rotateRight).
      • Right of Right (RR): Cây con phải của một cây đang ở trạng thái lệch phải (RH) tiếp tục bị lệch phải. Khắc phục bằng một phép quay đơn sang trái (rotateLeft).
      • Right of Left (RL - theo slide định nghĩa là cây con phải của một cây lệch trái): Khắc phục bằng phép quay kép: quay trái cây con bên trái, sau đó quay phải nút gốc.
      • Left of Right (LR - theo slide định nghĩa là cây con trái của một cây lệch phải): Khắc phục bằng phép quay kép: quay phải cây con bên phải, sau đó quay trái nút gốc.
  3. Cấu trúc lưu trữ và Thao tác giải thuật (AVL Tree Operations):

    • Cấu trúc dữ liệu: Khai báo cấu trúc dạng nút động liên kết con trỏ (dataType gồm key, field1; node gồm data, con trỏ left, right, trường balance; avlTree quản lý con trỏ root). Tài liệu lưu ý cấu trúc mảng (Array) không phù hợp để biểu diễn cây AVL.
    • Giải thuật phép quay cơ bản:
      • rotateRight(ref root): Đổi con trỏ chuyển nút con trái lên làm gốc mới, cây con phải của con trái thành con trái của gốc cũ.
      • rotateLeft(ref root): Đổi con trỏ chuyển nút con phải lên làm gốc mới, cây con trái của con phải thành con phải của gốc cũ.
    • Giải thuật chèn (AVLInsert): Cài đặt đệ quy sử dụng biến cờ taller (kiểu Boolean) để ghi nhận sự gia tăng chiều cao cây con khi quay lui (back out). Tùy thuộc vào trạng thái cân bằng của gốc (LH, EH, RH), hàm kích hoạt leftBalance hoặc rightBalance để tái lập cân bằng.
    • Giải thuật xóa (AVLDelete): Cài đặt đệ quy kết hợp tìm nút thay thế (nút cực phải của cây con trái), giải phóng bộ nhớ (recycle), sử dụng biến cờ shorter để kích hoạt tái cân bằng thông qua deleteRightBalance hoặc deleteLeftBalance.
  4. Cây đa phân (B-Trees):

    • Mở rộng khái niệm cây tìm kiếm sang cấu trúc cây nhiều nhánh (multi-way search tree), phục vụ tổ chức và truy xuất dữ liệu trên bộ nhớ ngoài.

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

  • Nguyên lý cân bằng chiều cao: Khái niệm hiệu số chiều cao giữa hai cây con và cách lượng hóa trạng thái cân bằng qua biến số balance factor tại từng nút.
  • Biến đổi cấu trúc bằng phép quay cục bộ: Kỹ thuật điều chỉnh liên kết con trỏ không làm thay đổi tính chất thứ tự của cây tìm kiếm nhị phân (in-order traversal order invariant).
  • Cơ chế lan truyền trạng thái trong đệ quy: Kỹ thuật truyền tham chiếu cờ trạng thái (taller, shorter) ngược từ điểm chèn/xóa tại lá lên gốc để quyết định điểm xoay cục bộ.

Kỹ năng phát triển

  • Kỹ năng thiết kế và đọc hiểu mã giả: Đọc hiểu và chuyển thể các thuật toán mã giả chuẩn (AVLInsert, AVLDelete, rotateLeft, rotateRight) thành chương trình thực thi.
  • Kỹ năng cài đặt C/C++: Hiện thực hóa cấu trúc dữ liệu nút động, quản lý bộ nhớ thông qua con trỏ (pointer, recycle).
  • Kỹ năng phân tích độ phức tạp: Đánh giá chi phí tính toán qua ký hiệu Big-O, chứng minh cấu trúc AVL chặn được trường hợp suy biến xấu nhất ($O(n)$ của BST) về mức $O(\log_2 n)$.

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

Bài giảng CO2003 sử dụng phương pháp sư phạm cấu trúc hóa, phối hợp giữa lý thuyết hình thức, mô hình hóa giải thuật và mã giả:

  1. Phương pháp sư phạm trực quan: Mỗi trường hợp mất cân bằng (LL, RR, RL, LR) đều được minh họa bằng sơ đồ cây cụ thể trước và sau khi thực hiện phép quay. Việc này giúp sinh viên hiểu rõ bản chất chuyển dịch con trỏ trước khi tiếp cận mã giả.
  2. Hệ thống mã giả chuẩn hóa: Toàn bộ thuật toán được mô tả qua các hợp đồng hàm rõ ràng gồm các mục Pre (điều kiện tiên quyết), Post (kết quả sau xử lý), Return (giá trị trả về) và các tham số truyền theo tham chiếu (ref root, ref taller, ref shorter, ref success).
  3. Phân tích ca (Case Analysis) chi tiết: Trong các hàm cân bằng như leftBalance, rightBalance, deleteRightBalance, deleteLeftBalance, bài giảng bóc tách từng nhánh rẽ dựa trên giá trị hệ số cân bằng của cây con (LH, EH, RH), giúp sinh viên bao quát toàn bộ các trường hợp biên của thuật toán.
  4. Phương pháp đánh giá: Đánh giá năng lực của người học thông qua:
    • Bài tập vẽ và mô phỏng từng bước tái cân bằng cây khi chèn/xóa dãy khóa.
    • Cài đặt hoàn chỉnh chương trình trên C/C++.
    • Phát triển chương trình thử nghiệm (experiment/program) nhằm đo lường và đánh giá thực nghiệm thời gian thực thi của các thao tác trên cây (theo chuẩn đầu ra L.8).

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

  • Tính học thuật chuẩn mực: Nội dung bài giảng bám sát tài liệu tham khảo chuyên ngành Data Structures - A Pseudocode Approach with C++, bảo đảm tính chính xác trong định nghĩa và chuẩn hóa cú pháp giải thuật.
  • Trình bày toàn diện giải thuật xóa (AVL Delete): Khác với nhiều tài liệu chỉ tập trung vào thao tác chèn, bài giảng này cung cấp đầy đủ chi tiết thuật toán xóa nút (AVLDelete) và cả 2 hàm tái cân bằng phức tạp sau khi xóa (deleteRightBalance và deleteLeftBalance), phân tích rõ ràng trường hợp cây con giảm độ cao và cách cập nhật lại hệ số cân bằng.
  • Tối ưu hóa logic đệ quy: Giải thuật cân bằng được tích hợp trực tiếp vào pha thoái lui của hàm đệ quy (back out of the tree), giúp quá trình kiểm tra và tái cân bằng diễn ra tự động dọc theo đường dẫn từ nút lá về gốc mà không cần duyệt lại toàn bộ cây.
  • Tính định hướng ứng dụng: Nêu rõ lý do kỹ thuật vì sao cấu trúc mảng không phù hợp với cây AVL, đồng thời định hướng sinh viên sử dụng cây AVL trong các bài toán tìm kiếm hiệu năng cao và mở rộng sang B-Tree cho các hệ thống lưu trữ khối lượng lớn.

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

  • Sinh viên đại học: Sinh viên năm thứ 2 hoặc năm thứ 3 thuộc các ngành Khoa học Máy tính, Kỹ thuật Máy tính, Công nghệ Thông tin, Hệ thống Thông tin đang theo học học phần Cấu trúc Dữ liệu và Giải thuật (CO2003).
  • Yêu cầu kiến thức tiên quyết (Prerequisites):
    • Nắm vững kỹ thuật lập trình C/C++, đặc biệt là con trỏ (pointers), cấp phát/giải phóng bộ nhớ động.
    • Hiểu rõ kỹ thuật lập trình đệ quy.
    • Đã học qua cấu trúc dữ liệu danh sách liên kết (Linked List) và Cây tìm kiếm nhị phân cơ bản (BST).
  • Giảng viên: Sử dụng làm tài liệu khung để giảng dạy bài học Cây AVL trên lớp, hướng dẫn sinh viên làm bài tập lập trình lớn (assignment), và xây dựng câu hỏi thi đánh giá chuẩn đầu ra.
  • Người tự học và nghiên cứu: Lập trình viên cần nghiên cứu cấu trúc dữ liệu nâng cao để tối ưu hóa giải thuật tìm kiếm hoặc chuẩn bị cho các kỳ thi đánh giá năng lực thuật toán.

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

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

Tài liệu được thiết kế cho sinh viên ngành Khoa học và Kỹ thuật Máy tính thuộc Trường Đại học Bách Khoa – ĐHQG TP.HCM đang học môn CO2003, cũng như người học cần tài liệu chuẩn hóa về mã giả và giải thuật cây tự cân bằng.

2. Cần kiến thức nền nào để học chương Cây AVL?

Người học cần có kiến thức vững về ngôn ngữ C/C++ (thao tác con trỏ và quản lý bộ nhớ động), hiểu rõ cơ chế đệ quy, nắm vững đặc tính của Cây tìm kiếm nhị phân (BST) và phương pháp đánh giá độ phức tạp thuật toán bằng ký hiệu Big-O.

3. Điểm khác biệt chính giữa cây AVL và cây tìm kiếm nhị phân thông thường (BST) là gì?

Cây BST thông thường có thể bị suy biến thành dạng danh sách tuyến tính với độ phức tạp tìm kiếm $O(n)$ khi các phần tử được chèn theo thứ tự tăng hoặc giảm dần. Cây AVL bổ sung điều kiện cân bằng chiều cao ($|H_L - H_R| \le 1$), tự động cân bằng lại qua các phép quay, đảm bảo độ phức tạp cho các thao tác tìm kiếm, chèn và xóa luôn ở mức $O(\log_2 n)$.

4. Làm sao để tự học và nắm vững các giải thuật trong bài giảng?

Người học nên thực hiện theo quy trình 4 bước:

  1. Hiểu rõ định nghĩa và 3 trạng thái của hệ số cân bằng (LH, EH, RH).
  2. Tự vẽ mô phỏng 4 trường hợp mất cân bằng (LL, RR, RL, LR) trên giấy và thực hiện các phép quay tương ứng.
  3. Phân tích luồng biến cờ taller/shorter trong mã giả AVLInsert/AVLDelete.
  4. Chuyển đổi mã giả sang mã nguồn C/C++ hoàn chỉnh và chạy kiểm thử với các bộ dữ liệu khác nhau.

5. Tài liệu tham khảo chính của bài giảng là gì?

Tài liệu trích xuất cấu trúc thuật toán, mã giả và sơ đồ minh họa từ cuốn giáo trình Data Structures - A Pseudocode Approach with C++ của hai tác giả Richard F. Gilberg và Behrouz A. Forouzan.


Kết luận

Bài giảng Chapter 7 - AVL Tree thuộc học phần Data Structure and Algorithms [CO2003] của Trường Đại học Bách Khoa – ĐHQG TP.HCM cung cấp hệ thống kiến thức hoàn chỉnh về cây tìm kiếm nhị phân tự cân bằng. Tài liệu kết hợp chặt chẽ giữa định nghĩa toán học, sơ đồ biến đổi trực quan và hệ thống mã giả chi tiết cho các thao tác phức tạp như AVLInsert, AVLDelete cùng các thuật toán quay cân bằng. Để tiếp thu môn học hiệu quả, người học nên tuân thủ lộ trình từ đọc hiểu mã giả, phân tích độ phức tạp Big-O đến thực hành cài đặt hoàn chỉnh bằng C/C++ kết hợp tham khảo giáo trình chuẩn Data Structures - A Pseudocode Approach with C++.