BWT算法

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個字符串按照字典序排序。如下圖中的“排序”列。

image

(3)記錄下“排序”列中每個字符串的最后一個字符,組成“L”列;第一個字符,組成F列。("F"列是每個字符串的前綴)

這樣,原來的字符串“acaacg”就轉(zhuǎn)換為了“gcaaac”。“L”列就是編碼的結(jié)果。

3、 BWT解碼

因為進行的是循環(huán)移位,且是循環(huán)左移注意下面的性質(zhì):

  1. L的第一個元素是字符串中的最后一個元素

  2. 對于“排序”列的每一行(第一行除外)第一個元素都是最后一個元素的下一個元素。也就是說,對于文本塊而言,同一行中F是L的下一個元素,L是F的前一個元素。

解碼:

  1. 通過"F"列中的元素,找到他前面的字符,就是對應(yīng)的同一行“L”列;

  2. (2)通過“L”列中的元素,找到他在“F”列中的對應(yīng)字符位置。但是“L”中有3個字符a,如何對應(yīng)F中的3個a呢?因為L是F的前一個元素,多個具有相同前綴的字符串排序,去掉共同前綴后相對次序沒有變化。所有遇到多個相同的字符,相對位置不變;

  3. 轉(zhuǎn)到(1),直到結(jié)束。

因為F列是已經(jīng)排序的,可以從L列獲得,所有只需要保存L列就可以。從L列中的字符獲取在F列中的位置時,需要:

  1. 前綴和數(shù)組,記錄小于當前字符的字符數(shù)個數(shù)。

  2. count計數(shù),計算L中從開始位置到當前字符位置等于該字符的字符數(shù)。(保證多個相同字符下"L"到“F”的相對位置不變)。

4、 例子

  字符串 acaacg 與 caa 比對,長序列如上,根據(jù)BWT編碼。caa在匹配時,先用caa最后一個字符a,詳細方法如下:
  1. a在F列中有3個位置,先試F中第一個位置的a,對應(yīng)L列的c (a->c),排除

  2. F列中,第二個a,對應(yīng)L列的(a->),排除

  3. 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ā) **給同學和同事,您的認可,是對我最大的支持 ,任何問題,后臺可以留言。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容