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


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:

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


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]


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


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);

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)

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


Nhờ tải bản gốc
Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status