1. 程式人生 > >bi-interval匹配演算法詳解

bi-interval匹配演算法詳解

一、引數說明

T=ACGTCTCGAGACGT

|T|=14

T[i]=第i個鹼基

T[i,j]=第i到第j個鹼基的字串

Ti  整個的字串

S:S(i)是第i小的陣列的位置

B[i]=尾綴陣列

C(a)共四個值,分別為C(A)C(C)C(G)C(T)    C(A)={0<=i<=n-1:T[i]<A} 的個數

O(a,i)=從B[]表從0~i中,a 的個數,大小為4*N

P·W表示:字串P和W的直接連線

Pa 表示:字串P和鹼基a 的連線

P(上橫線)表示P的補

 

二、演算法舉例

問題:reference:ACGTCTC;     read:GTC

由read的T開始去匹配,那麼在bi-interval模型中他是怎麼實現的呢?

先對reference取反:TGCAGAG,再前後調換位置:GAGACGT

reference 右移:

  1. ACGTCTCGAGACGT
  2. TACGTCTCGAGACG
  3. GTACGTCTCGAGAC
  4. CGTACGTCTCGAGA
  5. ACGTACGTCTCGAG
  6. GACGTACGTCTCGA
  7. AGACGTACGTCTCG
  8. GAGACGTACGTCTC
  9. CGAGACGTACGTCT
  10. TCGAGACGTACGTC
  11. CTCGAGACGTACGT
  12. TCTCGAGACGTACG
  13. GTCTCGAGACGTAC
  14. CGTCTCGAGACGTA

排序:

  1. ACGTACGTCTCGAG
  2. ACGTCTCGAGACGT
  3. AGACGTACGTCTCG
  4. CGAGACGTACGTCT
  5. CGTACGTCTCGAGA
  6. CGTCTCGAGACGTA
  7. CTCGAGACGTACGT
  8. GACGTACGTCTCGA
  9. GAGACGTACGTCTC
  10. GTACGTCTCGAGAC
  11. GTCTCGAGACGTAC
  12. TACGTCTCGAGACG
  13. TCGAGACGTACGTC
  14. TCTCGAGACGTACG

BWT表建立完畢,從read(GTC)的中間鹼基T開始匹配,其interval為:[12,1,3]。

  • Backward匹配:

演算法分析:

b從0~5表示$,0,1,2,3,4,N。先算出k上面有多少b,加上O(b)記為Kb,同事算出在[k,k+s]這個範圍內,有多少b,記為Sb。

L遞推求,L0與W的L相同,L4=L0+S0,L3=L4+S4,L2=L3+S3......

 

針對具體問題:T:bi-interval:[12,1,3]    a:G

K0=C($~0)+O(0,11)=0   ;  S0=0 

K1=C(A~1)+O(1,11)=1+3=4  ;   S1=O(1,14)- O(1,11)=0(不存在)

K2=C(C~2)+O(2,,11)=4+3=7   ;   S2=O(2,13)- O(2,11)=1 (有1個)

K3=C(G~3)+O(3,11)=8+2=10  ; S3=O(3,13)-O(3,11)=2(有2個)

K4=C(T~4)+O(4,11)=12+3=15 ; S4=0    (不存在)

K5~沒有奇異值,不算。

L0=L=1;

L4=L0+S0=1+0=1

L3=L4+S4=1(即A右邊有C)

L2=L3+S3=1+2=3~即T的反變換:A右邊有G的是第3行

L1=L2+S2=3+1=4~即T的反變換:A右邊有T的是第4行。但s4=0,也是不存在

根據輸入的a=G,則得到的bi-interval[k3,l2,s3]=[10,1,2]

  • Forward匹配:

Forward匹配要做的就是利用backward 的公式,改變輸入引數,得到forward(向右)匹配的bi-interval結果。

1.首先:將a=C變成a(補)=G,

2.再將原bi-interval的k和l換位置,得到[1,10,2]。

這樣就得到了一個新的backward匹配工作。

 

針對具體問題:GT(補)=AC,它的bi-interval是:[1,10,2] ;   a=C->a(補)=G

L0=C($~0)+O(0,0)=0   ;  S0=0 

L1=C(A~1)+O(1,0)=1+0=1  ;   S1=O(1,2)- O(1,0)=0(不存在)

L2=C(C~2)+O(2,,0)=4+0=4   ;   S2=O(2,2)- O(2,0)=0 (不存在)

L3=C(G~3)+O(3,0)=8+0=8  ; S3=O(3,2)-O(3,0)=1(有1個)

L4=C(T~4)+O(4,0)=12+0=12 ; S4=O(4,2)-O(4,0)=1    (有1個)

L5~沒有奇異值,不算。

K0=K=10;

k4=K0+S0=10+0=10(即GT右邊有A)

k3=k4+S4=10+1=11(即GT右邊有C)

K2=k3+S3=11+1=12~S2=0所以不存在

K1=K2+S2=12+0=12~S1=0所以不存在

根據輸入的a=G,輸出的時候,要調換K和L 的位置,則得到的bi-interval[k3,l3,s3]=[11,8,1]

匹配流程走完。