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 3Function 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 4scanf("%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 6Mộ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 7Ta 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 8Thuậ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 9j = 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