Đây là một đề thi giữa kỳ mẫu của môn giải thuật nâng cao của sinh viên cao học. trong tài liệu này có chi tiết các bước giải cũng như phân tích các yêu cầu của đề bài đưa ra. Thí sinh được phép mang tài liệu và Đề thi có tính chất tham khảo
Trang 1BÀI TẬP THI GIỮA KỲ
MÔN: GIẢI THUẬT NÂNG CAO
Câu 1 tính độ phức tạp của các giải thuật sau và giải thích
a
1.int fun1(int n){
2 int i=s=0
3 while (s<n){
4 i++;
5 s+=I;
6 }
7 return s;
8.}
b
1.int fun2(int n){
2 if(n<=4){
3 return 4;
4 }else{
5 int x=0;
6 for(int i=1;i<n;i++){
7 if(i%2==0)
8 x+=fun2(i);
9 }
10 return x;
11 } 12.}
Câu a: phân tích
Gọi là độ phức tạp của giải thuật, ta có:
Ở vòng lặp thứ 1 ta có : s=1;
Ở vòng lặp thứ 2 ta có : s=1+2;
Ở vòng lặp thứ 3 ta có : s=1+2+3;
Ở vòng lặp thứ 4 ta có : s=1+2+3+4;
Ở vòng lặp thứ k ta có : ;
Vòng lặp chỉ dừng lại khi
Độ phức tạp của giải thuật:
2 phép gán i=s=0;
1 vòng lặp while với lần lặp
Trong vòng lặp while có 2 phép gán (i++ và s+=i)
Vậy ta có :
Câu b: phân tích
Gọi là độ phức tạp của giải thuật, ta có:
1 phép so sánh n<=4;
1 phép gán x=0;
Vòng for từ 1 cho đến n => lặp n-1 lần
Bên trong vòng lặp for có (n-1) lần so sánh (i%2==0) và gọi đệ quy lần
với i<n và i là số chẵn với Vậy với n>4
Ta có
Trang 215
15
Giả sử n chẵn ta có :
với n-k chẵn
Vòng lặp chỉ dừng khi
Câu 2 Cho danh sách L=[13,15,18,16,4,23,5,6,7,9,8,10] Hãy xây dựng cây đỏ đen nhị phân bằng cách thêm từng phần tử trong danh sách L (từ trái sang phải) Cho biết kết quả sau khi xóa các nút 16,18 và 10 của cây thu được
Xây dựng cay đỏ đen từ L=[13,15,18,16,4,23,5,6,7,9,8,10]
Thêm 13:
Thêm 15:
Thêm 18 :
13
Xoay
18 13
15
Trang 316
15
16
Xoay
15
16 4
15
16
15 5
16
18
15 13
16
18
5
Xoay 2 lần
Đổi màu
15 5
16
18
6
15 5
16
18
6
15
Xoay rồi đổi màu
15 5
16
18
Thêm 16:
Thêm 4:
Thêm 23:
Thêm 5
Thêm 6:
Thêm 7 :
Trang 415 7
16
18
9 6
4 Xoay
5
16
18
6 13 9
15 5
16
18
6 13
9
Xoay và đổi màu
15 7
16 18 5
23
13 9
6 4
15 7
16 18 5
23
13 9
6 4
9 Thêm 9:
Thêm 8:
Trang 515 7
16 18 5
23
9 8
6 4
13 Xoay và đổi màu
15 7
16 18 5
23
9 8
6 4
13 10
15 7
16 18 5
23
9 8
6
4
13 10
Đổi màu
15 7
18 5
23
9 8
6 4
13 10
Thêm 10:
Xóa nút 16: cây đỏ đen trên thu được là
Xóa nút 10: cây đỏ đen trên thu được là
Trang 615 7
18 5
23
9 8
6 4
13
15 7
23
5
9 8
6 4
13 Xóa nút 18: cây đỏ đen trên thu được là
Câu 3 Hãy viết giải thuật xác định liệu đồ thị vô hướng có phân đôi hay không? Cho biết độ phức tạp của giải thuật đề xuất.
Đồ thị phân đôi là đồ thị có có tập đỉnh chia đồ thị thành 2 phần có liên kết với nhau Bản than bên trong mỗi phần không có mối liên kết giữa các đỉnh
Ý tưởng : Dùng giải thuật BFS để tô màu cho các đỉnh đã đi qua rồi Ban đầu khởi tạo tất cả các đỉnh có color=white và tập các đỉnh partition đã phân đôi ở một bên rồi (mỗi đỉnh có 1 partition, khi đỉnh v và u là
Trang 72 đỉnh không có đường nối và đỉnh đang xét là đỉnh v thì partion[v]+=partion[u]) Giải thuật sẽ lấy từng đỉnh của G để so sánh, nếu có 1 đỉnh con nào đang xét (có màu gray) nhưng đã nằm trong partition rồi thì tức là đồ thị không phân đôi, ngược lại sau khi xét tất các đỉnh mà không vi phạm thì là đồ thị phân đôi
Boolean KiemTraDoThiPhanDoi (G){
For (đỉnh u trong đồ thị G){
color[u]= WHITE;
partition[u]=0;
}
Color[s]=GRAY;
partition[s]=0;
Q.EndQuence(s)
While (Q not emty){
Q.QueueFront(u) for( đỉnh con v của u){
if(partition[v] nằm trong partition[u]) then
return false;
else if(color[v]=WHITE) then
color[v]=GRAY;
partition[v]= partition[u]
Q.EndQuence(v)
} Q.DeQuence(u);
color[u]=BLACK;
}
Return true;
}
Đánh giá giải thuật:
Gọi là độ phức tạp của giải thuật
Ta có n là số đỉnh của đồ thị G
Hành động DeQuence, EndQuence, QueueFront có độ phức tạp là ứng với V đỉnh
Hành động kiểm tra màu và nằm trong partition có độ phức tạp là ứng với E cạnh
Trang 8Vậy