一種大規(guī)模字符串文本的后綴索引構(gòu)造方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及后綴索引構(gòu)造技術(shù)領(lǐng)域,尤其涉及一種利用計(jì)算機(jī)外存來(lái)構(gòu)造大規(guī)模字符串文本后綴索引的方法及裝置。
【背景技術(shù)】
[0002]后綴索引,也稱為后綴數(shù)組(suffix array),是計(jì)算機(jī)科學(xué)中的一個(gè)重要數(shù)據(jù)結(jié)構(gòu),具有結(jié)構(gòu)緊湊且空間占用小的特點(diǎn),在全文檢索、數(shù)據(jù)壓縮、基因序列對(duì)齊和模式匹配等諸多領(lǐng)域具有廣泛應(yīng)用。任意給定一個(gè)字符串文本,簡(jiǎn)稱為字符串,從字符串中的任意位置開(kāi)始到該字符串結(jié)尾的所有字符組成一個(gè)字符子串,該子串稱為字符串的后綴(suffix)。顯然,長(zhǎng)度為η的字符串包含η個(gè)后綴,對(duì)這η個(gè)后綴按字典順序升序保存在一個(gè)整型數(shù)組中,該數(shù)組則稱為字符串的后綴索引。
[0003]傳統(tǒng)構(gòu)造后綴索引技術(shù)需要把所有文本全部加載至內(nèi)存,然后才能進(jìn)行后綴索引構(gòu)造。但近年來(lái),基因數(shù)據(jù)庫(kù)、互聯(lián)網(wǎng)文本數(shù)據(jù)以及其它相關(guān)領(lǐng)域的文本數(shù)據(jù)規(guī)模不斷擴(kuò)大,普通計(jì)算機(jī)內(nèi)存已無(wú)法一次性加載全部文本,這些傳統(tǒng)索弓I構(gòu)造技術(shù)顯然已不再適用。
【發(fā)明內(nèi)容】
[0004]本發(fā)明為克服上述現(xiàn)有技術(shù)所述的至少一種缺陷(不足),首先提供一種大規(guī)模字符串文本的后綴索引構(gòu)造方法,使用戶在普通計(jì)算機(jī)環(huán)境下(如:內(nèi)存大小為4G)也能進(jìn)行大規(guī)申吳字符串文本的后綴索引構(gòu)造。
[0005]本發(fā)明的又一目的是提出一種大規(guī)模字符串文本的后綴索引構(gòu)造裝置,其實(shí)現(xiàn)了借助計(jì)算機(jī)外存對(duì)大規(guī)模字符串文本進(jìn)行后綴索引構(gòu)造。
[0006]為了實(shí)現(xiàn)上述目的,本發(fā)明采用如下技術(shù)方案:
一種大規(guī)模文本的后綴索引構(gòu)造方法,所述方法包括:
收縮字符串Τ,得到新的字符串Τ1,Τ1的規(guī)模最多為Τ的一半;
以直接方式或遞歸方式構(gòu)造Τ1的后綴索引;
掃描Τ1的后綴索引,得到Τ的后綴索引。
[0007]其中,所述收縮字符串Τ,得到新的字符串Τ1的具體過(guò)程為:
使用大規(guī)模字符串讀取器分批讀取字符串Τ,獲取Τ中所有LMS子串,壓入外存優(yōu)先級(jí)隊(duì)列容器Q1中。掃描Q1排序L子串,并使用子串命名單元對(duì)L子串和LMS子串進(jìn)行命名,得到的有序L子串存放于外存優(yōu)先級(jí)隊(duì)列容器Q2中。掃描Q2中所有L子串排序S子串,并對(duì)S子串命名,得到有序S子串。提取S子串中所有LMS子串的名字,這些名字按照LMS子串在原字符串中的索引位置升序構(gòu)成新的字符串Τ1 ;
所述LMS子串的識(shí)別方法為,該子串的首字符和尾字符均為L(zhǎng)MS字符,首字符與尾字符之間不存在任何LMS字符;
所述LMS字符的識(shí)別方法為,當(dāng)后綴為L(zhǎng)MS后綴時(shí),則該后綴所對(duì)應(yīng)字符子串的首字符稱為L(zhǎng)MS字符; 所述LMS后綴的識(shí)別方法為,若當(dāng)如后綴為S后綴,且字符串T中與當(dāng)如后綴相鄰的左手邊第一個(gè)后綴為L(zhǎng)后綴,則該后綴為L(zhǎng)MS后綴;
所述L子串的識(shí)別方法為,子串的首字符為L(zhǎng)字符,尾字符為L(zhǎng)MS字符,且首字符與尾字符之間不存在任何LMS字符,則該子串為L(zhǎng)子串;
所述L或S字符的識(shí)別方法為,若某后綴為L(zhǎng)或S后綴,則該后綴所對(duì)應(yīng)字符子串的首字符分別稱為L(zhǎng)或S字符;
所述S子串的識(shí)別方法為,子串的首字符為S字符,尾字符為L(zhǎng)MS字符,且首字符與尾字符之間不存在任何LMS字符,則該子串為S子串;
所述L后綴、S后綴的識(shí)別方法為,先假定字符串最后一個(gè)字符為‘$’,該字符在整個(gè)字符串所包含的字符當(dāng)中最小并且唯一,為S后綴;然后從字符串文本倒數(shù)第二個(gè)字符開(kāi)始往前掃描,若當(dāng)前字符比前一字符小,則該后綴為S后綴;或當(dāng)前字符與前一字符相等且前一字符所對(duì)應(yīng)的后綴為S后綴,則該后綴也為S后綴。除上述兩種情況之外,后綴被識(shí)別為L(zhǎng)后綴。
[0008]其中,所述構(gòu)造字符串T1的后綴索引的過(guò)程為:
若字符串T1中所有字符都唯一,各字符的名稱即為各后綴在后綴索引中的優(yōu)先級(jí)次序,掃描字符串T1,每個(gè)索引位置生成相應(yīng)的二元組:(T[i],i),g卩(字符名稱,位置索引),將這些二元組全部壓入外存排序器,按照字符名稱排序,排序后取各字符對(duì)應(yīng)的索引號(hào)存入數(shù)組,即得到T1的后綴索引,否則以T1為新的字符串輸入?yún)?shù),用遞歸方式構(gòu)造T1的后綴索引。
[0009]其中,所述掃描T1的后綴索引,得到T的后綴索引的過(guò)程為:
使用大規(guī)模字符串讀取器讀取字符串T,識(shí)別其中的LMS后綴,根據(jù)T1的后綴索引,給相應(yīng)的LMS后綴賦予優(yōu)先級(jí),并壓入外存優(yōu)先級(jí)隊(duì)列容器Q1中;
掃描Q1,得到的有序L后綴,L后綴存放于外存優(yōu)先級(jí)隊(duì)列Q2中;
掃描Q2,得到有序S后綴序列;
歸并所有L和S后綴,得到字符串T的后綴索引。
[0010]—種大規(guī)模文本的后綴索引構(gòu)造裝置,所述后綴索引構(gòu)造裝置包括大規(guī)模字符串文本讀取器,后綴前驅(qū)信息處理器,前驅(qū)信息存儲(chǔ)模塊,LMS后綴識(shí)別器,L/S后綴識(shí)別器,子串命名單元,外存優(yōu)先級(jí)隊(duì)列容器,外存排序器和后綴索引存儲(chǔ)模塊;
大規(guī)模字符串讀取器,用于順序讀取外存大規(guī)模字符串文本;
后綴前驅(qū)信息處理器,用于生成字符串文本中各后綴的前驅(qū)信息,并保存至外存容器;
其中,所述后綴前驅(qū)信息為一個(gè)元組,該元組包含了該后綴在字符串中的位置信息,前驅(qū)字符以及前驅(qū)字符距離。這里的前驅(qū)字符為:在字符串T中,后綴i對(duì)應(yīng)的字符為T[i],T[i]左側(cè)第一個(gè)不等于T[i]的字符稱為后綴i的前驅(qū)字符,例如:某后綴與其前驅(qū)字符的距離為“0”,說(shuō)明該后綴左側(cè)第一個(gè)字符為其前驅(qū)字符;
前驅(qū)信息存儲(chǔ)模塊,一種外存容器,用于存放后綴前驅(qū)信息處理器所輸出的各后綴前驅(qū)信息;
外存優(yōu)先級(jí)隊(duì)列容器,用于在外存上對(duì)字符子串或后綴進(jìn)行排序,每次從該隊(duì)列彈出的子串或后綴為當(dāng)如隊(duì)列中最小或最大子串或后綴; L/S后綴識(shí)別器,用于識(shí)別具體的后綴是L還是S后綴;
LMS后綴識(shí)別器,用于識(shí)別具體的后綴是否為L(zhǎng)MS后綴;
子串命名單元,用于索引構(gòu)造過(guò)程中,對(duì)字符子串進(jìn)行命名,以便字符串規(guī)模的收縮; 外存排序器,一種外存容器,可對(duì)存入其中的對(duì)象按照指定關(guān)鍵字排序;
后綴索引存儲(chǔ)模塊,一種外存容器,用于存儲(chǔ)后綴索引。
[0011]與現(xiàn)有技術(shù)相比,本發(fā)明具有以下的優(yōu)點(diǎn)和積極效果:
本發(fā)明在后綴索引構(gòu)造過(guò)程中至少配置大規(guī)模字符串讀取器,后綴前驅(qū)信息處理器,LMS后綴識(shí)別器,兩個(gè)外存優(yōu)先級(jí)隊(duì)列容器和外存排序器。這樣,通過(guò)大規(guī)模字符串讀取器讀取字符串,通過(guò)LMS識(shí)別器識(shí)別字符串中的LMS子串或后綴,通過(guò)外存優(yōu)先級(jí)隊(duì)列容器實(shí)現(xiàn)子串或后綴的排序,最終完成大規(guī)申吳字符串文本的后綴索引構(gòu)造。在索引構(gòu)造過(guò)程中,利用了低成本的計(jì)算機(jī)外存資源,使得后綴索引構(gòu)造不再受限于內(nèi)存容量;從而在任意一臺(tái)普通計(jì)算機(jī)環(huán)境下,本系統(tǒng)能完成超過(guò)該內(nèi)存大小的字符串文本數(shù)據(jù)的后綴索引構(gòu)造,突破了現(xiàn)有后綴索引構(gòu)造技術(shù)方案的局限性。而且,本發(fā)明具有運(yùn)行速度快、I/o量小和簡(jiǎn)單易行等優(yōu)點(diǎn)。
【附圖說(shuō)明】
[0012]圖1為本發(fā)明具體實(shí)施方案的方法流程圖。
[0013]圖2為本發(fā)明的裝置結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0014]附圖僅用于示例性說(shuō)明,不能理解為對(duì)本專利的限制;為了更好說(shuō)明本實(shí)施例,附圖某些部件會(huì)有省略、放大或縮小,并不代表實(shí)際產(chǎn)品的尺寸;
對(duì)于本領(lǐng)域技術(shù)人員來(lái)說(shuō),附圖中某些公知結(jié)構(gòu)及其說(shuō)明可能省略是可以理解的。下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明的技術(shù)方案做進(jìn)一步的說(shuō)明。
[0015]本發(fā)明的基本思想是:將字符串文本中的后綴分為L(zhǎng)后綴和S后綴,先通過(guò)外存優(yōu)先級(jí)隊(duì)列容器排序字符串中的LMS子串;在有序LMS子串的基礎(chǔ)上,推導(dǎo)有序L后綴;在有序L后綴的基礎(chǔ)上,推導(dǎo)有序S后綴;最后以桶為單位,歸并L后綴和S后綴,輸出后綴索引。這里的桶是指:后綴數(shù)組中具有相同首字符的后綴構(gòu)成一塊連續(xù)的區(qū)域,該區(qū)域稱為桶。
[0016]在索引構(gòu)造過(guò)程中,需要隨時(shí)訪問(wèn)后綴的前驅(qū)字符,傳統(tǒng)方法為,將所有字符串全部加載至內(nèi)存,這樣,在索引構(gòu)造過(guò)程中可隨機(jī)訪問(wèn)后綴的前驅(qū)字符;但在字符串規(guī)模較大,遠(yuǎn)遠(yuǎn)超過(guò)內(nèi)存容量的情況下,這種處理辦法已不再適用。
[0017]因此,本發(fā)明預(yù)先產(chǎn)生字符串各后綴的前驅(qū)信息,并對(duì)所有前驅(qū)信息元組排序,預(yù)先存放在外存容器。排序關(guān)鍵字為二元組:后綴的首字符和后綴位置索引,即先按首字符排序,然后按該后綴在源字符串中的位置索引值排序。
[0018]如前所述,具有相同首字符的后綴構(gòu)成一塊連續(xù)的區(qū)域,這個(gè)連續(xù)的區(qū)域稱為桶,在索引構(gòu)造過(guò)程中,也是按桶關(guān)鍵字有序掃描各后綴,因而在掃描過(guò)程中可以僅加載當(dāng)前正在掃描的桶所包含的后綴的前驅(qū)信息,然后通過(guò)位置索引值來(lái)訪問(wèn)具體后綴的前驅(qū)信息,從而完成字符子串或者后綴的排序。
[0019]在索引構(gòu)造過(guò)程當(dāng)中,還需對(duì)L和S子串進(jìn)行命名。命名過(guò)程如下:當(dāng)排序L子串時(shí),定義一個(gè)整型變量i,i初始化為0,每彈出一個(gè)后綴,i增加1。若當(dāng)前子串與前一子串不等,當(dāng)前子串被命名為當(dāng)前變量i的值;若當(dāng)前子串與前一子串相等,則當(dāng)前子串的名字與前一子串相等。排序S子串時(shí),命名方法與排序L子串一樣,同樣需要定義一個(gè)整型變量i,不同的地方是,i初始化為字符串的長(zhǎng)度減1,即n-1,每彈出一個(gè)后綴,i自減1。
[0020]當(dāng)?shù)玫接行騍子串以后,取其中所有LMS子串(LMS子串屬于S子串),統(tǒng)計(jì)LMS子串命名次數(shù),若LMS子串的命名次數(shù)與其數(shù)目一樣,說(shuō)明字符串中各LMS子串是兩兩互異的,LMS子串的名字即為L(zhǎng)MS子串的優(yōu)先級(jí);否則,字符串中存在相等的LMS子串,暫時(shí)無(wú)法確定其所對(duì)應(yīng)的后綴大小關(guān)系;因此,必須提取各LMS子串的名字,按照其所對(duì)應(yīng)的LMS后綴在字符串中的位置索引從小到大排列,構(gòu)成一個(gè)新的字符串,計(jì)算該新字符串各后綴的前驅(qū)信息,排序L和S子串,以遞歸方式計(jì)算LMS子串的優(yōu)先級(jí)次序。
[0021]當(dāng)LMS子串有序,可通過(guò)外存優(yōu)先級(jí)隊(duì)列容器Q1,輸出有序L后綴至Q2 ;然后在有序L后綴的基礎(chǔ)上,通過(guò)Q2,輸出有序S后綴,對(duì)L和S后綴按桶關(guān)鍵字歸并,得到字符串的后綴索引。
[0022]基于以上所述,本發(fā)明實(shí)施例提供了一種通過(guò)計(jì)算機(jī)外存來(lái)構(gòu)造大規(guī)模字符串文本的后綴索引的方法,參見(jiàn)圖1,該方法包括如下步驟:
S101:獲取后綴前驅(qū)信息;