1、BWT (Burrows–Wheeler_transform)算法介紹
bwa是目前最流行的二代測序比對工具,其中就用到了BWT算法。BWT(Burrows-Wheeler Transform)算法是一種數(shù)據(jù)轉(zhuǎn)換算法,它將一個字符串中的相似字符放在相鄰的位置,以便于后續(xù)的壓縮
2、 BWT編碼
目的:BWT編碼后,原始字符串中的相似字符會處在比較相鄰的位置
步驟:
(1)首先,BWT先對需要轉(zhuǎn)換的文本塊,進行循環(huán)右移,每次循環(huán)一位。
長度為n的文本塊,循環(huán)n次后重復,這樣就得到n個長度為n的字符串。如字符串 **acaacg **,圖中的“循環(huán)右移”列。(其中$作為標識符,不在文本塊的字符集中,這樣保證n個循環(huán)移位后的字符串均相同。 并且定義$小于字符集中的任意字符)。
(2)對循環(huán)移位后的n個字符串按照字典序排序。如下圖中的“排序”列。
(3)記錄下“排序”列中每個字符串的最后一個字符,組成“L”列;第一個字符,組成F列。("F"列是每個字符串的前綴)
這樣,原來的字符串“acaacgaaac”。“L”列就是編碼的結(jié)果。
3、 BWT解碼
因為進行的是循環(huán)移位,且是循環(huán)左移注意下面的性質(zhì):
L的第一個元素是字符串中的最后一個元素
對于“排序”列的每一行(第一行除外)第一個元素都是最后一個元素的下一個元素。也就是說,對于文本塊而言,同一行中F是L的下一個元素,L是F的前一個元素。
解碼:
通過"F"列中的元素,找到他前面的字符,就是對應(yīng)的同一行“L”列;
(2)通過“L”列中的元素,找到他在“F”列中的對應(yīng)字符位置。但是“L”中有3個字符a,如何對應(yīng)F中的3個a呢?因為L是F的前一個元素,多個具有相同前綴的字符串排序,去掉共同前綴后相對次序沒有變化。所有遇到多個相同的字符,相對位置不變;
轉(zhuǎn)到(1),直到結(jié)束。
因為F列是已經(jīng)排序的,可以從L列獲得,所有只需要保存L列就可以。從L列中的字符獲取在F列中的位置時,需要:
前綴和數(shù)組,記錄小于當前字符的字符數(shù)個數(shù)。
count計數(shù),計算L中從開始位置到當前字符位置等于該字符的字符數(shù)。(保證多個相同字符下"L"到“F”的相對位置不變)。
4、 例子
字符串 acaacg 與 caa 比對,長序列如上,根據(jù)BWT編碼。caa在匹配時,先用caa最后一個字符a,詳細方法如下:
a在F列中有3個位置,先試F中第一個位置的a,對應(yīng)L列的c (a->c),排除
F列中,第二個a,對應(yīng)L列的
),排除
-
F列中,第三個a,對應(yīng)L列的第一個a(a->a),繼續(xù)
F列中,第一個a, 對應(yīng)L列中的第一個c (a->c),
F列中,第一個c, 算法停止,找到位置
基因組分析 微信公眾號推出 《50篇文章深入理解NGS》系列文章, 第五篇文章 《基因組序列比對算法介紹——BWT算法》,爭取每周更新一篇高質(zhì)量生信干貨帖子。
關(guān)注微信公眾號 ,**轉(zhuǎn)發(fā) **給同學和同事,您的認可,是對我最大的支持 ,任何問題,后臺可以留言。