Tải bản đầy đủ (.ppt) (22 trang)

BÀI TOÁN XÂU TRONG CỰC ĐẠI

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 (362.51 KB, 22 trang )

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

×