從后往前掃描字符串,若當(dāng)前字符與前一掃描字符不相等,則產(chǎn)生一個前驅(qū)信息元組,將其輸出至外存排序器中;掃描結(jié)束后,對所有前驅(qū)信息先按桶名稱從小到大排序,然后按其在字符串中的位置索引從小到大排序,排序結(jié)果保存在前驅(qū)信息存儲模塊中,這樣,保證了所有前驅(qū)信息元組先按桶名稱有序,再按位置索引有序。
[0023]S102:將所有LMS子串壓入外存優(yōu)先級隊列容器Q1 ;
具體實現(xiàn)時,可以在LMS后綴識別器的支持下,利用大規(guī)模字符串讀取器,從后往前讀取字符串文本,將字符串中所有LMS子串壓入Q1。每個被壓入的LMS子串包含信息有:LMS子串的首字符,該LMS子串所對應(yīng)的后綴,該后綴的類型及后綴在Q1中的插入次序。
[0024]S103:掃描外存容器Q1對L子串排序并命名,并將有序L子串輸入到外存容器Q2 ;
具體實現(xiàn)過程可以為,逐一彈出Q1中的元素,直到Q1為空。若當(dāng)前彈出后綴的前驅(qū)是L后綴,將該前驅(qū)后綴重新壓入Q1 ;同時,若當(dāng)前彈出的后綴為L后綴,則將該L后綴壓入到Q2o
[0025]S104:掃描外存容器Q2對S子串排序并命名,并將S子串中的所有LMS子串的位置索引及其命名信息輸入到外存排序器;
具體實現(xiàn)過程可以為,逐一彈出Q2中的元素,直到隊列為空。若當(dāng)前彈出后綴的直接前驅(qū)是S后綴,則將該前驅(qū)后綴重新壓入Q2 ;同時,若當(dāng)前后綴是LMS后綴,將該LMS后綴及其名字封裝在一起,壓入外存排序器。
[0026]S105:對外存排序器中所有LMS子串按位置索引進(jìn)行升序排序,所有LMS子串的名字構(gòu)成新的字符串T1 ;
S106:根據(jù)字符串T1所包含的字符是否均唯一,以直接或遞歸方式計算新字符串T1的后綴索引;
在這一步,T1規(guī)模為T的一半,若T1所包含的字符沒有重復(fù)字符,則可以直接計算新字符串的后綴索引;否則以T1為輸入字符串,轉(zhuǎn)移到S101執(zhí)行,以遞歸的方式計算T1的后綴索引。
[0027]S107:掃描字符串T及T1的后綴索引,將T中所有LMS后綴及其優(yōu)先級壓入外存優(yōu)先級容器Q1中;這里T1的后綴索引即為T中各LMS后綴的優(yōu)先級;
S108:掃描外存容器Q1,得到有序L后綴,并保存至外存容器Q2 ;
該步驟與步驟S103類似,排序L后綴之前,所有LMS后綴已經(jīng)輸入到Q1中。然后逐一彈出Q1中的元素,查看其前驅(qū)是否為L后綴,若是,則將該前驅(qū)后綴壓入Q1中;同時,若該后綴是L后綴,還必須把該后綴壓入Q2中。與步驟S103所不同的是:本步驟是排序L后綴,不需要做命名操作,而S103是排序L子串,需要對各字符子串命名。當(dāng)容器Q1為空時,得到有序L后綴。
[0028]S109:掃描外存容器Q2,在有序L后綴的基礎(chǔ)上,得到有序的S后綴。
[0029]這一步與步驟S104類似,同樣是逐一彈出Q2中的元素,查看其前驅(qū)是否為S后綴,若是,則將該前驅(qū)后綴其壓入Q2中;同樣,該步驟不需要做命名操作,當(dāng)Q2為空時,得到有序S后綴。
[0030]S110:以桶為單位,歸并L和S后綴,輸出字符串T的后綴索引。
[0031]本發(fā)明實施例還提供了一種通過計算機(jī)外存來構(gòu)造大規(guī)模字符串文本的后綴索引的裝置,如圖2的結(jié)構(gòu)示意圖,包括:
大規(guī)模字符串讀取器1,用于順序讀取外存大規(guī)模字符串文本T ;
后綴前驅(qū)信息處理器2,用于生成字符串文本中各后綴的前驅(qū)信息,并保存至外存容器(即前驅(qū)信息存儲模塊3);
其中,所述后綴前驅(qū)信息為一個元組,該元組包含了該后綴在字符串中的位置信息,前驅(qū)字符以及前驅(qū)字符距離。這里的前驅(qū)字符為:在字符串文本T中,后綴i對應(yīng)的字符為T[i],T[i]左側(cè)第一個不等于T[i]的字符稱為后綴i的前驅(qū)字符,例如:某后綴與其前驅(qū)字符的距離為“0”,說明該后綴左側(cè)第一個字符為其前驅(qū)字符;
前驅(qū)信息存儲模塊3,是一種外存容器,用于存放后綴前驅(qū)信息處理器2所輸出的各后綴前驅(qū)信息;
LMS后綴識別器4,用于識別具體的后綴是否為LMS后綴;
L/S后綴識別器5,用于識別具體的后綴是L還是S后綴;
子串命名單元6,用于在索引構(gòu)造過程中,對字符子串進(jìn)行命名,以便字符串規(guī)模的收縮;
外存優(yōu)先級隊列容器7,包括容器Ql、Q2,用于在外存上對字符子串或后綴進(jìn)行排序,每次從該隊列彈出的子串或后綴為當(dāng)如隊列中最小或最大子串或后綴;
外存排序器8,也是一種外存容器,可對存入其中的對象按照指定關(guān)鍵字排序;
后綴索引存儲模塊9,也是一種外存容器,用于存儲后綴索引。
[0032]顯然,本發(fā)明的上述實施例僅僅是為清楚地說明本發(fā)明所作的舉例,而并非是對本發(fā)明的實施方式的限定。對于所屬領(lǐng)域的普通技術(shù)人員來說,在上述說明的基礎(chǔ)上還可以做出其它不同形式的變化或變動。這里無需也無法對所有的實施方式予以窮舉。凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明權(quán)利要求的保護(hù)范圍之內(nèi)。
【主權(quán)項】
1.一種大規(guī)模文本的后綴索引構(gòu)造方法,其特征在于,所述方法包括: 收縮字符串T,得到新的字符串Tl,T1的規(guī)模最多為T的一半; 以直接方式或遞歸方式構(gòu)造T1的后綴索引; 掃描T1的后綴索引,得到T的后綴索引; 其中,所述收縮字符串T,得到新的字符串T1的具體過程為: 使用大規(guī)模字符串讀取器分批讀取字符串T,獲取T中所有LMS子串,壓入外存優(yōu)先級隊列容器Q1中;掃描Q1排序L子串,并使用子串命名單元對L子串和LMS子串進(jìn)行命名,得到的有序L子串存放于外存優(yōu)先級隊列容器Q2中;掃描Q2中所有L子串排序S子串,并對S子串命名,得到有序S子串;提取S子串中所有LMS子串的名字,這些名字按照LMS子串在原字符串中的索引位置升序構(gòu)成新的字符串T1 ; 所述構(gòu)造字符串T1的后綴索引的過程為: 當(dāng)字符串T1中所有字符都唯一,各字符的名稱即為各后綴在后綴索引中的優(yōu)先級次序,掃描字符串T1,每個索引位置生成相應(yīng)的二元組:(T[i],i),S卩(字符名稱,位置索引),將這些二元組全部壓入外存排序器,按照字符名稱排序,排序后取各字符對應(yīng)的索引號存入數(shù)組,即得到T1的后綴索引,否則以T1為新的字符串輸入?yún)?shù),用遞歸方式構(gòu)造T1的后綴索引; 所述掃描T1的后綴索引,得到T的后綴索引的過程為: 使用大規(guī)模字符串讀取器讀取字符串T,識別其中的LMS后綴,根據(jù)T1的后綴索引,給相應(yīng)的LMS后綴賦予優(yōu)先級,并壓入外存優(yōu)先級隊列容器Q1中; 掃描Q1,得到的有序L后綴,L后綴存放于外存優(yōu)先級隊列Q2中; 掃描Q2,得到有序S后綴序列; 歸并所有L和S后綴,得到字符串T的后綴索引。2.根據(jù)權(quán)利要求1所述的大規(guī)模文本的后綴索引構(gòu)造方法,其特征在于,所述LMS子串的識別方法為,該子串的首字符和尾字符均為LMS字符,首字符與尾字符之間不存在任何LMS字符,則該子串為LMS子串; 所述LMS字符的識別方法為,當(dāng)后綴為LMS后綴時,則該后綴所對應(yīng)字符子串的首字符為LMS字符; 所述LMS后綴的識別方法為,若當(dāng)如后綴為S后綴,且字符串T中與當(dāng)如后綴相鄰的左手邊第一個后綴為L后綴,則該后綴為LMS后綴; 所述L子串的識別方法為,子串的首字符為L字符,尾字符為LMS字符,且首字符與尾字符之間不存在任何LMS字符,則該子串為L子串; 所述L/S字符的識別方法為,若某后綴為L或S后綴,則該后綴所對應(yīng)字符子串的首字符分別稱為L或S字符; 所述S子串的識別方法為,子串的首字符為S字符,尾字符為LMS字符,且首字符與尾字符之間不存在任何LMS字符,則該子串為S子串; 所述L后綴、S后綴的識別方法為,假定字符串最后一個字符為‘$’,該字符在整個字符串所包含的字符當(dāng)中最小并且唯一,為S后綴;然后從字符串文本倒數(shù)第二個字符開始往前掃描,若當(dāng)前字符比前一字符小,則該后綴為S后綴;或當(dāng)前字符與前一字符相等且前一字符所對應(yīng)的后綴為S后綴,則該后綴也為S后綴;除上述兩種情況之外,后綴被識別為L后綴。3.一種大規(guī)模文本的后綴索引構(gòu)造裝置,其特征在于,包括: 大規(guī)模字符串讀取器(1),用于順序讀取外存大規(guī)模字符串文本T ; 后綴前驅(qū)信息處理器(2),用于生成字符串文本中各后綴的前驅(qū)信息; 其中,所述后綴前驅(qū)信息為一個元組,該元組包含了該后綴在字符串中的位置信息,前驅(qū)字符以及前驅(qū)字符距離;前驅(qū)字符為:在字符串文本T中,后綴i對應(yīng)的字符為T[i],T[i]左側(cè)第一個不等于T[i]的字符稱為后綴i的前驅(qū)字符; 前驅(qū)信息存儲模塊(3),是一種外存容器,用于存放后綴前驅(qū)信息處理器(2)所輸出的各后綴前驅(qū)信息; LMS后綴識別器(4),用于識別具體的后綴是否為LMS后綴; L/S后綴識別器(5),用于識別具體的后綴是L還是S后綴; 子串命名單元(6),用于在索引構(gòu)造過程中,對字符子串進(jìn)行命名,以便字符串規(guī)模的收縮; 外存優(yōu)先級隊列容器(7),包括容器Ql、Q2,用于在外存上對字符子串或后綴進(jìn)行排序,每次從該隊列彈出的子串或后綴為當(dāng)如隊列中最小或最大子串或后綴; 外存排序器(8 ),也是一種外存容器,可對存入其中的對象按照指定關(guān)鍵字排序; 后綴索引存儲模塊(9),也是一種外存容器,用于存儲后綴索引。
【專利摘要】本發(fā)明公開了一種大規(guī)模文本的后綴索引構(gòu)造方法及裝置,本發(fā)明在后綴索引構(gòu)造過程中至少配置大規(guī)模字符串讀取器,后綴前驅(qū)信息處理器,LMS后綴識別器,兩個外存優(yōu)先級隊列容器和外存排序器。通過大規(guī)模字符串讀取器讀取字符串,LMS識別器識別字符串中的LMS子串或后綴,外存優(yōu)先級隊列容器實現(xiàn)子串或后綴的排序,最終完成大規(guī)模字符串文本的后綴索引構(gòu)造。在索引構(gòu)造過程中,利用了低成本的計算機(jī)外存資源,使得后綴索引構(gòu)造不再受限于內(nèi)存容量;從而在任意一臺普通計算機(jī)環(huán)境下,本發(fā)明能完成超過該內(nèi)存大小的字符串文本數(shù)據(jù)的后綴索引構(gòu)造,突破現(xiàn)有后綴索引構(gòu)造技術(shù)方案的局限性。且本發(fā)明具有運行速度快、I/O量小和簡單易行等優(yōu)點。
【IPC分類】G06F17/30
【公開號】CN105335481
【申請?zhí)枴緾N201510659972
【發(fā)明人】劉偉軍, 農(nóng)革
【申請人】廣東順德中山大學(xué)卡內(nèi)基梅隆大學(xué)國際聯(lián)合研究院, 中山大學(xué)
【公開日】2016年2月17日
【申請日】2015年10月14日