Tải bản đầy đủ (.docx) (8 trang)

Thi giữa kỳ Giải Thuật Nâng Cao Bách Khoa

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (179.7 KB, 8 trang )

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



×