BÀ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 (s4.
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;i7.
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ó
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:
13
13
15
Thêm 18 :
13
15
Xoay
13
15
18
18
15
15
Thêm 16:
Xoay
13
13
18
18
16
16
Thêm 4:
15
13
18
4
16
Thêm 23:
15
13
18
4
16
Thêm 5
23
15
15
13
18
4
Xoay 2 lần
18
4
23
16
5
13
15
Thêm 6:
15
5
5
18
4
13
23
16
16
Đổi màu
5
23
18
4
13
23
16
15
6
6
5
Thêm 7 :
4
18
13
6
16
15
23
Xoay rồi đổi màu
5
4
7
18
7
6
16
13
23
Thêm 9:
15
5
4
15
đổi màu
5
18
7
23
16
6
18
4
7
6
13
16
13
9
9
15
Xoay
7
5
Xoay và đổi màu
4
6
18
13
16
23
7
9
5
4
15
6
13
18
7
9
5
Thêm 8:
4
16
15
6
13
9
9
18
16
23
23
23
7
5
Xoay và đổi màu
4
15
6
8
Thêm 10:
7
13
7
15
6
23
16
Đổi màu
5
4
18
9
5
18
9
4
Xóa nút 16: cây
8 đỏ đen trên
13 thu được
16 là
15
6
23
7
8
10
5
4
6
13
10
Xóa nút 10: cây đỏ đen trên thu được là
18
9
8
13
10
15
18
9
23
16
23
7
5
4
15
6
18
9
8
23
13
Xóa nút 18: cây đỏ đen trên thu được là
7
5
4
15
6
23
9
8
13
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à
2 đỉ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
Vậy