Định nghĩa xâu.
Kí hiệu a,b,c,...là các kí tự trong bảng chữ cái . Một xâu được xác định như một dãy liên tiếp của các kí tự. Với một xâu s ta có một số quy ước về ký hiệu như sau:
- s là độ dài xâu s. Nếu s 0 thì s là xâu rỗng và được ký hiệu là .
- si là ký tự thứ i của xâu si1,...,s. Định nghĩa xâu con.
Cho s s1s2...sn,si là một xâu có độ dài n trên bảng chữ cái . Một xâu
sisi si si X k, ... 2
1 là một xâu con của s, nếu j,1 jk: 1ij n, và ij ij1
Định nghĩa xâu con chung dài nhất
Cho S s1,s2,...,sd là một tập các xâu trên bảng chữ cái với độ dài
d
n n
n1, 2,..., tương ứng. Xâu con chung dài nhất của tập S là một xâu X thỏa mãn:
(i) X là một xâu con của si, i1,2,...,d.
(ii) X có độ dài lớn nhất thỏa mãn (i). Ví dụ:
Cho 3 xâu s1"ATGCCAAT", s2 "AGGTGCT", s3"GCCTAC". Khi đó xâu con chung dài nhất của cả ba xâu là X "GCT".
Trong tin sinh học, tùy thuộc vào kiểu của dữ liệu, kích thước của bảng chữ cái
thì độ dài của xâu ký tự rất đa dạng. Bảng 1 dưới đây thống kê về độ dài xâu ký tự của một số dữ liệu tin sinh học [12].
Bảng 2.1 Độ dài xâu ký tự của một số dữ liệu tin sinh học
Dữ liệu sinh học Bảng chữ cái Độ dài xâu ký tự
Protein A,C,...,W, 20 ~ 102 – 104
ARN A,C,G,U ~ 102 – 104
Gen gen1,gen2,...,genk ~ 102 – 104
ADN A,C,G,T ~ 103 – 1012
Bảng 2.1 cho thấy độ dài của các xâu trong dữ liệu tin sinh học là rất lớn. Do đó việc tìm ra xâu con chung dài nhất giữa các xâu địi hỏi tính tốn rất phức tạp và tốn rất nhiều thời gian.
2.3. Thuật tốn quy hoạch động giải bài tốn tìm xâu con chung dài nhất. Giả sử ta có hai dãy X x1,x2,...,xm và Y y1,y2,...,yn.
Ta có Z z1,z2,...,zk là một xâu con chung bất kỳ của X và Y. Tiền tố thứ
icủa xâu X x1,x2,...,xm là một dãy con của X bao gồm từ phần tử ban đầu đến phần tử tứ thứ i của X nghĩa là Xi x1,x2,...,xi, i0,1,2,...,m. Khi đó ý tưởng giải bài tốn là tính xâu con chung dài nhất cho mọi khả năng các cặp của tiền tố hai dãy đã cho. Ký hiệu c , i j là độ dài của dãy con chung dài nhất Xi và Yj. Khi đó đại lượng cm,n là xâu con chung dài nhất của toàn bộ hai chuỗi đã cho. Các bước tính
m n
c , như sau:
Bước cơ sở: c i,0 c0,j0, Nếu một trong những xâu đã cho là rỗng thì dãy con chung dài nhất cũng rỗng và có độ dài bằng 0.
Ký tự cuối cùng của tiền tố bằng nhau: Giả sử Xi Yj. Khi đó phần tử cuối cùng của xâu con chung dài nhất zk xi yj và Zk1 là một xâu con chung dài nhất của xâu Xm1 và Yn1. Thật vậy, nếu zk xi thì ta ghép thêm xi yj vào Z để có
được dãy con chung của X và Y có chiều dài k1, mâu thuẫn với giả thiết cho rằng Z là dãy con chung dài nhất của X và Y. Như vậy ta phải có zk xi yj. Vậy thì Zk1 là xâu con chung dài nhất của Xm1 và Yn1 có độ dài k1.
Như vậy, nếu xi yj thì c i, j ci1,j11.
Ký tự cuối cùng của tiền tố không bằng nhau: Giả sử xi yj. Khi đó phần tử
i
k x
z ( hoặc zk yj ) nghĩa là Z là xâu con chung dài nhất của Xi1 và Yj ( hoặc
Z là xâu con chung dài nhất của Xi và Yj1). Thật vậy, nếu zk xi, thì Z là xâu con chung của Xi1 và Yj. Nếu có một xâu con chung của Xi và Yj, điều này mâu thuẫn với giả thiết Z là xâu con chung dài nhất của Xi và Yj.
Như vậy, xi và yj không đồng thời nằm trong xâu con chung dài nhất, nghĩa là hoặc xi nằm trong xâu con chung dài nhất, hoặc yj nằm trong xâu con chung dài nhất (có khả năng cả hai đều không nằm trong xâu con chung dài nhất). Vậy nếu
j
i y
x thì c i,j maxci1, j ,ci, j1.
Công thức truy hồi cho xâu con chung dài nhất được thiết lập như sau:
y x khi 1 v , y x khi 0 v ( v 1 - j 1, - i c , 1 - j i, c , j 1, - i c i c j j c i i c j j j i ) max( 0 , 0 , 0 0 0 , (2.1) Thuật tốn tuần tự tìm xâu con chung dài nhất.
Dựa trên cơng thức truy hồi, thuật tốn tiếp nhận hai chuỗi hữu hạn, mỗi giá trị
i j
c , sẽ được lưu vào mảng c1...m,1...n. Việc tính tốn sẽ được thực hiện theo các hàng của mảng và cột trước đó theo cơng thức trên. Việc truy xuất lại mảng phương án c1...m,1...n để tìm ra xâu con chung dài nhất sẽ đi từ điểm cm,n của ma trận phương án. Ta lập mảng thứ hai b1...m,1...n để ghi những giải pháp tối ưu. Thuật toán trả về mảngc,b và cm,n chứa chiều dài xâu con chung dài nhất của X và Y.
Thuật tốn tìm xâu con chung dài nhất (lengthLCS)
Thuật tốn 2.1. Thuật tốn tuần tự tìm dãy con chung dài nhất
Ví dụ: Cho hai xâu : s1"AGGTGCT", s2 "GCCTAC". Tính giá trị c , i j sau đó lưu vào mảng c1...m,1...n A G G T G C T G 0 1 1 1 1 1 1 C 0 1 1 1 1 2 1 C 0 1 1 1 1 2 1 T 0 1 1 2 2 2 3 A 1 1 1 2 2 2 3 C 0 1 1 2 2 3 3
function lengthLCS(X[1..m], Y[1..n])
Đầu vào: Hai chuỗi X[1..m], Y[1..n])
Đầu ra: Dãy con chung lớn nhất giữa hai chuỗi V, W. 1. Khai báo c[1..m, 1..n] và b[1..m, 1..n]
2. m:= length (X); n= length (Y) 3. c(i=0 to m,0) = 0
4. c(0,j=0 to n) = 0 5. Loop i over length (X) 6. Loop j over length (Y)
7. c(i,j) = MAX [ c(i-1,j), c(i, j-1), c(i-1,j-1)+1 if X(i) = Y(j) ] 8. b(i,j) = UP if c(i,j) = c(i-1,j)
9. b(i,j) = LEFT if c(i,j) = c(i,j-1)
10. b(i,j) = DIAGONAL if c(i,j) = c(i-1,j-1) +1 11. Tìm giá trị lớn nhất trong hàng và cột cuối cùng của c 12. Return ( c và b)
Mảng b1...m,1...n ghi những giải pháp tối ưu: A G G T G C T G 0 1 1 1 1 1 1 C 0 1 1 1 1 2 1 C 0 1 1 1 1 2 1 T 0 1 1 2 2 2 3 A 1 1 1 2 2 2 3 C 1 1 1 2 2 3 3
Như vậy: thời gian thực hiện thuật toán là Omn. Nghiệm của thuật toán sẽ được tìm như sau:
Thuật tốn 2.2. Thuật tốn tuần tự in ra dãy con chung dài nhất function printLCS(b,X[1..m],i,j) function printLCS(b,X[1..m],i,j)
Đầu vào: Ma trận b, Mảng X[1..m] Đầu ra: Mảng LCS của X và Y Các bước:
1. If i = 0 or j = 0 return
2. if b(i,j) = DIAGONAL THEN 3. printLCS(b,X,i-1,j-1) 4. write X(i) 5. ELSE 6. IF b(i,j) = UP THEN 7. printLCS(b,X,i-1,j) 8. ELSE 9. printLCS(b,X,i,j-1)
2.4. Phương pháp phần tử trội trong bài toán xâu con chung dài nhất.
Thuật toán quy hoạch động giải quyết bài toán xâu con chung dài nhất khá hiệu quả với ma trận phương án có thể truy xuất lại xâu rất nhanh. Tuy nhiên khi dữ liệu lớn với số chuỗi tăng lên, phương pháp lưu trữ bằng ma trận như vậy sẽ không hiệu quả. Đặc biệt, khi độ dài chuỗi tăng dần, kích thước ma trận sẽ tăng đột biến và khi đạt đến một cỡ đủ lớn thì máy tính sẽ bị tràn bộ nhớ. Để giải quyết vấn đề này một cách hiệu quả, Hakata và Imai [8] đã đưa ra phương pháp phần tử trội để lưu trữ các phương án tìm xâu con chung dài nhất. Phương pháp này như sau:
Giả sử L là ma trận phương án với d chiều tương đương với d xâu ký tự
d
s ,..., s ,
s1 2 trên bảng chữ cái a1,a2,...,aN. pp1,p2,...,pdlà một điểm trên ma trận L với mỗi thành phần số nguyên pi là các vị trí tương ứng trên xâu si. Giá trị của vị trí p trong ma trận L được ký hiệu là L p . Tương tự như vậy, với một xâu
s, ký tự a ở vị trí thứ k trong xâu s được ký hiệu là a s k . Định nghĩa điểm khớp
Một điểm pp1,p2,...,pd trong L được gọi là một điểm “khớp” nếu:
p s p ... sd pd
s1 1 2 2 . Điểm khớp p tương ứng với một ký tự a được ký hiệu là p a .[8]
Định nghĩa điểm trội
Một điểm pp1,p2,...,pd được gọi là trội hơn điểm qq1,q2,...,qd nếu
d i
q
pi i, 1,2,..., . Nếu điểm p trội hơn điểm q thì ta ký hiệu là pq.
Tương tự như vậy, một điểm pp1,p2,...,pd được gọi là trội hơn hẳn điểm
q q qd
q 1, 2,..., nếu pi qi,i1,2,...,d. Nếu điểm p trội hơn điểm q thì ta ký hiệu là pq.
Một điểm pp1,p2,...,pd không trội hơn điểm qq1,q2,...,qd nếu
d i
i
,1 sao cho pi qi. Nếu điểm p không trội hơn điểm q thì ta ký hiệu là
q p . [8]
Định nghĩa điểm k trội
Một điểm khớp p a được gọi là một điểm k trội (phần tử k trội) nếu: (i) L p k;
(ii) Khơng có một điểm khớp q a nào thỏa mãn (i) và q p. Ký hiệu k
D là tập tất cả các điểm k trội. Ký hiệu D là tập tất cả các điểm trội. [8]
Định nghĩa điểm cha
Một điểm khớp p a được gọi là điểm cha của điểm q, nếu q p và khơng có một điểm khớp r a nào thỏa mãn qr p. Ký hiệu Par ,q a là tập tất cả các điểm cha của điểm q, ParA,a là tập tất cả các điểm cha của tập các điểm A và
A,
Par là tập tất cả các điểm cha (a ParA,a) của tập các điểm A. [8] Định nghĩa thành phần nhỏ nhất:
Một điểm p trong tập các điểm A được gọi là thành phần nhỏ nhất của A, nếu qA:q p. Nếu A 1, khi đó thành phần duy nhất chính là thành phần nhỏ nhất của A.
Bảng 2.2 Ví dụ về các điểm trội trong ma trận phương án.
H E A G A W G H E E A 0 0 1 1 1 1 1 1 1 1 W 0 0 1 1 1 2 2 2 2 2 H 1 1 1 1 1 2 2 3 3 3 E 1 2 2 2 2 2 2 3 4 4 A 1 2 3 3 3 3 3 3 4 4 E 1 2 3 3 3 3 3 3 4 5
Bảng 2 nêu ví dụ về các phần tử trội trong ma trận phương án của bài tốn tìm xâu con chung dài nhất của hai xâu s1 "HEAGAWGHEE" và s2 "AWHEAE". Các
điểm được khoanh tròn là các điểm trội. Các điểm được khoanh ô vuông là các điểm có vị trí khớp nhưng khơng phải là điểm trội.
Cho s1,s2,...,sd là d xâu ký tự trên bảng chữ cái và L là ma trận phương án. Khi đó chúng ta có nhận xét sau:
- Mỗi một vị trí trên xâu con chung dài nhất của d xâu ký tự trên là một vị trí khớp trên ma trận phương án L. Như vậy chúng ta chỉ cần tập trung vào tất cả các điểm khớp trên ma trận phương án L.
- Số lượng các mức của phần tử trội chính là độ dài của xâu con chung dài nhất của d xâu. Hơn nữa, tại mỗi mức k sẽ có ít nhất một k phần tử trội tương ứng với vị trí của ký tự thứ k trong xâu con chung dài nhất của d xâu.
- Các phần tử trội của L có thể được tính một cách thông qua tập các phần tử trội trước đó, tức là việc tính tốn k1
D sẽ trực tiếp dựa vào
k
D .
- Tập các k1 phần tử trội Dk1 chính là tập con của tập các điểm cha của tập Dk hay Dk1ParDk,.
- Phần tử nhỏ nhất trong tập các phần tử cha của tập các phần tử trội chính là các phần tử trội.
Qua các nhận xét trên, có thể thấy rằng các phần tử trội ở mức cao hơn luôn trội hơn hẳn một phần tử trội ở mức thấp hơn một bậc. Như vậy, để tìm các phần tử trội, chúng ta thực hiện như sau:
Xuất phát với k1, Dk . Dị tìm lần lượt trên các xâu ký tự, nếu gặp điểm khớp p đầu tiên thì đó chính là phần tử trội ở mức 1. Bổ sung p vào 1
D . Giả sử ta
đã có i
D D
D1, 2,..., là tập các phần tử trội nhỏ hơn hoặc bằng mức i (i1). Khi tìm thấy một điểm khớp q, chúng ta sẽ kiểm tra xem q trội hơn so với các phần tử k
q với các phần tử trong k1
D . Khi tìm được k là mức lớn nhất mà q trội hơn ít nhât một phần tử trong tập Dk, chúng ta sẽ kiểm tra xem q có trội hơn hẳn một phần tử trội nào trong tập Dk hay khơng. Nếu có thì q chính là phần tử trội của tập Dk1, ngược lại thì q khơng phải là phần tử trội.
Truy xuất tìm xâu con chung dài nhất khi biết phần tử trội
Khi có được tập tất cả các phần tử trội, chúng ta hồn tồn có thể xây dựng ma trận phương án như sau:
Giả sử s1,s2,...,sd là d xâu ký tự trên bảng chữ cái và L là ma trận phương án với tất cả các phần tử bằng 0. Xâu con chung dài nhất với độ dài là l.
Xuất phát từ tập tất cả các phần tử trội ở mức lớn nhất (mức l). Tại vị trí này ta đánh số l. Tất cả vị trí trội hơn các phần tử trội này cũng sẽ đều được đánh số l. Sau đó giảm xuống l1 và lại đánh số như trên. Cần lưu ý rằng các vị trí đã được đánh số khác 0 thì sẽ khơng được đánh số lại nữa. Cứ tiếp tục như vậy ta sẽ có ma trận phương án.
Bảng 2.3 mô tả việc dựng lại ma trận bảng phương án khi biết các phần tử trội. Bảng đang thể hiện việc xây dựng ma trận ở đối với các phần tử trội ở mức 3.
Bảng 2.3. Ví dụ về việc xây dựng lại ma trận phương án với các phần tử trội.
H E A G A W G H E E A 1 W 2 H 1 3 3 3 E 2 3 4 4 A 3 3 3 3 3 3 4 4 E 3 3 3 3 3 3 4 5
Thuật tốn tìm phần tử trội như sau:
Thuật tốn 2.3. Thuật tốn tìm phần tử trội
Ví dụ như trong bảng 2.3, xâu con chung dài nhất của hai xâu
" HEAGAWGHEE "
s1 và s2 "AWHEAE" là "AWHEE".
Mặt khác, khi biết được tập các phần tử trội, chúng ta có thể dễ dàng tìm trực tiếp ra xâu con chung dài nhất như sau:
Xuất phát từ một phần tử pl trong tập các phần tử trội Dl, tìm một phần tử
1
l
p trong tập l1
D sao cho pl pl1, rồi lại tiếp tục áp dụng tương tự với các tập
1 2,..., D
Dl . Như vậy, tập các điểm p1,p2,...,pl chính là các điểm trên xâu gốc mà tại đó là các ký tự trên xâu con chung dài nhất. Nói cách khác, xâu con chung dài nhất chính là si p1si p2 ....si pl với 1id.
Đánh giá về độ phức tạp tính tốn đối với bài tốn tìm xâu con chung dài nhất,