Tải bản đầy đủ (.doc) (10 trang)

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

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 (127.04 KB, 10 trang )

đạ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
BI TP CHNG: QUY
Bi toỏn: c s chung ln nht ca hai s c nh ngha nh sau:
- 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)
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()
{
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:
( ) ( )
1
1
1
.
n
n
i
T
T i T n i

=






=


1
1
n
n
=
>
Ta sẽ có dãy: 1 1 2 5 14 42 132 429 1430 4862 …
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
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ụ t
i
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ụ t
i
được lưu
trong mảng t: t = (t
1
, t
2
,…,t
n
)
Gọi U là tập các hoán vị trên tập {1,…,n}

Với K = (k
1
, k
2
, …,k
n
)

U, ta có
D(K) =
∑∑
= =
n
j
j
i
k
i
t
1 1
;
i
k
t
là thời gian phục vụ khách hàng k
i
.
Tìm b

U sao cho D(b) = min{D(k): k


U}
Ví dụ
Với n = 3, t = (5, 10, 3)
i 1 2 3 Số hiệu khách hàng
t[i] 5 10 3 Thời gian phục vụ
b t
k1
t
k1
+ t
k2
t
k1
+ t
k2
+ t
k3
D(b)
(1,2,3) 5 5+10=15 5+10+3=18 38
(1,3,2) 5 5+3=8 5+3+10=18 31
(2,1,3) 10 10+5=15 10+5+3=18 43
(2,3,1) 10 10+3=13 10+3+5=18 41
(3,1,2) 3 3+5=8 3+5+10=18 29
(3,2,1) 3 3+10=13 3+10+5=18 34
Ta có: D(b) = D((3,1,2)) = Min{D(k): k

U}
Ta có nhận xét rằng D(b) đạt min nếu T
j

=

=
j
i
k
i
t
1
;
nj 1
∈∀
đạt min. Và T
j
đạt Min nếu trong mỗi khách hàng i, với thời gian phục vụ t
ki
, đượ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 T

j
đượ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ụ t
i
được chọn trong mỗi lần phục vụ chính là min của dãy (t
1
, t
2
,…,t
n
), đó 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.
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++)
{
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(n
2
).

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ũ.
Độ phức tạp tính toán của thuật toán tham lam là O(n
2
).
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.

×