專利名稱:一種bwt實(shí)現(xiàn)方法中對后綴進(jìn)行排序的方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)壓縮技術(shù)以及硬件設(shè)計(jì)領(lǐng)域,尤其涉及一種BWT實(shí)現(xiàn)方法中對后綴進(jìn)行排序的方法及系統(tǒng)。
背景技術(shù):
數(shù)據(jù)壓縮是指在不丟失信息的前提下,縮減數(shù)據(jù)量以減少存儲(chǔ)空間,提高其傳輸、存儲(chǔ)和處理效率的一種技術(shù)方法。或按照一定的算法對數(shù)據(jù)進(jìn)行重新組織,減少數(shù)據(jù)的冗余和存儲(chǔ)的空間。數(shù)據(jù)壓縮包括有損壓縮和無損壓縮。Bzip2作為一種無損壓縮,其壓縮效率比傳統(tǒng)的GZIP或者ZIP的壓縮效率更高,但是它的壓縮速度較慢,消耗的資源更多。Bzip2首先會(huì)對需要進(jìn)行壓縮的文件做前置變換以及行程長度編碼,接下來使用BWT (Burrows-Wheeler Transform)將重復(fù)出現(xiàn)的字符序列轉(zhuǎn)換成同樣字母的字符串,然后用MTF (Move-To-Front Transform)變換進(jìn)行處理,最后使用哈夫曼編碼進(jìn)行壓縮。其中最消耗時(shí)間和資源的就是BWT變換。現(xiàn)在對于前置變化以及行程長度編碼,MTF變換以及哈夫曼編碼這幾個(gè)部分已經(jīng)有比較成熟的硬件實(shí)現(xiàn)方案,BffT變換的硬件實(shí)現(xiàn)仍然是一個(gè)問題。目前已有的Bzip2硬件加速方面的專利,如專利號(hào)為:200910095596.7的實(shí)用新型專利,給出了一種Bzip2壓縮算法硬件加速實(shí)現(xiàn)的方法,但是這個(gè)方法主要是針對Bzip2前置變換和行程長度編碼的,雖然能很好的加速這一塊,但是由于這一塊在整個(gè)Bzip2中的地位并不是那么明顯,所以對整個(gè)Bzip2的壓縮過程起到的加速作用不大。
發(fā)明內(nèi)容
本發(fā)明的目的一在于提出一種BWT實(shí)現(xiàn)方法中對后綴進(jìn)行排序的方法及系統(tǒng),通過在變換時(shí)間和資源消耗上的平衡,以解決原始BWT變換方法消耗資源大、壓縮率低的問題。為實(shí)現(xiàn)上述發(fā)明目的,本發(fā)明提出一種BWT實(shí)現(xiàn)方法中對后綴進(jìn)行排序的方法,該方法包括:步驟1,從BWT的待變換序列中取出需要排序的后綴;步驟2,判斷以所述后綴的開頭元素作為斷首元素的段在后綴鏈表中是否出現(xiàn)過,所述后綴的開頭元素的ASC II值為i,如果寄存器appear[i]=l,則出現(xiàn)過,執(zhí)行步驟3 ;如果寄存器appear [i]=0,則未出現(xiàn)過,執(zhí)行步驟4,其中appear [i]代表以ASC II表中數(shù)字i代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí);步驟3,在段內(nèi)進(jìn)行雙向搜索,獲得所述后綴在所述后綴鏈表中的位置,然后執(zhí)行步驟5 ;步驟4,在整個(gè)后綴鏈表中進(jìn)行雙向搜索,搜索到離所述后綴最近的在后綴鏈表中存在的段,根據(jù)所述段獲得所述后綴在所述后綴鏈表中的位置,其中所述段是以相同元素開頭的后綴按從小到大順序組成的序列,然后執(zhí)行步驟5 ;
步驟5,將所述后綴插入后綴鏈表:將所述后綴的高地址上的所有后綴右移一位,將所述高地址所在的位置空出,然后在所述高地址后綴所在的位置上插入所述后綴,然后執(zhí)行步驟6 ;步驟6,更新所述后綴鏈表以及段的信息,其中所述后綴鏈表由后綴段組成,并按照段首元素從小到大順序排列的,所述段首元素是每個(gè)段里面后綴的開頭元素。進(jìn)一步的,所述步驟3包括:步驟31,找到段頭、段尾位置對應(yīng)的兩個(gè)后綴;步驟32,分別將段頭和段尾對應(yīng)的后綴記為Sm、Sn,并與所述后綴Si進(jìn)行大小比較,如果Si〈Sn或者SPSm,則執(zhí)行步驟34 ;如果SJS^Sm,則執(zhí)行步驟33 ;步驟33,找到Sm、Sn指向段內(nèi)方向的相鄰的兩個(gè)后綴,將Sm、Sn替換為這兩個(gè)后綴,再與Si進(jìn)行大小比較,如果Si〈Sn或者SPSm,則執(zhí)行步驟34 ;如果SJS^Sm,則執(zhí)行步驟32 ;步驟34,結(jié)束雙向搜索,記錄Si位置,如果SiGn,則Si的位置在Sn鄰近的低地址,SPSm,則Si的位置在Sm鄰近的高地址,其中所述段頭段尾分別是段里面的最小后綴和最大后綴。進(jìn)一步的,所述 步驟4包括:步驟41,令控制參數(shù)k自增1,第一次執(zhí)行步驟41的時(shí)候初始化k為0,然后查看 appear [i+k]和 apprear [i~k],如果 appear [i+k] =1 或者 appear [i_k]=l,結(jié)束雙向查找,然后執(zhí)行步驟42 ;如果appear [i+k] =0并且appear [1-k] =0,則重復(fù)步驟41,其中appear [i+k]和apprear [i_k]分別代表以ASC II表中數(shù)字i+k和i_k代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí)。步驟42,如果appear [i+k] =1,則Si的位置在以元素i+k為段首元素的段的段尾鄰近的低地址;如果appear [1-k] = I,則Si的位置在以元素i_k為段首元素的段的段頭鄰近的高地址,其中appear [i+k]和apprear [i_k]分別代表以ASC II表中數(shù)字i+k和i_k代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí)。進(jìn)一步的,所述步驟6包括:步驟61,如果上一個(gè)步驟是步驟3,則執(zhí)行步驟63 ;如果上一個(gè)步驟是步驟4,則執(zhí)行步驟62 ;步驟62,將這個(gè)段的存在信息改為已經(jīng)存在,即令appear [i]=l,同時(shí)把max [i]的值min[i]都直為Si在后綴鏈表中的地址;步驟63,更新相應(yīng)段的max [i]以及min[i]信息,即將段頭段尾中存放的地址加1,其中所述相應(yīng)段指的是斷首元素大于或者等于后綴Si的開頭元素的段,min[i]記錄以ASC II表中數(shù)字i代表的元素為段首元素的段尾對應(yīng)的后綴在后綴鏈表中的地址,max[i]記錄以ASC II表中數(shù)字i代表的元素為段首元素的段頭對應(yīng)的后綴在后綴鏈表中的地址。進(jìn)一步的,所述后綴鏈表里的后綴都是成段出現(xiàn)的,而且每一段的段首元素是按字典序從小到大排列的。為實(shí)現(xiàn)上述發(fā)明目的,本發(fā)明還提供一種BWT實(shí)現(xiàn)方法中對后綴進(jìn)行排序的系統(tǒng),該系統(tǒng)包括:提取模塊,從BWT的待變換序列中取出需要排序的后綴;處理模塊,判斷以所述后綴的開頭元素作為斷首元素的段在后綴鏈表中是否出現(xiàn)過,所述后綴的開頭元素的ASC II值為i,如果寄存器appear [i]=l,則出現(xiàn)過,執(zhí)行第一雙向搜索模塊;如果寄存器appear[i]=0,則未出現(xiàn)過,執(zhí)行第二雙向搜索模塊,其中appear [i]代表以ASC II表中數(shù)字i代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí);第一雙向搜索模塊,在段內(nèi)進(jìn)行雙向搜索,獲得所述后綴在所述后綴鏈表中的位置,然后執(zhí)行后綴排序模塊;第二雙向搜索模塊,在所述后綴鏈表中進(jìn)行雙向搜索,搜索到離所述后綴最近的在所述后綴鏈表中存在的段,根據(jù)所述段獲得所述后綴在所述后綴鏈表中的位置,其中所述段是以相同元素開頭的后綴按從小到大順序組成的序列,然后執(zhí)行后綴排序模塊;插入后綴模塊,將所述后綴插入后綴鏈表:將所述后綴的段的高地址上的所有后綴右移一位,這樣所述高地址所在的位置就空出來了,然后在所述高地址后綴所在的位置上插入所述后綴,然后執(zhí)行更新模塊;更新模塊,更新所述后綴鏈表以及段的信息,其中所述后綴鏈表由后綴段組成,并按照段首元素從小到大順序排列的,所述段首元素是每個(gè)段里面后綴的開頭元素。進(jìn)一步的,所述第一雙向搜索模塊包括:后綴搜索模塊,找到段頭、段尾位置對應(yīng)的兩個(gè)后綴;比較模塊,分別將段頭和段尾對應(yīng)的后綴記為Sm、Sn,并與所述后綴Si進(jìn)行大小比較,如果Si〈Sn或者SPSm,則執(zhí)行記錄位置模塊;如果SjS^Sm,則執(zhí)行替換比較模塊;替換比較模塊,找到Sm、Sn指向段內(nèi)方向的相鄰的兩個(gè)后綴,將Sm、Sn替換為這兩個(gè)后綴,再與Si進(jìn)行大小比較,如果Si〈Sn或者SASni,則執(zhí)行記錄位置模塊;如果S1^SZSni,則執(zhí)行比較模塊; 記錄位置模塊,結(jié)束雙向搜索,記錄Si位置,如果Si〈Sn,則Si的位置在近的低地址,SPSm,則Si的位置在Sm鄰近的高地址,其中所述段頭段尾分別是段里面的最小后綴和最大后綴。進(jìn)一步的,所述第二雙向搜索模塊包括:初始化處理模塊,令控制參數(shù)k自增I,第一次執(zhí)行初始化處理模塊的時(shí)候初始化k 為 O,然后查看 appear [i+k]和 apprear [1-k],如果 appear [i+k] =1 或者 appear [1-k] =1,結(jié)束雙向搜索,然后執(zhí)行位置確定模塊;如果appear [i+k]=0并且appear [1-k] = O,則重復(fù)執(zhí)行初始化處理模塊,其中appear[i+k]和apprear[i_k]分別代表以ASC II表中數(shù)字i+k和1-k代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí)。位置確定模塊,如果appear [i+k] = 1,則Si的位置在以元素i+k為段首元素的段的段尾鄰近的低地址;如果appear [1-k] = 1,則Si的位置在以元素i_k為段首元素的段的段頭鄰近的高地址,其中appear [i+k]和apprear [i_k]分別代表以ASC II表中數(shù)字i+k和1-k代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí)。進(jìn)一步的,所述更新模塊包括:判斷執(zhí)行模塊,如果上一個(gè)模塊是第一雙向搜索模塊,則執(zhí)行信息處理模塊;如果上一個(gè)模塊是第二雙向搜索模塊,則執(zhí)行信息修改模塊;信息修改模塊,將這個(gè)段的存在信息改為已經(jīng)存在,即令appear[i]=l,同時(shí)把max[i]的值min[i]都置為Si在后綴鏈表中的地址;信息處理模塊,更新相應(yīng)段的max[i]以及min[i]信息,并將段頭段尾中存放的地址加1,其中所述相應(yīng)段指的是斷首元素大于或者等于后綴Si的開頭元素的段,min[i]記錄以ASC II表中數(shù)字i代表的元素為段首元素的段尾對應(yīng)的后綴在后綴鏈表中的地址,max[i]記錄以ASC II表中數(shù)字i代表的元素為段首元素的段頭對應(yīng)的后綴在后綴鏈表中的地址。進(jìn)一步的,所述后綴鏈表里的后綴都是成段出現(xiàn)的,而且每一段的段首元素是按字典序從小到大排列的。本發(fā)明的有益功效在于,1.在構(gòu)建后綴時(shí),采用默認(rèn)大小方法,省略了哨兵元素,使得待壓縮的數(shù)據(jù)與本方法自身之間不存在數(shù)據(jù)沖突。2.計(jì)算BWT變換的速度比單純的基本算法以及雙向算法的處理快,仿真測試的結(jié)果顯示當(dāng)待壓縮數(shù)據(jù)量達(dá)到64Kbyte大小甚至更大時(shí),雙向算法消耗的時(shí)間大約為9*108個(gè)時(shí)鐘周期,而本發(fā)明中提及的算法消耗的時(shí)鐘周期大約為8.7*107個(gè),顯然本發(fā)明中提及的方法比雙向算法的速度提高了一個(gè)數(shù)量級(jí);3.對每一個(gè)后綴進(jìn)行大小比較確定其位置之后,用該后綴的起始元素在原序列中的地址來表示該后綴,這樣可以節(jié)省存儲(chǔ)資源,對于長度為N的序列,由于每個(gè)元素都是以ASC II的形式讀入,即都能用0 255來表示。如果我們直接將每個(gè)后綴存儲(chǔ),需要
8*(1+2+3+......+N)=4N(N+1)個(gè)比特的存儲(chǔ)資源來存放所有后綴;如果用后綴的起始元素在
原序列中的地址表示后綴,則只需要N*([log2N]+l)個(gè)比特的存儲(chǔ)資源來存放所有后綴,當(dāng)N很大的時(shí)候會(huì)節(jié)省很多存儲(chǔ)資源。 4.使用資源比較合理,對于長度為N的待變換序列,用這種在放方法消耗的存儲(chǔ)資源是(9+[1g2N] )*N+512*( [1g2N]+1)比特,可以根據(jù)實(shí)際情況調(diào)整輸入序列的長度來控制資源的消耗;5.本發(fā)明提到的方法的最差計(jì)算復(fù)雜度為相對于原始算法的最差
σ ,
計(jì)算復(fù)雜度0(Ν2)要小很多,采用硬件方案設(shè)計(jì)時(shí)更具可行性。以下結(jié)合附圖和具體實(shí)施例對本發(fā)明進(jìn)行詳細(xì)描述,但不作為對本發(fā)明的限定。
圖1為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中定義的后綴鏈表;圖2為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中以元素i開頭的段的結(jié)構(gòu);圖3為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中段信息是否出現(xiàn)的信息;圖4為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中段頭段尾信息;圖5為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中對后綴進(jìn)行排序的流程圖;圖6為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中雙向搜索的具體步驟;圖7為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中雙向查找最近段的具體步驟;圖8為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中更新后綴鏈表的具體步驟;圖9為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中插入后綴的示意圖;圖10為本發(fā)明的一種BWT實(shí)現(xiàn)方法中對后綴進(jìn)行排序的方法流程圖;圖11為本發(fā)明的一種BWT實(shí)現(xiàn)方法中對后綴進(jìn)行排序的系統(tǒng)示意圖。
具體實(shí)施例方式下面參照附圖用本發(fā)明的示例性實(shí)施例對本發(fā)明進(jìn)行更全面的描述和說明。圖10為本發(fā)明的一種BWT實(shí)現(xiàn)方法中對后綴進(jìn)行排序的方法流程圖。如圖1所示,該方法包括:步驟1,從BWT的待變換序列中取出需要排序的后綴;步驟2,判斷以所述后綴的開頭元素作為斷首元素的段在后綴鏈表中是否出現(xiàn)過,所述后綴的開頭元素的ASC II值為i,如果寄存器appear[i]=l,則出現(xiàn)過,執(zhí)行步驟3 ;如果寄存器appear [i]=0,則未出現(xiàn)過,執(zhí)行步驟4,其中appear [i]代表以ASC II表中數(shù)字i代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí);步驟3,在段內(nèi)進(jìn)行雙向搜索,獲得所述后綴在所述后綴鏈表中的位置,然后執(zhí)行步驟5 ;步驟4,在后綴鏈表中進(jìn)行雙向搜索,搜索到離所述后綴最近的在所述后綴鏈表中存在的段,根據(jù)所述段獲得所述后綴在所述后綴鏈表中的位置,其中所述段是以相同元素開頭的后綴按從小到大順序組成的序列,然后執(zhí)行步驟5 ;步驟5,將所述后綴插入后綴鏈表:將所述后綴的高地址上的所有后綴右移一位,這樣所述高地址所在的位置就空出來了,然后在所述高地址后綴所在的位置上插入所述后綴,然后執(zhí)行步驟6;步驟6,更新所述后綴鏈表以及段的信息,其中所述后綴鏈表由后綴段組成,并按照段首元素從小到大順序排列的,所述段首元素是每個(gè)段里面后綴的開頭元素。進(jìn)一步的,所述步驟3包括:`步驟31,找到段頭、段尾位置對應(yīng)的兩個(gè)后綴;步驟32,分別將段頭和段尾對應(yīng)的后綴記為Sm、Sn,并與所述后綴Si進(jìn)行大小比較,如果Si〈Sn或者SPSm,則執(zhí)行步驟34 ;如果SJS^Sm,則執(zhí)行步驟33 ;步驟33,找到S1^Sn指向段內(nèi)方向的相鄰的兩個(gè)后綴,將S1^Sn替換為這兩個(gè)后綴,再與Si進(jìn)行大小比較,如果Si〈Sn或者SPSm,則執(zhí)行步驟34 ;如果SJS^Sm,則執(zhí)行步驟32 ;步驟34,結(jié)束雙向搜索,記錄Si位置,如果SiGn,則Si的位置在Sn鄰近的低地址,SPSm,則Si的位置在Sm鄰近的高地址,其中所述段頭段尾分別是段里面的最小后綴和最大后綴。進(jìn)一步的,所述步驟4包括:步驟41,令控制參數(shù)k自增I,第一次執(zhí)行步驟41的時(shí)候初始化k為0,然后查看 appear [i+k]和 apprear [i~k],如果 appear [i+k] =1 或者 appear [i_k]=l,結(jié)束雙向查找,然后執(zhí)行步驟42 ;如果appear [i+k] =0并且appear [1-k] =0,則重復(fù)步驟41,其中appear [i+k]和apprear [i_k]分別代表以ASC II表中數(shù)字i+k和i_k代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí)。步驟42,如果appear [i+k] =1,則Si的位置在以元素i+k為段首元素的段的段尾鄰近的低地址;如果appear [1-k] = I,則Si的位置在以元素i_k為段首元素的段的段頭鄰近的高地址,其中appear [i+k]和apprear [i_k]分別代表以ASC II表中數(shù)字i+k和i_k代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí)。
進(jìn)一步的,所述步驟6包括:步驟61,如果上一個(gè)步驟是步驟3,則執(zhí)行步驟63 ;如果上一個(gè)步驟是步驟4,則執(zhí)行步驟62 ;步驟62,將這個(gè)段的存在信息改為已經(jīng)存在,即令appear [i]=l,同時(shí)把max [i]的值min[i]都直為Si在后綴鏈表中的地址;步驟63,更新相應(yīng)段的max [i]以及min[i]信息,即將段頭段尾中存放的地址加1,其中所述相應(yīng)段指的是斷首元素大于或者等于后綴Si的開頭元素的段,min[i]記錄以ASC II表中數(shù)字i代表的元素為段首元素的段尾對應(yīng)的后綴在后綴鏈表中的地址,max[i]記錄以ASC II表中數(shù)字i代表的元素為為段首元素的段頭對應(yīng)的后綴在后綴鏈表中的地址。進(jìn)一步的,所述后綴鏈表里的后綴都是成段出現(xiàn)的,而且每一段的段首元素是按字典序從小到大排列的。圖11為本發(fā)明的一種BWT實(shí)現(xiàn)方法中對后綴進(jìn)行排序的系統(tǒng)示意圖。如圖11所示,該系統(tǒng)包括:提取I旲塊100 ,從BWT的待變換序列中取出需要排序的后綴;處理模塊200,判斷以所述后綴的開頭元素作為斷首元素的段在后綴鏈表中是否出現(xiàn)過,所述后綴的開頭元素的ASC II值為i,如果寄存器appear[i]=l,則出現(xiàn)過,執(zhí)行第一雙向搜索模塊300 ;如果寄存器appear [i]=0,則未出現(xiàn)過,執(zhí)行第二雙向搜索模塊400,其中appear [i]代表以ASC II表中數(shù)字i代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí);第一雙向搜索模塊300,在段內(nèi)進(jìn)行雙向搜索,獲得所述后綴在所述后綴鏈表中的位置,然后執(zhí)行后綴排序模塊500 ;第二雙向搜索模塊400,在后綴鏈表中進(jìn)行雙向搜索,搜索到離所述后綴最近的在所述后綴鏈表中存在的段,根據(jù)所述段獲得所述后綴在所述后綴鏈表中的位置,其中所述段是以相同元素開頭的后綴按從小到大順序組成的序列,然后執(zhí)行后綴排序模塊500 ;插入后綴模塊500,將所述后綴插入后綴鏈表:將所述后綴的段的高地址上的所有后綴右移一位,這樣所述高地址所在的位置就空出來了,然后在所述高地址后綴所在的位置上插入所述后綴,然后執(zhí)行更新模塊600 ;更新模塊600,更新所述后綴鏈表以及段的信息,其中所述后綴鏈表由后綴段組成,并按照段首元素從小到大順序排列的,所述段首元素是每個(gè)段里面后綴的開頭元素。進(jìn)一步的,所述第一雙向搜索模塊300包括:后綴搜索模塊,找到段頭、段尾位置對應(yīng)的兩個(gè)后綴;比較模塊,分別將段頭和段尾對應(yīng)的后綴記為Sm、Sn,并與所述后綴Si進(jìn)行大小比較,如果Si〈Sn或者SPSm,則執(zhí)行記錄位置模塊;如果SjS^Sm,則執(zhí)行替換比較模塊;替換比較模塊,找到Sm、Sn指向段內(nèi)方向的相鄰的兩個(gè)后綴,將Sm、Sn替換為這兩個(gè)后綴,再與Si進(jìn)行大小比較,如果Si〈Sn或者SASni,則執(zhí)行記錄位置模塊;如果S1^SZSni,則執(zhí)行比較模塊;記錄位置模塊,結(jié)束雙向搜索,記錄Si位置,如果Si〈Sn,則Si的位置在近的低地址,SPSm,則Si的位置在Sm鄰近的高地址,其中所述段頭段尾分別是段里面的最小后綴和最大后綴。進(jìn)一步的,所述第二雙向搜索模塊400包括:初始化處理模塊,令控制參數(shù)k自增1,第一次執(zhí)行初始化處理模塊的時(shí)候初始化k 為 O,然后查看 appear [i+k]和 apprear [1-k],如果 appear [i+k] =1 或者 appear [1-k] =1,結(jié)束雙向搜索,然后執(zhí)行位置確定模塊;如果appear [i+k]=0并且appear [1-k] = O,則重復(fù)執(zhí)行初始化處理模塊,其中appear[i+k]和apprear[i_k]分別代表以ASC II表中數(shù)字i+k和1-k代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí);位置確定模塊,如果appear [i+k] = 1,則Si的位置在以元素i+k為段首元素的段的段尾鄰近的低地址;如果appear [1-k] = 1,則Si的位置在以元素i_k為段首元素的段的段頭鄰近的高地址,其中appear [i+k]和apprear [i_k]分別代表以ASC II表中數(shù)字i+k和1-k代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí)。進(jìn)一步的,所述更新模塊600包括:判斷執(zhí)行模塊,如果上一個(gè)模塊是第一雙向搜索模塊,則執(zhí)行信息處理模塊;如果上一個(gè)模塊是第二雙向搜索模塊,則執(zhí)行信息修改模塊;信息修改模塊,將這個(gè)段的存在信息改為已經(jīng)存在,即令appear[i]=l,同時(shí)把max[i]的值min[i]都置為Si在后綴鏈表中的地址,;信息處理模塊,更新相應(yīng)段的max[i]以及min[i]信息,并將段頭段尾中存放的地址加1,其中所述相應(yīng)段指的是斷首元素大于或者等于后綴Si的開頭元素的段,min[i]記錄以ASC II表中數(shù)字i代表的元素為段首元素的段尾對應(yīng)的后綴在后綴鏈表中的地址,max[i]記錄以ASC II表中數(shù)字i代表的元素為段首元素的段頭對應(yīng)的后綴在后綴鏈表中的地址。進(jìn)一步的,所述后綴鏈表里的后綴都是成段出現(xiàn)的,而且每一段的段首元素是按字典序從小到大排列的。圖1為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中定義的后綴鏈表。對于一個(gè)含有N個(gè)元素的待變換序列X=X1X2……χΝ,其子序列XiXi+1……~稱為后綴Si,為了得到這個(gè)序列的BWT結(jié)果,需要對這個(gè)序列的所有后綴進(jìn)行大小比較,并且按照從小到大的順序排列,后綴鏈表用來存放已經(jīng)按照從小到大的順序排列好的后綴在待變換序列中的地址,對于長度為N的待變換序列,需要N個(gè)單元來存在序列的N個(gè)后綴,每個(gè)單元里面存放的是對應(yīng)后綴在原序列中的地址。從序列X的最后一個(gè)后綴Sn開始往前一直到第一個(gè)后綴S1,每次將一個(gè)后綴插入到后綴鏈表中的對應(yīng)位置。在所有的后綴都插入到后綴鏈表之后,將每個(gè)后綴用它在原序列里面的前一個(gè)元素替代(例如Si就用Xp1替代),這時(shí)得到的就是BWT變換的結(jié)果。需要注意的是,要這樣的方法得到BWT結(jié)果的前提是xN必須是X里面字典序最大的元素,即在寫程序的時(shí)候默認(rèn)序列的最后一個(gè)元素的字典序最大即可。通過分析可以知道后綴鏈表有以下特點(diǎn):由以不同元素開頭的后綴段組成;而且是按照段首元素從小到大順序排列的,其中段i表示以元素i為段首元素的段;圖2為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中在后綴鏈表中以元素i為段首元素的段的結(jié)構(gòu)。其中,段首元素:指的是每個(gè)段里面后綴的開頭元素(例如后綴Si的開頭元素就是Xi);假設(shè)段里面總共有k個(gè)后綴,它們是按照從小到大順序排列的,其中最左邊的后綴最小,為段尾,最右邊的后綴最大,為段頭,相應(yīng)單元存放的是該后綴在待變換序列中的地址。其在后綴鏈表中的地址存放在max[i]中;對后綴鏈表進(jìn)行分析,可以發(fā)現(xiàn)在后綴鏈表里面的已經(jīng)排好序后綴都是成段出現(xiàn)的,而且每一段的段首元素是按字典序從小到大排列的。所以記錄下這幾個(gè)信息會(huì)使排序過程更快,效率更高。圖3為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中段信息是否出現(xiàn)的信息。在將一個(gè)新的后綴Si插入后綴鏈表時(shí),首先需要判斷以Xi為段首元素的段在后綴鏈表中是否已經(jīng)存在,如果已經(jīng)存在,則根據(jù)該段的段頭跟段尾的信息使來找到該段在后綴鏈表中的位置,然后通過雙向搜索方法在這個(gè)段內(nèi)找到Si在后綴鏈表中對應(yīng)的位置;如果不存在,則需要在后綴鏈表中已經(jīng)出現(xiàn)過的段當(dāng)中找到段首元素距離Xi最近的那個(gè)段,這樣就能根據(jù)情況確定下來Si在后綴鏈表中的位置。針對可能出現(xiàn)的256個(gè)段,分別給出I比特存放這個(gè)信息,其中appear [i]=l表示以ASC II表中數(shù)字i代表的元素為段首元素的段已經(jīng)出現(xiàn),appear [i]=0表示以ASC II表中數(shù)字i代表的元素為段首元素的段還沒有出現(xiàn)。圖4為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中段頭段尾信息。其中min[i]記錄以ASC II表中數(shù)字i代表的元素為段首元素的段的段尾信息,也就是段尾對應(yīng)的后綴在后綴鏈表中的地址,max[i]記錄以ASC II表中數(shù)字i代表的元素為段首元素的段的段頭信息,也就是段頭對應(yīng)的后綴在后綴鏈表中的地址。圖5為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中對后綴進(jìn)行排序的流程圖100 (假設(shè)需要進(jìn)行排序的后綴是Si,其開頭元素是Xi,對應(yīng)的ASC II值為i),包括:步驟102,獲取新后綴Si,依次從待變換序序列中取出每次需要排序的后綴;步驟104,判斷段是否出現(xiàn),用于判斷以Si的開頭元素Xi為斷首元素的段在后綴鏈表中是否已經(jīng)出現(xiàn)過,其中Xi的ASC II值為i,并根據(jù)結(jié)果決定下一個(gè)步驟;例如,如果appear [i]=l,則執(zhí) 行雙向搜索步驟;如果appear [i]=0,則執(zhí)行雙向查找最近段步驟;步驟106,雙向搜索,用于在段內(nèi)利用雙向搜索方法確定Si在后綴鏈表中的位置;步驟108,雙向查找最近段,用于找到離Si最近的已經(jīng)在后綴鏈表中出現(xiàn)過的段,然后根據(jù)情況確定Si在后綴鏈表中的位置;步驟110,更新后綴鏈表,用于在確定Si在后綴鏈表中的位置之后,更新后綴鏈表以及相應(yīng)段的信息,包括段是否出現(xiàn)信息,段頭段尾信息。圖6為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中雙向搜索106的具體步驟,包括:步驟1060,找到段頭、段尾位置對應(yīng)的兩個(gè)后綴,根據(jù)段頭段尾記錄下的地址,在后綴鏈表中找到該地址單元存放的數(shù)據(jù),這個(gè)數(shù)據(jù)就是對應(yīng)的后綴在待變換序列中的地址,根據(jù)這個(gè)地址從待變換序列中找到后綴,即sik、Sil,并且分別將段頭和段尾對應(yīng)的后綴記為sm、Sn,同時(shí)與Si進(jìn)行大小比較,根據(jù)比較結(jié)果決定下一步驟是什么:如果Si〈Sn或者SPSm,則執(zhí)行步驟1064 ;如果SJS^Sm,則執(zhí)行步驟1062 ;步驟1062,找到Sm、Sn指向段內(nèi)方向的相鄰的兩個(gè)后綴(如果當(dāng)前的S1^ Sn分別是Sn、Si (k+1-t), 則其相鄰的兩個(gè)后綴分別是Si
(t+1)、Si(k-t)),
將5111、511替換為這兩個(gè)后綴,再同時(shí)與Si進(jìn)行大小比較,根據(jù)比較結(jié)果決定下一步驟是什么:如果SiGn或者SiWm,則執(zhí)行步驟1064 ;如果SJS^Sm,則執(zhí)行步驟1062 ;步驟1064,結(jié)束雙向搜索,記錄Si位置,由步驟1060以及1062的結(jié)果可知此時(shí)Si〈Sn或者SPSm,如果Si〈Sn,則可以確定Si的位置在Sn鄰近的低地址;如果SPSm,則可以確定Si的位置在Sni鄰近的高地址。圖7為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中雙向查找最近段108的具體步驟,包括:步驟1080,在雙向查找最近段的過程中時(shí),需要用一個(gè)參數(shù)k來控制查找對象,第一次執(zhí)行步驟1080時(shí)令k=0,步驟1080首先需要做的就是讓參數(shù)k自增1,然后查看appear [i+k]和apprear [i_k],根據(jù)結(jié)果確定下一個(gè)步驟是什么,如果appear [i+k] =1或者appear[1-k]=l,說明最近的段已經(jīng)找到,這時(shí)應(yīng)該結(jié)束雙向查找最近段的過程,執(zhí)行步驟1082 ;如果appear [i+k] = O并且appear [i_k] = O,說明沒找到最近的段,還需要繼續(xù)查找,執(zhí)行步驟1080 ;步驟1082,在步驟1080中找到最近的段之后,接下來需要根據(jù)查找的結(jié)果記錄Si的位置,如果appear [i+k] = 1,則可以確定Si的位置在以元素i+k為段首元素的段的段尾鄰近的低地址;如果appear [1-k] =1,則可以確定Si的位置在以元素i_k為段首元素的段的段頭鄰近的高地址。圖8為本發(fā)明提供的一種BWT實(shí)現(xiàn)方法中更新后綴鏈表110的具體步驟,包括:步驟1100,高地址后綴右移一位,如圖9所示,假設(shè)Si的位置在Siω和Si(t+1)之間,為了插入Si,我們需要把后綴鏈表中從si(t+n開始,一直到后綴鏈表的尾部的所有后綴全部往后面移動(dòng)一位,從而將原本si(t+1)所在的位置空出來;步驟1102,在原本Si(t+1)所在的位置上插入Si ;步驟1104,判斷上一個(gè)步驟是什么,并且根據(jù)判斷結(jié)果決定下一個(gè)步驟:如果上一個(gè)步驟是106,則執(zhí)行步驟1108 ;如果上一個(gè)步驟是108,則執(zhí)行步驟1106 ;步驟1106,因?yàn)樯弦粋€(gè)步驟是108,說明Si所在的段在后綴鏈表中沒有出現(xiàn)過,Si是這個(gè)段中第一個(gè)出現(xiàn)的后綴,這時(shí)需要把這個(gè)段的存在信息改為已經(jīng)存在,即令appear [i]=l,同時(shí)把max[i]的值min[i]都置為Si在后綴鏈表中的地址;步驟1108,更新相應(yīng)段的max以及min信息,如圖9所示,所有比Si大的后綴都往右移了一位,Si所在段的段頭與比SiK在的段大的段的段頭段尾都往右移了一位,所以需要把這些段頭段尾中存放的地址加I。在對待變換序列中的所有后綴都用本發(fā)明提供的方法插入后綴鏈表之后,再將后綴鏈表中的所有后綴有它們在待變換序列中的前面一個(gè)元素替代,得到的結(jié)果就是待變換序列的BWT變換結(jié)果。參考前述本發(fā)明的描述,本領(lǐng)域技術(shù)人員可以知曉本發(fā)明具有以下優(yōu)點(diǎn):本發(fā)明提供了一種BWT實(shí)現(xiàn)方法,該方法可應(yīng)用于Bzip2壓縮算法核心組成部分BffT變換算法中,在用硬件實(shí)現(xiàn)BWT變換時(shí),使用這個(gè)方法有以下優(yōu)點(diǎn):算法流程簡單,計(jì)算復(fù)雜度不大;變換速度快,通過對一些信息的記錄省去了很多不必要的操作;消耗的資源比較合理,克服了 BWT原理算法消耗資源多的缺點(diǎn)。本發(fā)明提供了一種BWT實(shí)現(xiàn)方法,通過適當(dāng)?shù)母倪M(jìn)和結(jié)構(gòu)變化,該系統(tǒng)和方法也可用于其它含有BWT相同或相似算法的應(yīng)用中。盡管本發(fā)明此處具體化了方法的描述,然而本發(fā)明不限制于所示出的細(xì)節(jié),因?yàn)樵诓黄x本發(fā)明的精神以及在權(quán)利要求的范圍和等同范圍內(nèi),可以作出多種改進(jìn)和結(jié)構(gòu)變化。因此,寬范圍地并且如權(quán)利要求中所闡明的在某種意義上與本發(fā)明的范圍一致地解釋附加的權(quán)利要求是適當(dāng)?shù)摹?br>
本發(fā)明提到的方法中包括雙向搜索查找Si在后綴鏈表中的位置,在將Si插入后綴鏈表的過程中,如果以Xi作為段首元素的段在后綴鏈表中已經(jīng)存在,接下來需要通過該段的段頭段尾確定該段在后綴鏈表中的位置,然后以段頭段尾為起始地址,從兩個(gè)方向上分別拿Si跟段內(nèi)的后綴進(jìn)行大小比較,無論哪個(gè)方向上找到Si的位置,都會(huì)給出一個(gè)信號(hào)來結(jié)束查找過程。本發(fā)明提到的方法中包括雙向查找最近的段,在插入Si的過程中,如果以Xi作為段首元素的段在后綴鏈表中不存在,則需要在后綴鏈表中已經(jīng)出現(xiàn)過的段當(dāng)中找到段首元素距離Xi最近的那個(gè)段,假設(shè)Xi的ASC II值為i,這時(shí)需要從兩個(gè)方向依次判斷以i+k和1-k (k=l,2,3……)為段首元素的段是否已經(jīng)出現(xiàn)過,第一個(gè)符合條件的段就是離Si最近的段,然后根據(jù)該段的段頭段尾確定該段在后綴鏈表中的位置,然后根據(jù)段首元素的大小關(guān)系既可以確定Si在后綴鏈表中的位直。本發(fā)明中提到的方法中包括后綴鏈表的更新,在找到Si在后綴鏈表中的位置之后,需要將這個(gè)后綴插入到后綴鏈表對應(yīng)的位置,這時(shí)需要將后綴鏈表中這個(gè)位置后面的所有后綴全部往后移動(dòng)一位,再將這個(gè)后綴插入到該位置。由于這些后綴都移動(dòng)了位置,后綴鏈表上的對應(yīng)位置存放的地址需要更新,所以需要將移動(dòng)過的后綴對應(yīng)的段的屬性,即段頭段尾信息進(jìn)行更新,另外如果是新的段,還需要將這個(gè)段的存在屬性改成已存在。本發(fā)明中提到的方法算法復(fù)雜度不高,條理清晰,適合硬件實(shí)現(xiàn),比起其他方法,可以大大提高后綴排序的效率,資源的消耗也比較合理,對于一個(gè)長度為N的序列,用本發(fā)明提出的方法主要消耗的存儲(chǔ)資源是(9+[1g2N])*N+512*([1g2N]+1)比特。本發(fā)明提出了一種BWT硬件實(shí)現(xiàn)方法,該方法可應(yīng)用于Bzip2壓縮算法的核心組成部分BWT變換算法中,通過這個(gè)方法,可以有效的減少BWT變換的時(shí)間、消耗的資源以及算法復(fù)雜度。當(dāng)然,通過適當(dāng)?shù)母倪M(jìn)和結(jié)構(gòu)變化,該方法也可用于其它含有BWT變換相同或相似算法的應(yīng)用中?,F(xiàn)舉一個(gè)具體的例子,考慮一個(gè)含有N個(gè)元素的序列X=X1X2……xN,其子序列xixi+1……%稱為后綴Si, 這樣整個(gè)序列會(huì)有N個(gè)后綴,將這些后綴按照從小到大的順序排列(這里由于默認(rèn)最后一個(gè)元素的字典序最大,所有的后綴都能被唯一排序),得到一個(gè)所有后綴組成的序列,將這個(gè)序列中的每個(gè)后綴用它在原序列里面的前一個(gè)元素替換(即Si用Xp1替換),這樣最后得到的序列即為序列X的BWT變換結(jié)果。由此可以看出BWT變換的速度和消耗的資源取決于后綴排序算法的好壞。假設(shè)有后綴Si與Sp比較其大小首先需要比較Xi與比較法則如下:如果Xi>Xj,則 SiSSj ;如果Xi〈Xj,則 SiGj ;如果Xi=Xj,則比較 xi+1 與 xj+1 ;這樣一直比較下去,直到分出大小,如果直到較短的那個(gè)后綴的最后一個(gè)元素仍然沒有分出大小,則默認(rèn)較長的那個(gè)后綴要大??梢钥闯龊缶Y之間的排序?qū)嶋H上就是元素字典序大小的比較。基本算法:從Sn開始往前,一直到S1,每次處理一個(gè)后綴,處理過程就是用當(dāng)前需要處理的后綴Si和后綴鏈表中的后綴序列按從小到大的方向分別逐個(gè)進(jìn)行大小的比較,直到找到這個(gè)后綴在后綴鏈表中的位置,將這個(gè)后綴插入后綴鏈表的這個(gè)位置,并且在這個(gè)位置上記下這個(gè)后綴在原序列中的地址,然后再進(jìn)行下一個(gè)后綴的處理。雙向算法:在基礎(chǔ)算法的思想上,可以加上另外一個(gè)方向的比較,即用當(dāng)前需要處理的后綴和后綴鏈表中按從大到小的方向分別逐個(gè)進(jìn)行大小的比較,兩個(gè)方向并行處理,任何一個(gè)方向上找到對應(yīng)位置時(shí)會(huì)給出一個(gè)信號(hào),來終止本次處理過程,然后再將此后綴插入到后綴鏈表中,這樣會(huì)大大減少這個(gè)過程所需的時(shí)間。通過對后綴鏈表特點(diǎn)的分析,可以發(fā)現(xiàn)在后綴鏈表里面的已經(jīng)排好序后綴都是成段出現(xiàn)的,而且每一段的段首元素是按字典序從小到大排列的。從后綴大小比較的法則可以看出,后綴大小的比較實(shí)際上就是元素大小的比較,所以只需要對后綴中的每個(gè)元素進(jìn)行比較即可,由于文件都會(huì)以ASC II的形式給出,所以可以把所有后綴根據(jù)它們的開頭元素分為256段,用本發(fā)明中提到的方法進(jìn)行排序工作需要5個(gè)寄存器來存放相應(yīng)的信息:memo,位寬為8,深度為N,用于存放長度為N的待變換序列;suffix_list,位寬為[log2N]+l,深度為N,用來存放排好序之后的后綴,每個(gè)位置上存放的是對應(yīng)位置上的后綴在原序列中的地址來,這里假設(shè)小的后綴放在絕對值小的位置上,排序時(shí)從低位置往高位置移動(dòng),即先進(jìn)來已經(jīng)排好序的后綴序列從sUffiX_list的最低位置依次連續(xù)往后存放,當(dāng)找到新后綴Si的位置時(shí),則將后綴鏈表中所有比Si大的后綴全部往后移一位,然后插入Si,初始化全為O ;max,位寬為[1g2N]+1,深度為256,max[i]表示后綴鏈表中以ASC II表中數(shù)字i代表的兀素開頭的所有后綴中最大的那個(gè)后綴的在suffix_list中的地址,初始化全為O ;min,位寬為[1g2N]+1,深度為256,min[i]表示后綴鏈表中以ASC II表中數(shù)字i代表的兀素開頭的所有后綴中最小的那個(gè)后綴的在suffix_list的地址,初始化全為O ;appear,位寬為I,深度為256,appear[i] =1表示以ASC II表中數(shù)字i代表的元素為段首元素的段已經(jīng)出現(xiàn)過;appear[i]=0表示以ASC II表中數(shù)字i代表的元素為段首元素的段還沒有出現(xiàn)過,初始化全為O。對后綴Si進(jìn)行排序的步驟如下:步驟1,判斷以Xi為段首地址的段是否出現(xiàn)過,假設(shè)Xi的ASC II值為i,則要判斷appear [i]的值,如果appear [i]=l,則執(zhí)行步驟2 ;如果appear [i] =0,則執(zhí)行步驟3 ;步驟2,根據(jù)max[i]以及min[i]找到對應(yīng)段的位置,接下來則以max[i]和min[i]為起始地址從兩個(gè)方向上讓Si與段中的后綴逐個(gè)進(jìn)行比較得到Si的具體位置,將suffix_list中比Si大的后綴全部往后移動(dòng)一位,再插入S”接下來還要更新max和min,即將min[i]以及所有的 max [k]、min [k] (i〈k〈256)加 I;步驟3,從兩個(gè)方向依次判斷appear[i+k]和appear[i_k]的值(k=l,2,3......),
直到找到最近的出現(xiàn)過的段,然后根據(jù)情況找到Si的具體位置,插入Si,更新suff ix_list,接下來更新相應(yīng)的max, min,同時(shí)令appear [i]=l。根據(jù)這個(gè)步驟對所有后綴都插入到后綴鏈表之后,接下來需要將后綴鏈表中的所有后綴用它們在原序列中的前一個(gè)元素代替,即可得到BWT變換的輸出。當(dāng)然,本發(fā)明還可有其它多種實(shí)施例,在不背離本發(fā)明精神及其實(shí)質(zhì)的情況下,熟悉本領(lǐng)域的技術(shù)人員當(dāng)可根據(jù)本發(fā)明作出各種相應(yīng)的改變和變形,但這些相應(yīng)的改變和變形都應(yīng)屬于本發(fā)明所附的權(quán)利要求的保護(hù)范圍。
權(quán)利要求
1.一種BWT實(shí)現(xiàn)方法中對后綴進(jìn)行排序的方法,其特征在于,包括: 步驟1,從BWT的待變換序列中取出需要排序的后綴; 步驟2,判斷以所述后綴的開頭元素的,作為斷首元素的段在后綴鏈表中是否出現(xiàn)過,所述后綴的開頭元素的ASC II值為i,如果寄存器appear[i]=l,則出現(xiàn)過,執(zhí)行步驟3 ;如果寄存器appear[i] = I,則未出現(xiàn)過,執(zhí)行步驟4,其中appear [i]代表以ASC II表中數(shù)字i代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí); 步驟3,在段內(nèi)進(jìn)行雙向搜索,獲得所述后綴在所述后綴鏈表中的位置,然后執(zhí)行步驟5 ; 步驟4,在所述后綴表中進(jìn)行雙向搜索,搜索到離所述后綴最近的在所述后綴鏈表中存在的段,根據(jù)所述段獲得所述后綴在所述后綴鏈表中的位置,其中所述段是以相同元素開頭的后綴按從小到大順序組成的序列,然后執(zhí)行步驟5 ; 步驟5,將所述后綴插入后綴鏈表:將所述后綴的段的高地址上所有后綴右移一位,將所述高地址所在的位置空出,然后在所述高地址后綴所在的位置上插入所述后綴,然后執(zhí)行步驟6 ; 步驟6,更新所述后綴鏈表以及段的信息,其中所述后綴鏈表由后綴段組成,并按照段首元素從小到大順序排列的,所述段首元素是每個(gè)段里面后綴的開頭元素。
2.如權(quán)利要求1所述的對后綴進(jìn)行排序的方法,其特征在于,所述步驟3包括: 步驟31,找到段頭、段尾位置對應(yīng)的兩個(gè)后綴; 步驟32,分別將段頭和段尾對應(yīng)的后綴記為Sm、Sn,并與所述后綴Si進(jìn)行大小比較,如果SiGn或者SiWm,則執(zhí)行步驟34 ;如果SJS^Sm,則執(zhí)行步驟33 ; 步驟33,找到Sm、Sn指向段內(nèi)方向的相鄰的兩個(gè)后綴,將Sm、Sn替換為這兩個(gè)后綴,再與Si進(jìn)行大小比較,如果SiGn或者SiWm,則執(zhí)行步驟34 ;如果SJS^Sm,則執(zhí)行步驟32 ; 步驟34,結(jié)束雙向搜索,記錄Si位置,如果SZSn,則Si的位置在SdP近的低地址,SiSSm,則Si的位置在Sm鄰近的高地址,其中所述段頭段尾分別是段里面的最小后綴和最大后綴。
3.如權(quán)利要求1所述的對后綴進(jìn)行排序的方法,其特征在于,所述步驟4包括: 步驟41,令控制參數(shù)k自增1,第一次執(zhí)行步驟41的時(shí)候初始化k為O,然后查看appear[i+k]和 apprear[i_k],如果 appear[i+k] =1 或者 appear[i_k]=l,結(jié)束雙向查找,然后執(zhí)行步驟42 ;如果appear [i+k] =O并且appear [i_k] =0,則重復(fù)步驟41,其中appear [i+k]和apprear [i_k]分別代表以ASC II表中數(shù)字i+k和i_k代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí); 步驟42,如果appear [i+k]=l JlJSi的位置在以元素i+k為段首元素的段的段尾鄰近的低地址;如果appear [1-k] = 1,則Si的位置在以元素i_k為段首元素的段的段頭鄰近的高地址。
4.如權(quán)利要求1所述的對后綴進(jìn)行排序的方法,其特征在于,所述步驟6包括: 步驟61,如果上一個(gè)步驟是步驟3,則執(zhí)行步驟63 ;如果上一個(gè)步驟是步驟4,則執(zhí)行步驟62 ; 步驟62,將這個(gè)段的存在信息改為已經(jīng)存在,令appear [i]=l,同時(shí)把max[i]的值min[i]都直為Si在后綴鏈表中的地址; 步驟63,更新相應(yīng)段的max[i]以及min[i]信息,將段頭段尾中存放的地址加1,其中所述相應(yīng)段指的是斷首元素大于或者等于后綴Si的開頭元素的段,min[i]記錄以ASC II表中數(shù)字i代表的元素為為段首元素的段尾對應(yīng)的后綴在后綴鏈表中的地址,max[i]記錄以ASC II表中數(shù)字i代表的元素為為段首元素的段頭對應(yīng)的后綴在后綴鏈表中的地址。
5.如權(quán)利要求1所述的對后綴進(jìn)行排序的方法,其特征在于,所述后綴鏈表里的后綴都是成段出現(xiàn)的,而且每一段的段首元素是按字典序從小到大排列的。
6.一種BWT實(shí)現(xiàn)方法中對后綴進(jìn)行排序的系統(tǒng),其特征在于,包括: 提取I吳塊,從BWT的待變換序列中取出需要排序的后綴; 處理模塊,判斷以所述后綴的開頭元素作為斷首元素的段在后綴鏈表中是否出現(xiàn)過,所述后綴的開頭元素的ASC II值為i,如果寄存器appear[i]=l,則出現(xiàn)過,執(zhí)行第一雙向搜索模塊;如果寄存器appear[i]=0,則未出現(xiàn)過,執(zhí)行第二雙向搜索模塊,其中appear[i]代表以ASC II表中數(shù)字i代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí); 第一雙向搜索模塊,在段內(nèi)進(jìn)行雙向搜索,獲得所述后綴在所述后綴鏈表中的位置,然后執(zhí)行后綴排序t吳塊; 第二雙向搜索模塊,在所述后綴鏈表中進(jìn)行雙向搜索,搜索到離所述后綴最近的在所述后綴鏈表中存在的段 ,根據(jù)所述段獲得所述后綴在所述后綴鏈表中的位置,其中所述段是以相同元素開頭的后綴按從小到大順序組成的序列,然后執(zhí)行后綴排序模塊; 插入后綴I旲塊,將所述后綴插入后綴鏈表:將所述后綴的段的聞地址上的所有后綴右移一位,將所述高地址所在的位置空出,然后在所述高地址后綴所在的位置上插入所述后綴,然后執(zhí)行更新模塊; 更新模塊,更新所述后綴鏈表以及段的信息,其中所述后綴鏈表由后綴段組成,并按照段首元素從小到大順序排列的,所述段首元素是每個(gè)段里面后綴的開頭元素。
7.如權(quán)利要求6所述的對后綴進(jìn)行排序的系統(tǒng),其特征在于,所述第一雙向搜索模塊包括: 后綴搜索模塊,找到段頭、段尾位置對應(yīng)的兩個(gè)后綴; 比較模塊,分別將段頭和段尾對應(yīng)的后綴記為sm、Sn,并與所述后綴Si進(jìn)行大小比較,如果Si〈Sn或者SPSm,則執(zhí)行記錄位置模塊;如果SjS^Sm,則執(zhí)行替換比較模塊; 替換比較模塊,找到sm、Sn指向段內(nèi)方向的相鄰的兩個(gè)后綴,將Sm、Sn替換為這兩個(gè)后綴,再與Si進(jìn)行大小比較,如果Si〈Sn或者SPSm,則執(zhí)行記錄位置模塊;如果SJS^Sm,則執(zhí)行比較模塊; 記錄位置模塊,結(jié)束雙向搜索,記錄Si位置,如果Si〈Sn,則Si的位置在Sn鄰近的低地址,SPSm,則Si的位置在Sm鄰近的高地址,其中所述段頭段尾分別是段里面的最小后綴和最大后綴。
8.如權(quán)利要求6所述的對后綴進(jìn)行排序的系統(tǒng),其特征在于,所述第二雙向搜索模塊包括: 初始化處理模塊,令控制參數(shù)k自增1,第一次執(zhí)行初始化處理模塊的時(shí)候初始化k為O,然后查看 appear [i+k]和 apprear [i_k],如果 appear [i+k] =1 或者 appear [i_k]=l,結(jié)束雙向搜索,然后執(zhí)行位置確定模塊;如果appear [i+k]=0并且appear [i_k] =0,則重復(fù)執(zhí)行初始化處理模塊,其中appear[i+k]和apprear[i_k]分別代表以ASC II表中數(shù)字i+k和1-k代表的元素為段首元素的段是否已經(jīng)出現(xiàn)過的標(biāo)識(shí);位置確定模塊,如果appear [i+k] = 1,則Si的位置在以元素i+k為段首元素的段的段尾鄰近的低地址;如果appear [1-k] = I,則Si的位置在以元素i_k為段首元素的段的段頭鄰近的聞地址。
9.如權(quán)利要求6所述的對后綴進(jìn)行排序的系統(tǒng),其特征在于,所述更新模塊包括: 判斷執(zhí)行模塊,如果上一個(gè)模塊是第一雙向搜索模塊,則執(zhí)行信息處理模塊;如果上一個(gè)模塊是第二雙向搜索模塊,則執(zhí)行信息修改模塊; 信息修改模塊,將這個(gè)段的存在信息改為已經(jīng)存在,令appear [i]=l,同時(shí)把max [i]的值min[i]都直為Si在后綴鏈表中的地址; 信息處理模塊,更新相應(yīng)段的max [i]以及min[i]信息,并將段頭段尾中存放的地址加1,其中所述相應(yīng)段指的是斷首元素大于或者等于后綴Si的開頭元素的段,min[i]記錄以元素i為段首元素的段尾對應(yīng)的后綴在后綴鏈表中的地址,max[i]記錄以元素i為段首元素的段頭對應(yīng)的后綴在后綴鏈表中的地址。
10.如權(quán)利要求6所述的對后綴進(jìn)行排序的系統(tǒng),其特征在于,所述后綴鏈表里的后綴都是成段出現(xiàn)的,而且每一段 的段首元素是按字典序從小到大排列的。
全文摘要
本發(fā)明提供一種BWT實(shí)現(xiàn)方法中對后綴進(jìn)行排序的方法及系統(tǒng),通過對需要排序的后綴通過雙向搜索,獲得后綴位置,對所述后綴進(jìn)行排序并進(jìn)行信息更新的方式,通過在變換時(shí)間和資源消耗上的平衡,解決了原始BWT變換方法消耗資源大、壓縮率低的問題。本發(fā)明能實(shí)現(xiàn)數(shù)據(jù)壓縮速度快、簡單,且使用資源比較合理,能節(jié)省大量資源。
文檔編號(hào)G06F9/38GK103117748SQ20131003368
公開日2013年5月22日 申請日期2013年1月29日 優(yōu)先權(quán)日2013年1月29日
發(fā)明者俞健康, 侯銳, 張繼璠, 龍冰潔, 李冰 申請人:中國科學(xué)院計(jì)算技術(shù)研究所