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

cấu trúc dữ liệu và giải thuật 2

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 (5.22 MB, 13 trang )

BÀI TẬP CHƯƠNG 1
Bài 1: Nêu các bước cài đặt một chương trình sử dụng quy hoạch động
Các bước cài đặt một chương trình sử dụng quy hoạch động:
- Giải tất cả các bài toán cơ sở, lưu các lời giải vào bảng phương án.
- Dùng công thức truy hồi, phối hợp lời giải của các bài toán nhỏ đã lưu trong bảng
phương án để tìm lời giải của bài toán lớn hơn và lưu chúng vào bảng phương án cho tới khi
bài toán ban đầu tìm được lời giải.
- Dựa vào bảng phương án, truy vết tìm nghiệm tối ưu.
Bài 2: Nêu các khái niệm và cách tiếp cận quy hoạch động. So sánh giữa đệ quy và
quy hoạch động. Minh họa so sánh đó khi tính số fibonacci thứ 6 hoạch số fibonacci thứ
7.
Bài 3: Xét bài toán tìm dãy con đơn điệu tăng dài nhất nêu bài toán đưa ra ví dụ
minh họa: dãy con đơn điệu có 1 phần từ, 2 phần tử phần tử sử dụng phương pháp quy
hoạch động tạo bằng tìm dãy con đơn điệu tăng dài nhất
Bài 4: Xét bài toán cái túi nêu bài toán cho ví dụ minh họa sử dụng phương pháp qui
hoạch động phân tích bài toán nêu các công thức truy hồi áp dụng phương pháp qui
hoạch động giữa bài toán bằng phương án bài toán m = 11
Cho bài toán cái túi với trọng lượng túi m = 11 có n = 5 mặt hàng là:
W[1] = 3

v[1] = 3

W[2] = 4

v[2] = 4

W[3] = 4

v[3] = 5

W[4] = 10



v[4] = 9

W[5] = 4

v[5] = 4

f
(n,m
)
i=0
1
2
3
4
5

j=0 1

2

3

4

5

6

7


8

9

10

11

0
0
0
0
0
0

0
0
0
0
0
0

0
3
3
3
3
3


0
3
4
5
5
5

0
3
4
5
5
5

0
3
4
5
5
5

0
3
7
8
8
8

0
3

7
8
9
9

0
3
7
8
9
9

0
3
7
8
9
9

0
3
7
12
12
12

0
0
0
0

0
0

Truy vết:
Chọn mặt hàng f = 12 -> mặt hàng i = 3 với v = 5. Chọn tiếp để v có 12 – 5 = 7. Được mặt
hàng i = 2 với v = 4. Chọn tiếp để v = 7 – 4 = 3. Được mặt hàng i = 1 với v = 3. Vậy chọn
mặt hàng i = 1, 2, 3 để cho GTLN là 12.
Bài 5: Xét bài toán dãy con chung dài nhất nêu bài toán cho VD minh họa:
a = {4, 7, 1, 2 ,4, 15, 15, 13}
1


b = {1, 4, 13, 15, 4, 13}
Dãy chung c = {1, 4, 15 ,13}
BÀI TẬP CHƯƠNG 2
Bài 1: Trình bày thuật toán chia để trị, nêu các bước, sơ đồ thuật toán, viết hàm thuật toán
chia để trị bằng đề qui.
Thuật toán chia để trị:
Chia để trị là phương pháp thiết kế thuật toán từ trên xuống dưới với ý tưởng
- Chia bài toán thành những bài toán nhỏ hơn có dạng giống ban đầu
- Các bài toán nhỏ hơn được chia thành những bài toán nhỏ hơn nữa.
Các bước
Bước 1: Chia bài toán thành các phần
Bước 2: Giải quyết các phần độc lập.
Bước 3: Kết hợp các lời giải của các phần Bước 2 thành lời giải của bài toán
Sơ đồ

Hàm thuật toán chia để trị đệ qui
2



void chiadetri (x: baitoan) :giải pháp
{
if (nhỏ và đơn giản)
return (giải x bằng thuật toán đơn giản)
else {
chia x thành các bài toán con x1 …. xk
for (i = 1; i<=k; i++) yi = chiadetri (xi);
Kết hợp các giải pháp : được giải pháp y của x;
return (y);
}
}
Bài 2: Trình bày ứng dụng thuật toán chia để trị tìm giá trị min max của mảng n số
nguyên nêu bài toán viết hàm thuật toán vét cạn, viết hàm thuật toán chia để trị.
Thuật toán đệ quy
int Min (int a[], int n){
int min = a[0], i;
for(i = 0; iif(a[i] < min) min = a[i];
}
return min;
}
int Max (int a[], int n){
int max = a[0], i;
for(i = 0; iif(a[i] > max) max = a[i];
}
return max;
}
Thuật toán vét cạn

Void maxmin (int a[], int n)
{
int max = a[1], int min = a[1], i;
for( i = 2; i<= n; i +1)
{
3


if (a[i] > max ) max = a[i];
if (a[i] < min) min = a[i];
}
return max, min;
}
Thuật toán chia để trị
void maxmin (in a[], int x, int y)
{
in max1, max2, min1, min2;
if ( (y -x) <= 1 ) return ( max(a[x], a[y]), min(a[x], a[y]))
else{
(max1 , min1) = maxmin(a, x, (x+y)/2)
(max2, min2) = maxmin(a, (x+y)/2 + 1, y)
return (max (max1, max2, min(min1, min2)
}
}

Bài 3: Trình bày thuật toán chia để trị với bài toán tìm kiếm nhị phân nêu bài toán,
nêu các bước, viết thuật toán

4



Bài 4: Trình bày thuật toán nhân 2 ma trận nêu bài toán, viết hàm theo thuật toán
vét cạn, nêu bài toán và viết hàm theo thuật toán chia để trị.
Bài toán nhân 2 ma trận vuông co n phần tử
C =A. B
5


Thuật toán vét cạn
Void matrixproduct(int a[], int b[], int n)
{
int i, j , k;
for (i = 0; i< n; i++)
{
for (j = 0; jfor (k = 0; kC[i, j] = C[i, j] + A[i, k] * b[k, j];
}
return c;
}
Thuật toán chia để trị:
Giả sử n = 2.
Chia các ma trận A, B, C thành các ma trận có kích thước n/2. Khi đó C = A.B tương ứng
Từ đó ta có:
r = a.e + b.g
s = a.f + b.h
t = c.e + d.g
u = c.f + d.h
Hàm chia để trị:
void matrixpro(int A[], int B[], int n)

{
if(n==1) return (A, B);
else
{
Chia A, B thành 8 ma trận có kích thước n/2: a, b, c, d, e, f, g, h;
r = matrixpro(a, e, n/2), matrixpro(b, g, n/2);
s = matrixpro(a, f, n/2), matrixpro(b, h, n/2);
t = matrixpro(c, e, n/2), matrixpro(d, h, n/2) ;
}
}
độ phức tạp C(n) = 8C(n/2) + n2, C(1) = 1 trong đó, n2 là số phép cộng.
6


Bài 5: Trình bày thuật toán chia để trị với bài toán Quick sort, Merse sort nêu bài
toán nêu ý tưởng.
Bài toán:
B1: Chia: bảng T (p … r) được chia thành 2 phần T (p … q) và T(q+1 … r) sao cho mọi
phần tử trong bảng 1 nhỏ hơn mọi phần tử bảng 2.
B2: Trị: Mỗi bảng con được sắp xếp đệ quy.
B3: Hợp: Vì mỗi bảng đã đúng vị trí. Kết thúc.
Ý tưởng:
B1: Chọn phần tử trung tâm p.
B2: Chia làm 2 phần
Phần bên trái gồm nhũng phần tử nhỏ hơn p
Phần bên phải gồm những phần tử lớn hơn hay bằng p
B3: Sắp xếp phần tử bên trái và phần tử bên phải một cách đệ quy.
Thuật toán
Quicksort(A, p, r){
if (q < r) then

{
q = partition (A, p r) ;
Quicksort ( A, p, q);
Quicksort (A, q + 1, r);
}
}
MergeSort (Sắp xếp xen kẻ)
Ý tưởng:
Để sắp xếp bảng T
1. Chia T thành 2 bảng độ dài bằng nhau
2. Sắp xếp mỗi bảng con này
3. Từ 2 bảng con đã sắp xếp, sắp xếp xen kẻ lại để bảng T sắp xếp (bước 2 được thực
hiện đệ quy)
Thuật toán:
B1: tính k = n div 2
B2: sắp xếp a[1 … k]
B3: sắp xếp a[k+1 … n]
B4: Trộn 2 dãy đã sắp xếp a[1 … k] và a[k+1 … n] thành dãy a[1 … k] được sắp xếp.
Hàm:
7


MergeSort (A, p, r){
if (p< r) then {
q = (p + r -1)/2;
MergeSort (A, p, q);
MergeSort (A, q + 1, r);
Merge(A, p, q, r);
}
}

BÀI TẬP CHƯƠNG 3
Bài 1: Cây nhị phân khái niệm cho ví dụ minh họa cây có 5 phần tử; cây nhị phân, cây nhị
phân dạng đặc biệt (3 dạng), cây nhị phân dùng để biểu diễn một biểu thức toán học.
Bài 2: trình bày biểu diễn cây nhị phân bằng lưu trữ danh sách cấu trúc, khai báo tổng
quát mô tả, hình ảnh, cho ví dụ minh họa tạo cây nhị phân tìm kiếm từ dãy đã cho là các số
(hoặc chữ cái) và cho biết kết quả của các phép duyệt in ra các giá trị của các node
Bài 3: Nêu 3 phép duyệt cây nhị phân và hàm duyệt cây nhị phân tính tổng info các phần
tử, tìm và in info gồm các số chẵn, tìm và in info là các số nguyên tố (hoặc là số hoàn hảo)
với các hàm ktrangto, ktrahhao đã có …
Bài 4: Trình bày ứng dụng của cây nhị phân cây nhị phân biểu diễn biểu thức tạo cây nhị
phân tìm kiếm
TẬP DUYỆT GIỮA KỲ
Bài 1: Nêu các bước cài đặt một chương trình sử dụng qui hoạch động. Áp dụng hãy phân
tích đưa ra các cách viết hàm tính tổng.
S(n) = 12 + 32 + 52 + …. + (2n-1)2
Các bước cài đặt một chương trình sử dụng quy hoạch động:
Giải tất cả các bài toán cơ sở, lưu các lời giải vào bảng phương án.
Dùng công thức truy hồi, phối hợp lời giải của các bài toán nhỏ đã lưu trong bảng phương
án để tìm lời giải của bài toán lớn hơn và lưu chúng vào bảng phương án cho tới khi bài toán
ban đầu tìm được lời giải.
Dựa vào bảng phương án, truy vết tìm nghiệm tối ưu.
Cách viết hàm:
Dùng hàm for
int TinhTong (int n){
int tong = 0, i;
for (i = 1; i<=n; i++){
tong = tong + (2*i + 1) *(2*i + 1);
}
8



return tong;
}
2. Hàm đệ qui
int TinhTong(int n) {
if (n = = 1) return 1;
return (2n-1) * (2n-1) + TinhTong (n-1);
}
Bài 2: Xét bài toán dãy con chung dài nhất: nêu bài toán tổng quát; minh họa: tìm
dãy con c chung dài nhất, nếu
A = {4, 2, 5, 1, 4, 5, 5, 4, 6} và
B = {2, 1, 5 ,4, 5 ,4 ,1}
Tự cho 1 ví dụ minh họa khác; thiết kế thuật toán thông thường sử dụng phương pháp qui
hoạch động phân tích bài toán, nêu các công thức truy hồi.
Bài 3: Nêu 3 phép duyệt cây nhị phân và hàm duyệt cây nhị phân tính tổng info các
phần tử, tìm và in info gồm các số chẵn, tìm và in info là các số nguyên tố (hoặc là số
hoàn hảo) với các hàm ktrangto (kiểm tra nguyên tố), ktrahhao (kiểm tra hoàn hảo) đã
có …
Duyệt cây nhị phân.
Duyệt theo thứ tự trước (N L R) Preorder.
Duyệt theo thứ tự giữa (L N R) Inorder.
Duyệt theo thứ tự sau (L R N) Postorder.
Duyệt theo thứ tự trước (N L R) Preorder.
void PreOrder (node * t){
node * p ;
p = t;
if (p != NULL) {
printf (“%d”, p->info);
PreOrder (p->left);
PreOrder (p->right);

}
}
Duyệt theo thứ tự giữa (L N R) Inorder.
9


void InOrder (node * t){
node * p ;
p = t;
if (p != NULL) {
InOrder (p->left);
printf (“%d”, p->info);
InOrder (p->right);
}
}
Duyệt theo thứ tự sau (L R N) Postorder.
void PostOrder (node * t){
node * p ;
p = t;
if (p != NULL) {
PostOrder (p->left);
PostOrder (p->right);
printf (“%d”, p->info);
}
}
Bài 4: Trình bày ứng dụng của cây nhị phân: Cây nhị phân biểu diễn biểu thức, tạo cây
nhị phâm tìm kiếm.
BÀI TẬP CHƯƠNG 4
Bài 1: Cho đồ thị G1, G2 Hãy biểu diễn đồ thị G1, G2 bằng: danh sách liền kề, ma trận
liền kề, danh sách cạnh lưu vào bộ nhớ theo 2 dạng

1

10


Danh sách liền kề đồ thị G1
Đỉnh đầu
1
2
3
4
5

Đỉnh cuối
2, 3, 5
1, 3
1, 2 ,4
3, 5
1, 4

Danh sách liền kề đồ thị G2
Đỉnh đầu
1
2
3
4
5

Đỉnh cuối
3

4
5
1
2

Ma trận liền kề G1
1
2
3
4
5

1
0
1
1
0
1

2
1
0
1
0
0

3
1
1
0

1
0

Ma trận liền kề G2
11

4
0
0
1
0
1

5
1
0
0
1
0


1
0
0
0
1
0

1
2

3
4
5

2
0
0
0
0
2

3
1
0
0
0
0

4
0
1
0
0
0

5
0
0
1
0

0

Lưu danh sách cạnh
G1:
Mảng
1,2

1,3

1,5

2,1

2,3

3,1

3,2

3,4

4,3

4,5

5,
1

5,
4


Móc nối
Bài 2: Cho đồ thị G. Hãy biểu diễn đồ thị G bằng: ma trận liền kề, danh sách cạnh
lưu vào bộ nhớ theo 2 dạng danh sách liền kề ma trận trọng số.

Ma trận trọng số:
0
0
1
2
3


10
20
1

1

2

10


4

20

5
5

12

3
1
4




Ví dụ: Thuật toán tìm đường dijktra

Tập T
0
1
2
3
4
5
6

a
ba
cba
dcba
edcba
zedcba

a
(0, -)
(0, -)*

-

b
(∞, -)
(1,a)
(1,a)*
-

c
(∞, -)
(2,a)
(2,a)
(2,a)*
-

13

d
(∞, -)
(∞, -)
(6,b)
(6,b)
(6,b)*
-

e
(∞, -)
(∞, -)
(∞, -)
(8,d)

(8,d)
(8,d)*
-

z
(∞, -)
(∞, -)
(∞, -)
(∞, -)
(11,e)
(11,e)
(11,e)*



×