1.什么是BWT 壓縮技術(shù)主要的工作方式就是找到重復(fù)的模式,進(jìn)行緊密的編碼。 BWT(Burrows–Wheeler_transform)將原來(lái)的文本轉(zhuǎn)換為一個(gè)相似的文本,轉(zhuǎn)換后使得相同的字符位置連續(xù)或者相鄰,之后可以使用其他技術(shù)如:Move-to-front transform 和 游程編碼 進(jìn)行文本壓縮。 2.BWT原理 2.1 BWT編碼 (1)首先,BWT先對(duì)需要轉(zhuǎn)換的文本塊,進(jìn)行循環(huán)右移,每次循環(huán)一位。可以知道長(zhǎng)度為n的文本塊,循環(huán)n次后重復(fù),這樣就得到看n個(gè)長(zhǎng)度為n的字符串。如下圖中的“Rotate Right”列。(其中‘#’作為標(biāo)識(shí)符,不在文本塊的字符集中,這樣保證n個(gè)循環(huán)移位后的字符串均布相同。并且定義'#'小于字符集中的任意字符)。 (2)對(duì)循環(huán)移位后的n個(gè)字符串按照字典序排序。如下圖中的“Sorted (M)”列。 (3)記錄下“Sorted (M)”列中每個(gè)字符串的最后一個(gè)字符,組成了“L”列。(其中'F'列是“Sorted (M)”列中每個(gè)字符串的前綴) 這樣,原來(lái)的字符串“banana#”就轉(zhuǎn)換為了“annb#aa”。在某些情況下,使用L列進(jìn)行壓縮會(huì)有更好的效果?!癓”列就是編碼的結(jié)果。 2.2 BWT解碼 因?yàn)檫M(jìn)行的是循環(huán)移位,且是循環(huán)左移注意下面的性質(zhì): 1、L的第一個(gè)元素是Text中的最后一個(gè)元素 2、對(duì)于M中的每一行(第一行除外)第一個(gè)元素都是最后一個(gè)元素的下一個(gè)元素。 也就是說(shuō),對(duì)于文本塊而言,同一行中F是L的下一個(gè)元素,L是F的前一個(gè)元素。 這樣,就需要 (1)通過(guò)'F'列中的元素,找到他前面的字符,就是對(duì)應(yīng)的同一行“L”列; (2)通過(guò)“L”列中的元素,找到他在“F”列中的對(duì)應(yīng)字符位置。但是“L”中有3個(gè)字符a,如何對(duì)應(yīng)F中的3個(gè)a呢?因?yàn)長(zhǎng)是F的前一個(gè)元素,多個(gè)具有相同前綴的字符串排序,去掉共同前綴后相對(duì)次序沒(méi)有變化。所有遇到多個(gè)相同的字符,相對(duì)位置不變; (3)轉(zhuǎn)到(1),直到結(jié)束。 ![]() 因?yàn)镕列是已經(jīng)排序的,可以從L列獲得,所有只需要保存L列就可以。從L列中的字符獲取在F列中的位置時(shí),需要: (1)前綴和數(shù)組,記錄小于當(dāng)前字符的字符數(shù)個(gè)數(shù)。 (2)count計(jì)數(shù),計(jì)算L中從開(kāi)始位置到當(dāng)前字符位置等于該字符的字符數(shù)。(保證多個(gè)相同字符下'L'到“F”的相對(duì)位置不變)。 3.BWT文本塊編碼、解碼實(shí)例 1 #include 代碼執(zhí)行輸出: 參考: http://en./wiki/Burrows%E2%80%93Wheeler_transform
額外閱讀: |
|
來(lái)自: zhuqiaoxiaoxue > 《生信》