Giao diện
Bài tập ôn luyện: Cấu trúc dữ liệu và giải thuật
Tài liệu tuyển chọn hệ thống bài tập cho môn Cấu trúc dữ liệu và giải thuật (DSA), bao gồm phân tích độ phức tạp thời gian, cấu trúc dữ liệu nâng cao (AVL, Heap, Bảng băm) và thuật toán đồ thị.
Phần 1. Phân tích độ phức tạp & Cấu trúc dữ liệu tuyến tính
Bài 1.1: Định lý thợ (Master Theorem) và phân tích đệ quy
Sử dụng Định lý thợ để xác định bậc độ phức tạp thời gian tiệm cận
(Thuật toán Merge Sort)
Lời giải gợi ý
Dạng chuẩn của định lý thợ là
. Ở đây . Rơi vào trường hợp 2 của Định lý thợ: . Ở đây . Vì , rơi vào trường hợp 1: . Ở đây . Vì , rơi vào trường hợp 3: . Ở đây . Trường hợp 2:
Phần 2. Cây nhị phân tìm kiếm & Cây cân bằng AVL
Bài 2.1: Chèn phần tử và phép quay trên cây AVL
Cây AVL là cây nhị phân tìm kiếm (BST) tự cân bằng sao cho tại mọi nút, độ chênh lệch chiều cao giữa cây con trái và cây con phải (hệ số cân bằng
Cho cây AVL rỗng. Lần lượt chèn các khóa sau vào cây:
- Vẽ hoặc mô tả cây sau khi chèn 3 phần tử đầu tiên
. Chỉ rõ loại phép quay (Rotation) cần thực hiện. - Vẽ cây sau khi chèn tiếp
và chỉ rõ phép quay tương ứng. - Chèn phần tử
, chỉ rõ vị trí mất cân bằng và loại phép quay kép (Double Rotation) được kích hoạt.
Lời giải gợi ý
Chèn
: - Tạo thành chuỗi lệch phải (Right-Right): Nút
có độ cao cây con phải là , cây con trái là . - Thực hiện Phép quay đơn sang trái (Left Rotation) tại nút
: - Nút
trở thành gốc mới. - Con trái của
là , con phải là . Cây cân bằng hoàn hảo ( ).
- Nút
- Tạo thành chuỗi lệch phải (Right-Right): Nút
Chèn tiếp
: - Chèn
: Vào con phải của . Cây vẫn cân bằng ( ). - Chèn
: Vào con phải của . Tại nút , nhánh phải có độ cao 2, nhánh trái độ cao 0 (dạng Right-Right). - Thực hiện Phép quay đơn sang trái (Left Rotation) tại nút
: - Nút
lên làm con phải của . - Con trái của
là , con phải là . Cây cân bằng.
- Nút
- Chèn
Chèn tiếp
: đi sang phải. đi sang trái. làm con trái của . - Kiểm tra hệ số cân bằng từ dưới lên:
(cân bằng). (cân bằng). Tại nút gốc : Nhánh trái (chứa ) có . Nhánh phải (chứa ) có (mất cân bằng). Tại nút con phải , dạng Right-Left (RL). - Kích hoạt Phép quay kép Right-Left:
- Bước 1: Quay phải tại
. Nút lên thay , trở thành con phải của . - Bước 2: Quay trái tại gốc
. Nút trở thành gốc mới của toàn cây! - Cây cân bằng hoàn toàn sau thao tác: Gốc là
, cây con trái có gốc (với con ), cây con phải có gốc (với con ).
- Bước 1: Quay phải tại
Phần 3. Bảng băm & Xử lý xung đột (Hashing)
Bài 3.1: Dò tuyến tính (Linear Probing) và Băm kép (Double Hashing)
Cho bảng băm có kích thước
Lần lượt chèn các khóa sau vào bảng băm:
- Sử dụng phương pháp Dò tuyến tính (Linear Probing) với hàm kiểm tra vị trí:Xác định vị trí cuối cùng của từng khóa trong bảng băm và tính số lần xung đột (collisions).
- Sử dụng phương pháp Băm kép (Double Hashing) với hàm băm thứ hai
và hàm vị trí: Xác định vị trí cuối cùng của các khóa và so sánh hiện tượng dồn cụm (clustering).
Lời giải gợi ý
Dò tuyến tính:
- Khóa
: Phép tính ô 5 (trống). - Khóa
: Phép tính xung đột ô 5! Thử : Giá trị ô 6 (trống). (1 xung đột) - Khóa
: Phép tính xung đột ô 5, thử ô 6 (xung đột), thử ô 0: Giá trị ô 0 (trống). (2 xung đột) - Khóa
: Phép tính xung đột 5, 6, 0. Thử ô 1: Giá trị ô 1 (trống). (3 xung đột) - Khóa
: Phép tính xung đột 5, 6, 0, 1. Thử ô 2: Giá trị ô 2 (trống). (4 xung đột) - Bảng cuối cùng:
- Ô 0: 19
- Ô 1: 33
- Ô 2: 40
- Ô 3: Trống
- Ô 4: Trống
- Ô 5: 12
- Ô 6: 26
- Khóa
Băm kép giúp bước nhảy phụ thuộc vào giá trị của khóa, phân tán đều các khóa bị trùng giá trị băm đầu tiên và triệt tiêu hoàn toàn hiện tượng dồn cụm cấp 1 (Primary Clustering).
Phần 4. Giải thuật đồ thị (Graph Algorithms)
Bài 4.1: Thuật toán Dijkstra tìm đường đi ngắn nhất
Cho đồ thị có trọng số không âm với các đỉnh
- Áp dụng thuật toán Dijkstra để tìm khoảng cách ngắn nhất từ đỉnh nguồn
đến tất cả các đỉnh còn lại. - Lập bảng theo dõi khoảng cách tạm thời
và tập đỉnh đã cố định khoảng cách qua từng bước lặp. - Rút ra cây đường đi ngắn nhất (Shortest Path Tree) xuất phát từ
.
Lời giải gợi ý
- Khởi tạo:
. Tập đỉnh đã chốt . - Bước 1: Chọn
( ). Chốt . Cập nhật lân cận của : - Bước 2: Trong các đỉnh chưa chốt
, đỉnh nhỏ nhất là ( ). Chốt . Cập nhật lân cận của : (rút ngắn được qua !)
- Bước 3: Trong các đỉnh chưa chốt
, nhỏ nhất là ( ). Chốt . Cập nhật lân cận của : (rút ngắn qua !)
- Bước 4: Trong các đỉnh chưa chốt
, nhỏ nhất là ( ). Chốt . Cập nhật lân cận của : (rút ngắn qua !)
- Bước 5: Chốt đỉnh cuối cùng
( ). - Kết quả khoảng cách ngắn nhất:
(đường đi: ) (đường đi: ) (đường đi: ) (đường đi: )