NỘI DUNG TRÌNH BÀY
Phát biểu bài toán
Giới thiệu phương pháp thực hiện
Phân tích bài toán
Giải pháp đệ quy
Áp dụng vào bước tạo bảng
Tạo bảng
Tổng hợp kết quả
Minh họa bằng ví dụ
Phân tích độ phức tạp thời gian, không gian
PHÁT BIỂU BÀI TOÁN
Xâu con cực đại:
S là xâu con của T nếu S nhận được bằng cách
xoá đi một số ký tự nào đó trong T.
Ví dụ: ‘EAC’ là xâu con của ‘CEAEEC’
Xâu con chung:
Nếu xóa một số ký tự của hai xâu thì hai xâu con
còn lại của chúng bằng nhau
Ví dụ: S1=‘ABCDAE’ và S2=‘XYACADK’ có xâu
‘ACD’ là xâu con chung có độ dài cực đại.
Bài toán đặt ra:
Cho 2 xâu S
1
, S
2
. Tìm một xâu S là xâu con chung
của S
1
và S
2
có độ dài cực đại.
PHƯƠNG PHÁP THỰC HIỆN
Phân tích bài toán (biểu diễn bài toán dưới dạng một bài toán nhiều
mức)
Xây dựng giải pháp đệ quy (lập công thức truy hồi)
Lập bảng (sử dụng các mảng để tính toán các giá trị theo kiểu dưới-
lên)
Tổng hợp kết quả (kiến tạo một lời giải cho bài toán từ các thông tin
đã tính toán)
PHÂN TÍCH BÀI TOÁN
Giả sử ta có:
Xâu A có độ dài xâu là m
Xâu B có độ dài xâu là n,
L(k, h) là bài toán xâu con chung cực đại, với
k ∈ N*: Độ dài dãy a
1
a
2
…a
k
( k ≤ m )
h ∈ N*: Độ dài dãy b
1
b
2
…b
h
(h ≤ n)
Bài toán ban đầu là L(m, n)
Các giá trị cần tìm:
LCS [k,h]: độ dài cực đại của xâu con chung của
L(k, h)
s: xâu con chung của bài toán L(k, h)
GIẢI PHÁP ĐỆ QUY
Trường hợp đơn giản nhất
Nếu (i=0) hoặc (j=0) thì L(i,j)=0
Nếu (i>0) and (j>0) and(a
i
<> b
j
)
LCS(i,j) = Max(LCS(i-1,j), LCS(i,j-1))
Nếu (i>0) and (j>0) and (a
i
=b
j
)
LCS(i,j)= 1 + LCS(i-1,j-1)
Độ phức tạp cao và dễ tràn stack do
phải tính lại nhiều lần kết quả các bài
toán con
ÁP DỤNG VÀO TẠO BẢNG
Nếu a
i
=b
j
, lúc này LCS S của A và B có
thể tính bằng LCS S’ của A
i-1
và B
j-1
,
đồng thời nối a
i
vào cuối, tức S = [S’,
a
i
]
Nếu a
i
<>b
j
, lúc này cho S
1
là LCS của A
i-1
và B
j
, và S
2
là LCS của A
i
và B
j-1
. S sẽ là giá trị lớn hơn
trong 2 giá trị S
1
và S
2
.
TẠO BẢNG
Cho L[i, j] = LCS[i, j], lúc này
L[i, j] sẽ phụ thuộc vào 3 giá trị sau
Phần tử L[i-1, j]
Phần tử L[i, j-1]
Phần tử L[i-1, j-1]
TẠO BẢNG – Giả mã
LCS-Length(A; B; m; n)
1: L[i; 0] ← 0 for each i = 0, …, m;
2: L[0; j] ← 0 for each j = 0 , …, n;
3: for i ← 1 to m do
4: for j ← 1 to n do
5: if a
i
= b
j
then
6: L[i; j] ← 1 + L[i - 1; j – 1]
7: else
8: max (L[i - 1; j] , L[i; j - 1]);
9: end if
10: end for
11: end for
Lúc này, L[m, n] (hay
L[length(A), length(B)] sẽ
cho kết quả là độ dài của
xâu con chung lớn nhất
TỔNG HỢP KẾT QUẢ
Để tìm xâu kết quả S
Đi ngược từ ô l[m. n] hướng về l0, 0]
Nếu a
i
= b
j
thì đặt a
i
hoặc b
j
vào bên trái dãy
S (ở đầu xâu)
Nếu a
i
<> b
j
thì
lùi về L[i - 1, j] trong trường hợp L[i - 1, j] > L[i, j – 1]
ngược lại, lùi về L[i, j – 1] trong trường hợp L[i - 1, j]
≤ L[i, j – 1]
Ví dụ
File đầu vào: gồm 2 xâu:
S1: CARROT
S2: PARTY
File kết quả
Xâu con chung lớn nhất
Bảng p (được tạo ra từ bước lập bảng)
CHƯƠNG TRÌNH THỰC HIỆN
Các thủ tục chính
Procedure Lapbang; <Tương ứng với
bước Lập bảng>
Procedure XauConLonNhat; <Tương ứng
với bước Tổng hợp kết quả>
Một số thủ tục/hàm khác:
Function Max(a, b):byte;
Procedure DocDuLieu;
Procedure InKetQua;
KHAI BÁO
Const
FILE_INP = 'XauChung.INP';
FILE_OUT ='XauChung.OUT';
MAX_N = 50;
Type
Mang = Array[0 MAX_N,0 MAX _N] of Byte;
Var
L : Mang;
s1, s2, s3 : String;
m, n, i, j : Byte;
f: text;
THỦ TỤC LapBang
Procedure LapBang;
Var
i,j: Byte;
Begin
FillChar(L, SizeOf(L), 0);
For i:=1 to m do
For j:=1 to n do
if s1[i] = s2[j] then
L[i,j]:= 1 + L[i-1,j-1]
else
L[i,j]:= max (L[i,j-1] , L[i-1,j]);
End;
THỦ TỤC X auConLonNhat
Procedure XauConLonNhat;
Var
i,j :byte;
Begin
s3[0]:=chr(L[m, n]);
i:=m;
j:=n;
Repeat
if s1[i]=s2[j] then
Begin
Insert(s1[i], s3, 1);
dec(i);
dec(j);
End
else
Begin
if L[i, j]= L[i-1, j] then dec(i)
else dec(j);
End;
Until (i=0) or (j=0);
End;
0
P
1
A
2
R
3
T
4
Y
5
0
0 0 0 0 0 0
C 1
0 0 0 0 0 0
A 2
0 0 0 0 0 0
R 3
0 0 0 0 0 0
R 4
0 0 0 0 0 0
O 5
0 0 0 0 0 0
T 6
0 0 0 0 0 0
S1(i)
S2(j)
Max (L[i, j-1,
L[i -1, j])
0 0 0 0 0
0
1 + L[i-1, j-1]
If s1[i] <> s2[j]
If s1[i] = s2[j]
1 1 1 1
0 1 2 2 2
0 1 2 2 2
0 1 2 2 2
0 1 2 3 3
If L[i, j] = L[i-1, j]
then dec(i)
If L[i, j] <> L[i-1, j] then dec(j)
3
S3 = “”S3 = 3
2
3
S3 = 3T
1
D ng vì i = 0ừ
S3 = 3RTS3 = 3ART
If s1[i] = s2[j] then dec(i); dec(j)
XÂU CON
LỚN NHẤT
HÀM Max
Function max(Var a, b: byte):byte;
Begin
if a>b then max:=a
else
max:=b;
End;
THỦ TỤC DocDuLieu
Procedure DocDuLieu;
Var
f : Text;
Begin
Assign(f, FILE_INP); Reset(f);
Readln(f, s1);
Readln(f, s2);
m:=Length(s1);
n:=Length(s2);
Close(f);
End;
THỦ TỤC InKetQua
Procedure Inketqua;
Begin
Assign(f, FILE_OUT); Rewrite(f);
Writeln(f, 's1 = ',s1);
Writeln(f, 's2 = ',s2);
Writeln(f, 'Xau chung dai nhat:', s3);
Writeln(f);
Writeln(f,'Bang p:');
for j:=1 to n do Write(f, s2[j]:7); Writeln(f);
for i:=1 to m do
begin
Write(f, s1[i]:3);
write(f, L[i, 1]:4);
for j:=2 to n do
Write(f, L[i, j]:7);
writeln(f);
end;
Close(f)
End;
CHƯƠNG TRÌNH CHÍNH
Begin
DocDuLieu;
LapBang;
XauConLonNhat;
InKetQua;
End.
PHÂN TÍCH ĐỘ PHỨC TẠP
Điền vào bảng L[0 m, 0 n] mất O(m.n) thời gian, đây cũng là thời
gian chạy của thủ tục Tạo bảng
Không gian được yêu cầu là O(m.n)
XIN CẢM ƠN !!!