1. Trang chủ
  2. » Luận Văn - Báo Cáo

Cấu trúc dữ liệu và giải thuật nâng cao (tài liệu tham khảo)

11 303 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 11
Dung lượng 2,7 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

BÀI TẬP CHƯƠNG I 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

Trang 1

BÀI TẬP CHƯƠNG I 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à

f

(n,m)

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

Trang 2

Bài 5: Tìm dãy chung

BÀI TẬP CHƯƠNG II 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ơ đồ

Trang 3

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

Void chiadetri (x: baitoan): Giải pháp

{ if (x nhỏ và đơn giản)

rerun (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, x2…

for (i=1, i<=k, i++) yi chiadetri(x);

kết hợp các giải pháp của y đượ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ị

 Bài toán:

Tìm giá trị lớn nhất (max) và giá trị nhỏ nhất (min) trong 1 danh sách a [1, 2,…,n]

 Thuật toán:

Vét cạn

int Min (int a[], int n)

{

int min = a[0], i;

for(i = 0; i<n; i++)

{

if(a[i] < min) min = a[i];

}

return min;

}

// Tìm Max

int Max (int a[], int n)

{

int max = a[0], i;

for(i = 0; i<n; i++)

{

if(a[i] > max) max = a[i];

}

return max;

}

// Tìm max, min

Trang 4

int MaxMin (int a[], int n)

{

int max = a[1], int min= a[1], i;

for(i = 2; i<=n; i++)

{

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 (int a[], int x, int y )

{ int 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);

(max1, min1) = 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

 Nêu bài toán:

Cho dãy đã được sắp xếp tăng Hãy kiểm tra xem x có trong dãy không?

 Các bước:

- Bước 1: Divide (chia)

- Bước 2: slove (giải)

Kiểm tra x với y

x=y  tìm thấy

x<y  tìm bên left

x>y  tìm bên right

- Bước 3: Combine (Kết hợp)

Không làm gì cả

 Thuật toán:

Tìm kiếm x có trong dãy a [l - r]

y

Trang 5

- B1: Nếu l > r (let > right) thì không tìm thấy

- B2: Tính m= (l+r)/2

- B3:

+ Nếu x = a[m] thì tìm thấy

+ Nếu x< a[m] thì tìm bên a[l…m-1]

+ Nếu x> a[m] thì tìm bên a[m+1… r]

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 có n phần tử

C = A * B

* 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, j < n, j + +) c [ i, j] = 0;

for ( k = 0, k < n, k + +)

c [ 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

r s a b e f

=

t u c d g h

Từ đó, ta có: r = ae + bg

s = af + bh

t = ce + dg

u = cf + dh

* 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 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);

Trang 6

matrixpro ( d, g, n/2);

u = matrixpro ( c, f, n/2);

matrixpro ( d, h, n/2);

}

}

Độ phức tạp: C (n)= 8 C ( n/2) + n2 , C ( 1) -1 trong do n2 là số phép cộng

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

* Quick - sort: ( Sắp xếp nhanh).

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 trong bảng 2

B2: Trị: Mỗi bảng con được sắp xếp đệ qui.

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 tử:

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 bên trái và phần bên phải một cách đệ quy

Thuật toán:

Quick - sort: ( A, p, r)

{ If ( q < r) then

{ q = Partition ( A, p, r) ;

Quick Sort ( A, p, q) ;

Quick Sort ( A, q + 1, r) ;

}

}

* Merge Sort ( Sắp xếp xen kẽ)

- Ý tưởng:

Để xếp bảng T:

1 Chia T thành 2 bảng độ dài = nhau

2 Sắp xếp mỗi bảng con này

3 Từ 2 bảng con đã sắp, xếp xen kẽ lại để được bảng T sắp xếp ( Chú ý: bước 2 được thực hiện đệ qui)

- 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]

Trang 7

B4: Trộn 2 dãy đã sx a [1……k] và [( k + 1) ….n] thành dãy a [1……n] được sx

Hàm:

Merge – Sort ( A, p, r)

{

if p < r then {

q = [ ( p + r – 1)/2] ;

Merge – Sort ( A, p, q);

Merge – Sort ( A, p + 1, r);

Merge ( A, p, q, r);

}

}

BÀI TẬP CHƯƠNG III 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);

}

Trang 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, ktrahhao đã 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 (NLR) 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 (LNR) Inorder.

void InOrder (node * t){

node * p ;

p = t;

if (p != NULL) {

InOrder (p->left);

printf (“%d”, p->info);

Trang 9

InOrder (p->right); } }

Duyệt theo thứ tự sau (LRN) 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 IV 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

Danh sách liền kề đồ thị G1

Đỉnh đầu Đỉnh cuối

Trang 10

3 1, 2 ,4

Danh sách liền kề đồ thị G2

Đỉnh đầu Đỉnh cuối

Ma trận liền kề G1

Ma trận liền kề G2

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

Trang 11

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ố:

Thuật toán tìm đường dijktra

4

5

6

Ngày đăng: 25/02/2019, 22:34

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w