BWT (Burrows–Wheeler_transform) 解碼分析

原文地址:
BWT (Burrows–Wheeler_transform)數據轉換算法
原文講解十分詳細,但關鍵地方有點繞,故作分析註釋

這裏寫圖片描述

  因爲進行的是循環移位,且是循環左移注意下面的性質:
  1、L的第一個元素是Text中的最後一個元素
  2、對於M中的每一行(第一行除外)第一個元素都是最後一個元素的下一個元素。
     也就是說,對於文本塊而言,同一行中F是L的下一個元素,L是F的前一個元素。

這裏就是說:F列和L列,相同次序的元素,是相鄰關係
具體是:相同次序時,L列的元素是F列的前一個
例如:
F[1] == ‘#’ L[1] == ‘a’ , ‘a’在’#’的前面(循環來看)
F[5] == ‘b’ L[5] == ‘#’ , ‘#’在’b’的前面


  這樣,就需要
  (1)通過”F”列中的元素,找到他前面的字符,就是對應的同一行“L”列;

因爲F列是按字母序排列的,而我們的標記字符“#”又小於所有的文本字符,所以:F[1]一定是我們的標記字符“#”

這樣,根據上面的結論:相同次序時,L列的元素是F列的前一個,可以得到:L[1] == ‘a’就是原字符串的最後一個字符


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

上一步我們找到了原字符串的最後一個字符,就是L[1] == ‘a’,那麼下一步呢?

既然我們剛剛根據字符串的第一個字符找到了它的前一個字符(通過“#”找到了“a”),那麼我們就可以繼續找“a”的前一個字符,如此重複,就完成了解碼的任務。

如何找“a”的前一個字符?還是繼續利用我們最開始的結論:相同次序時,L列的元素是F列的前一個,只要找到“a”在F列中的位置x,就可以知道“a”的前一個元素爲L[x]

但問題是,F中有多個“a”,如何確定哪一個“a”對應的是我們現在的“a”?
即:是否可以找到 L和F中重複元素的對應關係


這句話很關鍵:

因爲L是F的前一個元素,多個具有相同前綴的字符串排序,去掉共同前綴後相對次序沒有變化。

  • 先來看L列的排列方式。
    因爲我們知道:相同次序時,L列的元素是F列的前一個 (又是這個),而F列是循環右移得到的字符串,按字母序排列後,每個串的第一個字母。
    換句話說就是:
    L列按每個元素後面的字符串的字母序排列

  • 再來看F列的排列方式。
    F列按字母序排列,而我們可以把字母序排列這樣描述:

    • 當首字母不同時,按首字母的字母序排列;
    • 當首字母相同時,按後面的字符串的字母序排列

這裏我們就能發現,當首字母相同時,爲得到L列和F列而使用的排列方式是相同的,而首字母相同就是L列和F列中的重複元素。

這裏寫圖片描述

換句話說,我們把L列中的“a”和F列中的“a”按從前往後或者從後往前的順序取出,他們本就是一一對應的。

整個解碼的問題到這裏就結束了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章