Vẽ cây nhị phân tìm kiếm bằng cách thêm lần lượttừng ký tự vào cây theo thứ tự từ trái qua phải của dãy ký tự trên, biết rằng giá trịcủa từng ký tự tương ứng theo thứ tự xuất hiện của ký
Trang 1KHOA KHOA HỌC MÁY TÍNH
ĐỀ THI CUỐI KỲ
HỌC KỲ 2 – NĂM HỌC 2021 – 2022
Môn thi: CTDL & GT
Mã lớp: Các lớp đại trà, chất lượng cao
Thời gian làm bài: 90 phút
(Sinh viên không được sử dụng tài liệu)
Cho dãy ký tự như sau: F, D, B, A, C, E, H, G, I
Hãy thực hiện các yêu cầu sau:
Trang 2a Vẽ cây nhị phân tìm kiếm bằng cách thêm lần lượttừng ký tự vào cây theo thứ
tự từ trái qua phải của dãy ký tự trên, biết rằng giá trịcủa từng ký tự tương ứng
theo thứ tự xuất hiện của ký tự trong từ điển (1 điểm)
b Cho biết kết qủa duyệt cây theo RNL, NRL (0.5điểm)
c Huỷ lần lượt từng nút D, E, F, H trên cây, mỗi lầnhuỷ 1 nút vẽ lại cây nối tiếp
theo như thứ tự huỷ (1 điểm)
d Viết hàm đếm số lượng nút có một nút con trên cây,nếu cây rỗng thì in ra giá
trị -1 (1 điểm)
Trang 3• Tất cả các node có *tối đa* 3 con
• Tất cả các node, trừ node gốc , có từ 1 cho đến 2khóa (keys)
• Một node không phải lá và có n khóa thì phải có n+1node con
Hãy thực hiện các yêu cầu sau:
3.1Cho dãy số: 27, 19, 23, 9, 1, 3, 11, 21, 5, 13, 17,
15, 29, 25 Hỏi khi lần lượt thêm
các số trong dãy theo thứ tự từ trái qua phải vào mộtcây B-Tree bậc 3 rỗng thì:
a Các khóa nào khi thêm vào sẽ làm phát sinh thaotác split node? (0.5 điểm)
Trang 4b Vẽ cây B-Tree trước và sau khi thêm các khóa trên.(1điểm)
3.2Cho cây B-Tree bậc 3 như hình sau:
Hãy lần lượt tiến hành xóa các khóa sau khỏi cây Tree: 11, 21, 13 và vẽ cây B
B-Tree trước sau khi xóa mỗi khóa trên (0.5 điểm)
Lưu ý khi xoá:
- Khi khóa cần xóa (gọi là x) không nằm ở node lá,chọn khóa thế mạng là khóa
khóa của node cha
- Khi có 02 lựa chọn node liền kể để thực hiệncatenation, ưu tiên chọn catenate
Trang 5giữa node bị thiếu khóa với node liền trước
Câu 4: 2 điểm
Cho một bảng băm theo phương pháp thăm dò bậc 2
với hàm băm h(key) và hàm băm
lại (hay hàm thăm dò) prob(key, i) như sau:
h(key) = (key % M) prob(key, i) = (h(key) + i*i ) %
M
Trong đó:
- key là giá trị khóa
- i là một số nguyên cho biết lần thăm dò thứ i
Trang 6a Trình bày từng bước việc thêm các khóa Key trong
danh sách bên dưới vào
bảng băm theo đúng thứ tự trong danh sách (1 điểm)
b Trình bày từng bước việc xóa giá trị Key=16 trong
bảng băm khi hoàn thành
yêu cầu ở câu a (0.5 điểm)
c Trình bày từng bước việc tìm giá trị Key=10 trong
bảng băm khi hoàn thành
yêu cầu ở câu b (0.5 điểm)
Trang 7Câu 5: 1 điểm
Cho bài toán “Tô màu bản đồ” được đặt ra như sau:
Có một bản đồ các quốc gia trên
thế giới, ta muốn tô màu các quốc gia này sao cho hainước có cùng ranh giới được tô
khác màu nhau Yêu cầu tìm cách tô sao cho số màu
sử dụng là ít nhất Bài toán có
thể được mô hình hóa thành một bài toán trên đồ thị,khi đó mỗi nước trên bản đồ là một đỉnh của đồ thị,hai nước láng giềng tương ứng với hai đỉnh kề nhauđược nối với
nhau bằng một cạnh, bài toán trở thành: tô màu cácđỉnh của đồ thị sao cho mỗi đỉnh
chỉ được tô một màu, hai đỉnh kề nhau có màu khácnhau và số màu sử dụng là ít nhất
Giả sử cho thông tin đầu vào của bài toán được nhậpvào chương trình như sau:
Trang 8Hãy thực hiện các yêu cầu sau:
a Xây dựng cấu trúc dữ liệu thích hợp để biểu diễn đồthị nhằm lưu trữ các thông
tin cần thiết trên bản đồ (0.5 điểm)
b Viết hàm nhập đồ thị (bằng cách nhập số cạnh vàdanh sách các cạnh như ví dụ
ở trên) và lưu trữ thông tin của đồ thị vào cấu trúc dữliệu đã đề xuất ở câu a
(0.5 điểm)
Hết
Trang 9ĐÁP ÁN
CÂU 1
a Độ phức tạp của thuật toán
Selection sort theo định nghĩa Big-O
Độ phức tạp thời gian của thuật toán
Selection sort là O(n2)O(n2), trong đó nn là
số lượng phần tử trong mảng Điều này xảy
ra vì thuật toán phải thực hiện hai vòng lặplồng nhau:
Trang 10b Hàm sắp xếp mảng 1 chiều giảm dần với thuật toán Selection sort
Dưới đây là hàm sắp xếp mảng giảm dần bằng thuật toán Selection sort:
#include <stdio.h>
void selectionSortDescending(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
Trang 11// Hoán đổi phần tử lớn nhất với phần tử đầu tiêncủa mảng chưa sắp xếp
int temp = arr[i];
printf("Mang sau khi sap xep giam dan: ");
for (int i = 0; i < n; i++) {
Trang 12Hoán đổi 10 với phần tử đầu tiên (5): [10, 8, 9, 5, 3, 6]
Trang 13Bước 2:
Tìm phần tử lớn nhất trong mảng (từ chỉ số 1 đến 5): 9
Hoán đổi 9 với phần tử thứ hai (8): [10,
9, 8, 5, 3, 6]
Bước 3:
Tìm phần tử lớn nhất trong mảng (từ chỉ số 2 đến 5): 8
8 đã ở đúng vị trí: [10, 9, 8, 5, 3, 6]
Bước 4:
Tìm phần tử lớn nhất trong mảng (từ chỉ số 3 đến 5): 6
Hoán đổi 6 với phần tử thứ tư (5): [10,
9, 8, 6, 3, 5]
Trang 14Bước 5
Tìm phần tử lớn nhất trong mảng (từ chỉ số 4 đến 5): 5
Hoán đổi 5 với phần tử thứ năm (3): [10, 9, 8, 6, 5, 3]
Kết quả cuối cùng: [10, 9, 8, 6, 5, 3]
Qua các bước trên, chúng ta có thể thấy rằng thuật toán Selection sort đã sắp xếp mảng giảm dần một cách chính xác
Trang 15CÂU 2
a Vẽ cây nhị phân tìm kiếm
Chúng ta sẽ thêm các ký tự vào cây nhị phân tìm kiếm theo thứ tự từ trái qua
Trang 19\
C
b Kết quả duyệt cây theo RNL, NRL
Duyệt cây theo RNL (Right, Node, Left):
Trang 20Huỷ E: F
/ \
B H/ \ /
A G \
C
Huỷ F: G
/ \
B H/ \
A CHuỷ H: G
/
B
Trang 21/ \
A C
d Hàm đếm số lượng nút có một nút con
Trang 22Hàm count_one_child_nodes sẽ đếm số lượng nút có một nút con trên cây Nếu cây rỗng, nó sẽ trả về giá trị -1.
Trang 23a Các khóa làm phát sinh thao tác split node
Split node xảy ra khi một node vượt quá số khóa
tối đa (2 khóa) Các khóa làm phát sinh split nodelà:
19: Khi thêm 19, node gốc bị split.
9: Khi thêm 9, node lá bị split.
3: Khi thêm 3, node lá bị split.
11: Khi thêm 11, node lá bị split.
5: Khi thêm 5, node lá bị split.
13: Khi thêm 13, node lá bị split.
17: Khi thêm 17, node lá bị split.
15: Khi thêm 15, node lá bị split.
29: Khi thêm 29, node lá bị split.
25: Khi thêm 25, node lá bị split.
b Vẽ cây B-Tree trước và sau khi thêm các khóa
Trước khi thêm: Cây rỗng.
Sau khi thêm:
Cây B-Tree sẽ có cấu trúc như sau:
[15]
/ \
Trang 26
Trang 27CÂU 4
Trang 31Kết luận:
Trang 32Các khóa đã được thêm vào bảng băm theo phương pháp thăm dò bậc 2.
Trang 33CÂU 5
a Xây dựng cấu trúc dữ liệu thích hợp
để biểu diễn đồ thị
Để biểu diễn đồ thị, chúng ta có thể sử
dụng danh sách kề (adjacency list)
Đây là cấu trúc dữ liệu phù hợp vì:
Mỗi đỉnh (quốc gia) sẽ lưu trữ danh
sách các đỉnh kề với nó (các quốc gia láng giềng)
Trang 34Key: Tên đỉnh (tên quốc gia).
o o
"Viet_Nam": ["Lao", "Trung_Quoc"],
"Lao": ["Viet_Nam", "Thai_Lan"],
Trang 363.
Trang 37Nhập số cạnh ee.
4.
5.
Với mỗi cạnh, nhập hai đỉnh uu và vv,
sau đó thêm chúng vào danh sách kề của nhau
"Viet_Nam": ["Lao", "Trung_Quoc"],
"Lao": ["Viet_Nam", "Thai_Lan"],
"Trung_Quoc": ["Viet_Nam", "Thai_Lan"],
Trang 38"Thai_Lan": ["Lao", "Trung_Quoc",