bwt演算法,實質上是字首樹的一種實現。那麼什麼是字首樹呢?
回到頂部
對於問題p in s?如果s=rpq,那麼p為s字首rp的乙個字尾。
於是,為了判斷p in s 是否成立,我們找到s的所有字首,然後逐一判斷p是不是它們的字尾。為了加快效率,我們將所有的字首建成一顆樹,這棵樹便是字首樹。下面,我們舉例說明字首樹的建立過程和如何使用字首樹進行模式匹配。
字首樹的建立
假設s='acaacg',p='aac',那麼我們首先找到s的所有字首,如下
於是,我們將這些字首翻轉過來,然後建立為一顆字典樹,如下圖
模式匹配p=
′aac
′p=′aac′,令p
′=ca
ap′=caa
(即p的翻轉)。顯然,現在只需進行一次樹的搜尋,即可完成匹配。
如果在判斷p in s 的同時,還需要得到p 在s 中的位置,那麼只需在建樹的時候,將每個字元的索引加上,例如
當然,也可以不儲存索引,每次模式匹配結束時,沿著當前節點走下去,一直到為s[0]。
在節點中新增數字,有其他用處,詳見我的另一篇博文廣義字尾樹的簡介。
評價我們可以看到,相對於常規的匹配演算法,字首樹時間複雜度比較小,但占用空間較大。下面要說的bwt演算法,就是解決這個問題的。
回到頂部
仍然,以s='acaacg'為例。
令s1=s+'′=也許,到這裡,你還不清楚bwt變換和字首樹,有什麼關係。那就接著往下看吧。′aca
acg′=′acaacg
';迴圈左移s1 6次,得到s2,s3,s4,s5,s6,s7;
對s1到s7按字典序排序(\字元
的字典序
最小),
取每個串
的最後一
個字元,
連成乙個
序列′g
c字元的字典序最小),取每個串的最後乙個字元,連成乙個序列′gc
aaac'。於是為bwt(s)='gc$aaac'。
回到頂部
我們已經知道bwt(s)='gcaa
ac′,
對bwt
(s)中
的字元進
行排序得
到s′=
′aaac′,對bwt(s)中的字元進行排序得到s′=′
aaaccg',得到下圖形式的矩陣。
這個矩陣看起來,有些規律,但是又很奇怪。下面通過復原s的過程,我們來理解以下這個矩陣。
復原s這個過程用語言描述比較麻煩,直接看圖
按照圖中(1)到(7)步,我們即可得到'$gcaaca',於是s='acaacg'。
其中,斜線表示是,我們找到最後一列的某個符號,然後跳至這個符號在第一列的位置。比如,在第(3)步中,最後一列為第2個c,我們跳到第一行中第2個c的位置。
模式匹配
p='aac',令p′
=′ca
a′p′=′caa′
,選取c作為起點,由於s中有兩個c,因此有兩種可能 的匹配。
從第乙個c出發
從第二個c出發
因此,在方案2得到p',因此p in s是正確的。
幾個問題
問題一:如何得到某個符號,在本列中是第幾個?
顯然,我們可以使用乙個陣列來儲存。例如,對於'$gcaaca',陣列a=[1,1,1,1,2,2,3]。
$ g c a a c a
[1,1,1,1,2,2,3]
但是,還有一種省空間的辦法。我們只儲存串'$gcaaca'中某些字元的位置,這些字元我們稱為checkpoint。
問題二:如何得到模式p在s中的位置?
匹配模式串之後,繼續執行,直至$,但是這樣比較耗時。
另一種辦法,在bwt串中記錄相應的偏移。這種辦法空間開銷比較大,也可以採取類似於checkpoint的方法,記錄部分的偏移。
藍橋杯 DNA比對
脫氧核糖核酸即常說的dna,是一類帶有遺傳資訊的生物大分子。它由4種主要的脫氧核苷酸 damp dgmp dcmt和dtmp 通過磷酸二酯鍵連線而成。這4種核苷酸可以分別記為 a g c t。dna攜帶的遺傳資訊可以用形如 aggtcgactcca.的串來表示。dna在轉錄複製的過程中可能會發生隨機...
BWT表的雙端匹配演算法
先對reference取反 gcaga 再對取反後的 reference顛倒位置 agacg reference 右移 cgtctagacg gcgtctagac cgcgtctaga acgcgtctag gacgcgtcta agacgcgtct tagacgcgtc ctagacgcgt tc...
BWT壓縮演算法及FM搜尋演算法詳解
bwt壓縮演算法其經典地位無可撼動,思想真是個奇妙的東西,廢話不多說,讓我們來看看她的奇妙之處吧。假設有一串字串s acaacg 長度為6,如果直接對此串進行壓縮,可能是a 1,c 1,a 2,c 1,g 1,對於更長的串,由於其隨機性,使得同乙個字母的大量重複更多,因此我們需要一種更好的辦法,既能...