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

Tiểu luận môn giải thuật nâng cao BÀI TẬP CHƯƠNG ĐỆ QUY

10 678 4

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 94 KB

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

Nội dung

Xây dựng thuật toán tham lam lập lịch phục vụ các khách hàng sao cho tổng thời gian chờ và được phục vụ của các khách hàng là nhỏ nhất.. So sánh độ phức tạp của thuật toán tham lam và th

Trang 1

đại học đà nẵng trờng đại học bách khoa -   

-BàI TậP GIảI THUậT NÂNG CAO

Đồng Hới, 01/2013

BÀI TẬP CHƯƠNG: ĐỆ QUY

Bài toỏn: Ước số chung lớn nhất của hai số được định nghĩa như sau:

Trang 2

- Nếu x = y thì UCLC(x, y) = x

- Nếu x > y thì UCLC(x, y) = UCLC(x - y, y)

- Nếu x < y thì UCLC(x, y) = UCLC(x, y - x)

Xây dựng thuật toán đệ quy:

Xây dựng hàm tìm ước chung lớn nhất: UCLN(x, y) Function UCLN(x, y)

Begin

if (x = y) then UCLN = x Else

if (x > y) then

UCLN = UCLN(x - y, y) else

UCLN = UCLN(x, y - x); End;

Chương trình mô phỏng thuật toán:

#include <stdio.h>

long x, y;

long ucln(long x, long y)

{

if (x == y) return x;

if (x > y) return ucln(x-y, y);

else return ucln(x, y-x);

}

int main()

{

scanf("%ld %ld", &x, &y);

printf("%ld\n",gcd(x, y));

return 0;

}

Xây dựng thuật toán lặp:

Xây dựng hàm tìm ước chung lớn nhất: UCLN(x, y)

Trang 3

Function UCLN(x, y)

Begin

While (x <> y) do Begin

if (x > y) then

x := x - y else

y := y - x; End;

UCLN := x;

End;

Chương trình mô phỏng thuật toán:

#include <stdio.h>

long x, y;

long ucln(long x, long y)

{

while (x != y) {

if (x > y)

{

x -= y;

} else

{

y -= x;

} }

return x;

}

int main()

{

Trang 4

scanf("%ld %ld", &x, &y);

printf("%ld\n", ucln(x, y));

return 0;

}

BÀI TẬP CHƯƠNG: QUY HOẠCH ĐỘNG Bài toán: Số Catalan được định nghĩa như sau:

Trang 5

   

1 1

1

n n

i

T

T i T n i

1 1

n n

Thuật toán Quy hoạch động:

Gọi T là mảng chứa các số Catalan từ 1 đến N:

Bước 1: T[1] = 1; T[i] = 0, i =2  n

Bước 2 (Lặp) :

i = 2  n

j = 1  (i - 1)

T[i] = T[i] + T[j] * T[i - j]

Bước 3: Kết quả là T[n]

Chương trình mô phỏng thuật toán:

#include <stdio.h>

#define maxn 15

long T[maxn+1];

long n;

int main()

{

long i, j;

scanf("%ld", &n);

T[1] = 1;

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

{

for (j=1; j<i; j++)

T[i] += T[j] * T[i-j];

}

printf("%ld\n", T[n]);

return 0;

}

BÀI TẬP PHẦN THUẬT TOÁN VÉT CẠN

Trang 6

Một người cắt tóc phục vụ n khách hàng Mỗi khách hàng i (i=1…n) cần một thời gian phục vụ ti khác nhau Mỗi thời điểm người cắt tóc chỉ có thể phục vụ một khách hàng

a Đề xuất thuật toán vét cạn

b Xây dựng thuật toán tham lam lập lịch phục vụ các khách hàng sao cho tổng thời gian chờ và được phục vụ của các khách hàng là nhỏ nhất

c So sánh độ phức tạp của thuật toán tham lam và thật toán vét cạn

Bài làm

Có n khách hàng, mỗi khách hàng i cần một thời gian phục vụ ti được lưu trong mảng t: t = (t1, t2,…,tn)

Gọi U là tập các hoán vị trên tập {1,…,n}

Với K = (k1, k2, …,kn)  U, ta có

D(K) =  

 

n j

j i

k i t

1 1 ; t k i là thời gian phục vụ khách hàng ki Tìm b  U sao cho D(b) = min{D(k): k  U}

Ví dụ

Với n = 3, t = (5, 10, 3)

b tk1 tk1 + tk2 tk1 + tk2 + tk3 D(b)

Ta có: D(b) = D((3,1,2)) = Min{D(k): k  U}

Trang 7

Ta có nhận xét rằng D(b) đạt min nếu Tj =

j i

k i

t

1 ; j 1 n đạt min Và Tj

đạt Min nếu trong mỗi khách hàng i, với thời gian phục vụ tki, được chọn để cắt tóc

là thời gian phục vụ nhỏ nhất và cũng thời gian chờ nhỏ nhất của những khách hàng còn lại

a Đề xuất thuật toán vét cạn.

Ta thấy, với bài toán như ví dụ trên thì chính là tìm một hoán vị của tập n khách hàng sao cho tổng thời gian chờ và được phục vụ của các khách hàng là nhỏ nhất Chúng ta duyệt tất cả các hoán vị của n khách hàng, so sánh tổng thời gian chờ và thời gian phục vụ của các hoán vị, trường hợp nào tổng thời gian chờ và thời gian phục vụ nhỏ nhất thì chọn

Nhưng khi đó chi phí thời gian là quá lớn, độ phức tạp quá lớn Độ phức tạp trong trường hợp này là hàm mũ

b Xây dựng thuật toán tham lam lập lịch phục vụ các khách hàng sao cho tổng thời gian chờ và được phục vụ của các khách hàng là nhỏ nhất.

Định hướng cho thuật toán tham lam trong trường hợp này là các Tj được tính theo trật tự tăng dần của thời gian phục vụ t, khách hàng có thời gian phục vụ ti

được chọn trong mỗi lần phục vụ chính là min của dãy (t1, t2,…,tn), đó cũng chính

là thời gian chờ nhỏ nhất của các khách hàng còn lại Khi đó lời giải tìm được là lời giải tối ưu

Trang 8

Thuật toán:

Input: (t1, t2, … , tn)

Output: Hoán vị b = (k1, k2, …, kn): Min= D(b) = Min{D(k): k  U}; cattoc_thamlam(t,b,n)

- Gán b[i] = i, i ; min = 0; T = 0;

- for (i=1 → n)

+ Chọn j = arcmin(t,n,i); // t[j] = min{t[i],…,t[n]}

+ b[i] ↔ b[j];

+ t[i] ↔ t[j];

+ Cập nhật giá trị min

T = T + t[i];

min = min + T;

- return min;

Cài đặt thuật toán:

void doicho(int x, int y)

{

int tam;

tam = x;

x = y;

y = tam;

}

int cattoc_thamlam(int t[max],int b[max],int n)

{

Int i, T = 0, min = 0;

Int j;

For(i=1;i<n;i++)

b[i] = i;

For(i=1;i<n;i++)

Trang 9

j = arcmin(t,n,i);

doicho(b[i],b[j]);

doicho(t[i],t[j]);

T+=a[i];

min+=T;

} Return min;

}

Độ phức tạp tính toán

Thuật toán chọn min được sử dụng chính là chọn trực tiếp Ta dễ thấy độ phức tạp tính toán của thuật toán trong trường hợp này là O(n2)

c So sánh độ phức tạp của thuật toán tham lam và thật toán vét cạn

Độ phức tạp tính toán của thuật toán vét cạn là hàm mũ

Trang 10

Độ phức tạp tính toán của thuật toán tham lam là O(n2).

Ta thấy, độ phức tạp của thuật toán vét cạn lớn hơn rất nhiều so với độ phức tạp của thuật toán tham lam

Ngày đăng: 23/03/2015, 11:15

TỪ KHÓA LIÊN QUAN

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

w