BWT壓縮演算法及FM搜尋演算法詳解

2021-06-26 16:10:32 字數 1602 閱讀 6508

bwt壓縮演算法其經典地位無可撼動, 思想真是個奇妙的東西, 廢話不多說, 讓我們來看看她的奇妙之處吧。

假設有一串字串s="acaacg", 長度為6, 如果直接對此串進行壓縮, 可能是a 1, c 1, a 2, c 1, g 1, 對於更長的串, 由於其隨機性, 使得同乙個字母的大量重複更多, 因此我們需要一種更好的辦法,既能提高壓縮效率同時可以完美還原原序列, bwt演算法這就登場了:

1, 首先將原字串開頭新增乙個結束字元,一般取$, 得到s'="$acaacg",長度為 7

2, 將s'往右輪轉,得到乙個陣列m,它只是乙個中間產物, 但是對於後面的理解會有幫助

$acaacg

g$acaac

cg$acaa

acg$aca

aacg$ac

caacg$a

acaacg$

3, 緊接著對這個陣列按照字典序排序,得到 m',後續的處理都是基於這個陣列,( 請開動您的腦筋, 來一次天馬星空吧)

$acaacg

aacg$ac

acaacg$

acg$aca

caacg$a

cg$acaa

g$acaac

4,這裡我們定義m' 的第一列為f="$aaaccg", 長度為7,這個看起來挺適合壓縮, 但我們的目的還要還原, 而f不能還原成s(自己想想為什麼?),

在定義m' 的最後一列為l="gc$aaac",長度為7,g 1, c 1, a 3, c 1, 發現這個序列更有規律,較原序列更易壓縮, 這裡要說明下矩陣m' 兩個性質,

a. l的第乙個元素是s中的最後乙個元素

b.  對於m' 中的每一行(第一行除外)第乙個元素都是最後乙個元素在原序列中的下乙個元素。(這句請多想想), 例如m' 第2行a, 該行最後乙個字母是c, 再回到s中可發現,a就是緊跟c後面的乙個字元。

也就是說,對於文字塊而言,同一行中f是l的下乙個元素,l是f的前乙個元素。

至此, 壓縮初步完成,即得到l序列, 後面更完整的壓縮是根據l更容易還原的特性來處理, 我們先講到這裡。

5, 現在我們就從l開始還原了,還原之前我們要對m' 矩陣進行統計, f中每個字元(相同字元取第乙個)前面有多少個字元,$不計入,總共三個字母a, c, g, 於是得到sf=;l中每個字母之前有多少個與自己相同的字母,有這些字母 g, c, a, a, a, c,得到sl=,

現在就可以還原了, 首先取l的第乙個字母g, 根據性質a它是原序列中的最後乙個字母, 再根據b性質,依次還原每個字母的前乙個字母,於是為了得到g的前乙個字母,我們要找到g開頭的序列,m'的最後一行, 然後找到該行最後乙個字母c, 就是原序列g的前乙個字母,得到cg, 繼續找c的前乙個字母, 找到以c開頭的行,發現有兩行, 怎麼辦, 就要用到剛才統計好的陣列了, 剛才的c前面有乙個c, 故現在得到的兩行中的第二行是我們要找的目標行, 於是c前面的字母就是a,得到acg, 這個a前面有兩個a, 所以我們找到m' 中的第四行,那麼a的前乙個字母就是a,得到aacg,依照此規律開動您的小腦袋繼續探索吧。 (如果覺得文字說明太亂,請看下面圖示)

上面所講全是理論性質的, 有興趣的朋友可以動手謝謝**, 同時可以參考網上其他朋友已經實現了的**。

關於fm搜尋演算法, 未完待續, 懇請各位前輩們多多批評指正, 本人一定多學習借鑑, 謝謝。

A 搜尋演算法

啟發式搜尋演算法 要理解 a 搜尋演算法,還得從啟發式搜尋演算法開始談起。所謂啟發式搜尋,就在於當前搜尋結點往下選擇下一步結點時,可以通過乙個啟發函式 來進行選擇,選擇代價最少的結點作為下一步搜尋結點而跳轉其上 遇到有乙個以上代價最 少的結點,不妨選距離當前搜尋點最近一次展開的搜尋點進行下一步搜尋 ...

A 搜尋演算法

a 演算法是基於bfs的一種入門級啟發式搜尋演算法,就是將bfs的佇列改為基於估價的優先佇列,可以快速地找到答案。優先隊列為小根堆 while 優先佇列不為空 取出隊頭並擴充套件 將擴充套件節點以估價值 當前值為優先順序入隊 endwhile估價函式越接近真實值演算法越優,但一定不能大於真實值,否則...

演算法 排序演算法 搜尋演算法

排序演算法 function arraylist this.tostring function item 冒泡 this.bubblesort function function swap arr,index1,index2 改進冒泡,減少內迴圈不必要的比較次數,每一輪最後兩個數下一次沒必要再比較 ...