欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

Xml關(guān)鍵字檢索的最低公共祖先快速查找方法

文檔序號:6469298閱讀:218來源:國知局

專利名稱::Xml關(guān)鍵字檢索的最低公共祖先快速查找方法
技術(shù)領(lǐng)域
:本發(fā)明屬數(shù)據(jù)庫
技術(shù)領(lǐng)域
,具體涉及一種高效的對XML數(shù)據(jù)進(jìn)行關(guān)鍵字檢索的方法。
背景技術(shù)
:隨著XML的流行,XML上的關(guān)鍵字檢索也正在成為一個(gè)研究熱點(diǎn)。XML上的關(guān)鍵字檢索不需要用戶對所査詢XML的DTD或schema模式、復(fù)雜的XML査詢語言(比如XQuery)等相關(guān)知識有所了解,因此更容易被用戶接受。通常在Web上的關(guān)鍵字檢索,比如google或者百度,他們的返回結(jié)果是包含用戶提供的關(guān)鍵字的整個(gè)網(wǎng)頁。但如果對大XML文檔上的關(guān)鍵字檢索,由于XML文檔通常被建模成樹形結(jié)構(gòu),有著層次性的嵌套關(guān)系,用戶通常希望能得到最小結(jié)果片斷,此時(shí)返回結(jié)果應(yīng)是包含這些關(guān)鍵字的結(jié)點(diǎn)集,而且結(jié)點(diǎn)集中的任一結(jié)點(diǎn)的子孫結(jié)點(diǎn)都不能再包含所查詢的關(guān)鍵字。以往的XML關(guān)鍵字檢索在求解任意兩個(gè)結(jié)點(diǎn)的最低公共祖先結(jié)點(diǎn)(LCA)的時(shí)候,都是基于Dewey編碼,所謂Dewey編碼是指每個(gè)結(jié)點(diǎn)的編碼以父親結(jié)點(diǎn)的編碼為前綴,這樣兩個(gè)結(jié)點(diǎn)的LCA結(jié)點(diǎn)就是他們最長公共前綴所指示的結(jié)點(diǎn)。使用這種編碼好處在于給定任意兩個(gè)結(jié)點(diǎn),只需比較他們的編碼就可以求解出LCA,但同時(shí)應(yīng)看到編碼隨著結(jié)點(diǎn)的深度在增加,一方面在求解最長公共前綴時(shí)將會比較耗時(shí),另一方面存儲這樣的編碼對空間的耗費(fèi)也是很巨大的。
發(fā)明內(nèi)容本發(fā)明的目的在于提出了在XML關(guān)鍵字檢索中應(yīng)用基于RMQ(RangeMinimumQuery)的LCA求解算法,該方法在假設(shè)XML元素的個(gè)數(shù)為n的情況下,通過O(nlogn)的預(yù)處理可以達(dá)到0(1)的LCA求解時(shí)間效率,從而消去XML上關(guān)鍵字檢索時(shí)借助Dewey編碼求解共同祖先的時(shí)間系數(shù)d,同時(shí)由于僅存儲結(jié)點(diǎn)的歐拉序列而不是Dewey編碼,可以有效減少存儲空間的開銷。該方法首先進(jìn)行預(yù)處理,預(yù)處理的具體步驟是步驟l,在解析XML文檔的過程中,構(gòu)建歐拉序列E和深度序列L,記錄XML文檔中每個(gè)結(jié)點(diǎn)的開始位置,結(jié)束位置和深度信息,對XML文檔進(jìn)行序列化,并在處理文本信息的時(shí)候,建立倒排表記錄每個(gè)單詞;步驟2,將深度序列L按長度logn/2劃分成2n/logn個(gè)塊,在每個(gè)塊上選取最小值組成一個(gè)長度為2n/logn的新序列,利用新序列建立SparseTable5步驟3,枚舉每個(gè)等價(jià)塊,計(jì)算并存儲塊內(nèi)任意序號間最小值的位置。在預(yù)處理方法中,是在計(jì)算兩個(gè)結(jié)點(diǎn)的LCA結(jié)點(diǎn)時(shí),先判斷兩個(gè)結(jié)點(diǎn)是否在同一個(gè)塊中,如果在同一個(gè)塊中,直接取出相應(yīng)等價(jià)塊中兩個(gè)結(jié)點(diǎn)的間最小值的位置,如果不是,則分別求解在新序列上的最小值和塊內(nèi)的最小值;無論哪種情況,時(shí)間復(fù)雜度都為O(l)。相比于現(xiàn)有的算法,本發(fā)明不僅避免了求LCA結(jié)點(diǎn)時(shí)逐層比較兩個(gè)結(jié)點(diǎn)的Dewey編碼,消去了時(shí)間系數(shù)d,而且僅存儲結(jié)點(diǎn)的歐拉序列而不是Dewey編碼,可以有效減少存儲空間的開銷。采用預(yù)處理后的文檔結(jié)構(gòu),對XML進(jìn)行關(guān)鍵字進(jìn)行檢索,給定k個(gè)關(guān)鍵字結(jié)點(diǎn)集Si,S2,…,Sk,檢索的方法如下步驟1,求出結(jié)點(diǎn)集最小的關(guān)鍵字集合,假設(shè)為Si,作為SLCA結(jié)點(diǎn)的候選結(jié)點(diǎn)集;步驟2,對候選結(jié)點(diǎn)集進(jìn)行k-1次迭代,每次迭代對候選結(jié)點(diǎn)集和另一個(gè)關(guān)鍵字結(jié)點(diǎn)集進(jìn)行SLCA結(jié)點(diǎn)的計(jì)算,并將結(jié)果集作為下一次迭代的候選集;步驟3,在經(jīng)過k-l次迭代后,得到k個(gè)集合的SLCA結(jié)點(diǎn)集,其中SLCA結(jié)點(diǎn)計(jì)算得出候選slca結(jié)點(diǎn),然后刪除所有非SLCA結(jié)點(diǎn)。本發(fā)明的優(yōu)點(diǎn)在于,這種檢索方法通過有效的預(yù)處理,可以消去XML上關(guān)鍵字檢索時(shí)借助Dewey編碼求解共同祖先的時(shí)間系數(shù)d,同時(shí)由于僅存儲結(jié)點(diǎn)的歐拉序列而不是Dewey編碼,可以有效減少存儲空間的開銷,所以在性能和空間利用上要優(yōu)于現(xiàn)有算法。圖1為LCA算法流程圖。圖2為SLCA算法流程圖。圖3為XML文檔樹圖。具體實(shí)施例方式1.與本發(fā)明有關(guān)的一些概念和定義。1,XML文檔:在本發(fā)明中,一個(gè)XML文檔D被建模成有序的帶標(biāo)記樹T(N,E)。其中樹結(jié)點(diǎn)集N包含文檔中的所有元素、屬性或者值。而邊集E表示元素之間的包含關(guān)系。為簡便起見,我們忽略了結(jié)點(diǎn)間可能的引用邊。2,LCA結(jié)點(diǎn)集:給定關(guān)鍵詞集合S^kl,k2,k3,…knh對每個(gè)關(guān)鍵字ki都會有一個(gè)結(jié)點(diǎn)集Si,里面的每一個(gè)結(jié)點(diǎn)都直接包含關(guān)鍵字ki。對每一種可能的結(jié)點(diǎn)組合(el,e2,…,en),其中eiESi,都會有一個(gè)相應(yīng)的LCA結(jié)點(diǎn)v,即v=lca(el,e2,…,en)。這里我們用lca(Sl,S2,…Sn)來代表所有可能組合的LCA結(jié)點(diǎn)集。3,SLCA結(jié)點(diǎn)集對lca(S1,S2,…Sn)集合中的結(jié)點(diǎn)v來說,如果集合中沒有其他結(jié)點(diǎn)u滿足v<u,(這里用v<u表示v是u的祖先,用v!<u表示v不是u的祖先),則v是Sl,S2,…Sn的一個(gè)SLCA結(jié)點(diǎn),記做v=slca(Sl,S2,…Sn),所有這樣的v結(jié)點(diǎn)即組成了查詢結(jié)果集R,記做R^SLCA(Sl,S2,…,Sn)。4,RMQ問題對一個(gè)長度為n的數(shù)組N,任意給出序號i和j,返回?cái)?shù)組中在第i個(gè)元素到第j個(gè)元素中值最小的元素的下標(biāo)。5,歐拉序列和深度序列在深度優(yōu)先遍歷樹的時(shí)候,從根結(jié)點(diǎn)開始,每次經(jīng)前向邊或者后向邊訪問到的結(jié)點(diǎn)都記錄下來,最后回到根結(jié)點(diǎn),所得到的序列就是歐拉序列。歐拉序列中的每個(gè)結(jié)點(diǎn)對應(yīng)的深度組成的序列就是深度序列。如圖1中簡單樹的歐拉序列(用E表示)如表1所示,同時(shí)給出了對應(yīng)的深度序列(用L表示)。2.與本發(fā)明有關(guān)的一些性質(zhì)。性質(zhì)1:任意兩結(jié)點(diǎn)u和v的LCA結(jié)點(diǎn),是從u到v的深度優(yōu)先遍歷過程中遇到的深度最小的結(jié)點(diǎn)。這里深度是指從根結(jié)點(diǎn)算起的路徑長度,而且我們假設(shè)在樹的優(yōu)先遍歷中,u在v前面。性質(zhì)2:^ca((v〉,S)-(c^cemfa""/cfl(v,/w(v,S)),/ca(v,nM(v,S))))。此性質(zhì)說明,在求結(jié)點(diǎn)v和結(jié)點(diǎn)集S中結(jié)點(diǎn)的slca時(shí),只要比較從v和S中最靠近v的兩個(gè)結(jié)點(diǎn)得到的lca即可。其中,函數(shù)lm(v,S)返回在S中前序遍歷順序在v前面(左邊)最接近v的結(jié)點(diǎn),由于結(jié)點(diǎn)采用Dewey編碼,所以就是返回S中小于或者等于v的最大的編碼。函數(shù)rm(v,S)則是返回大于或等于v的最小的編碼。函數(shù)desendant(vl,v2)則是返回兩個(gè)結(jié)點(diǎn)里的子孫結(jié)點(diǎn)。性質(zhì)4:若結(jié)點(diǎn)u滿足u.first0ccu<v.first0ccu<u.last0ccu,則u是v的祖先。1,歐拉序列E和深度序列L的創(chuàng)建方法歐拉序列E和深度序列L是在解析XML的過程中創(chuàng)建的,考慮到支持大規(guī)模的XML文檔,用占用內(nèi)存比較小的SAX方式進(jìn)行解析。初始時(shí),歐拉序列,倒排表和棧均為空,在解析的過程中,SAX會引發(fā)三種事件startElement,endElement和characters,分別表示當(dāng)前處理的內(nèi)容是開始標(biāo)簽,結(jié)束標(biāo)簽和文本內(nèi)容,我們分別對這三種事件進(jìn)行處理。當(dāng)前事件為startElement時(shí),我們分三步進(jìn)行處理。第一步,建立一個(gè)新的對象表示當(dāng)前結(jié)點(diǎn),并記錄當(dāng)前結(jié)點(diǎn)的深度。第二步,判斷歐拉序列中最后一個(gè)結(jié)點(diǎn)是不是當(dāng)前結(jié)點(diǎn)的父親,如果不是的話,添加當(dāng)前結(jié)點(diǎn)的父親結(jié)點(diǎn)到歐拉序列中。第三步,把當(dāng)前結(jié)點(diǎn)添加到歐拉序列和棧中。當(dāng)前事件為endElement時(shí),首先我們把當(dāng)前結(jié)點(diǎn)從棧頂取出,然后判斷歐拉序列中最后一個(gè)結(jié)點(diǎn)是不是當(dāng)前結(jié)點(diǎn),如果不是的話,把當(dāng)前結(jié)點(diǎn)添加到歐拉序列中。當(dāng)前事件為characters時(shí),我們對文本內(nèi)容進(jìn)行分詞,并把每個(gè)分詞加入到倒排表中。2,快速RMQ算法的構(gòu)建方法我們分三步完成。第一,將深度序列L按長度logn/2劃分成2n/logn個(gè)塊,在每個(gè)塊上選取最小值組成一個(gè)長度為2n/logn的新序列,如圖2所示。第二,在新序列上應(yīng)用SparseTable算法,SparseTable是一個(gè)二維數(shù)組M,其中M[i][j]表示深度序列L中從第i個(gè)位置開始,長度為2j的范圍中的最小值對應(yīng)的序號,也就是M[i][j]=argraink二i…i+2j{L[k]}。這樣i的變化范圍是從1到n,j的變化范圍是從1到logn,所以構(gòu)建的復(fù)雜度為O(nlogn)。第三,考慮到深度序列是士l變動的序列,而且我們的RMQ計(jì)算僅是為了找出范圍內(nèi)最小值對應(yīng)的序號,因此我們認(rèn)為士l變化完全相同的塊是等價(jià)的。進(jìn)一步,這樣的等價(jià)塊共有2('""/2_1)=^"1/2)。對每個(gè)等價(jià)塊我們采用最簡單的方式進(jìn)行預(yù)處理,計(jì)算并存儲塊內(nèi)任意序號間最小值的位置,每個(gè)塊代價(jià)為(1(^"/2)2=C>(lQg2"),總的時(shí)間代價(jià)為0("1/21^2"、3,兩個(gè)結(jié)點(diǎn)的LCA結(jié)點(diǎn)計(jì)算方法假設(shè)要求e和f的LCA結(jié)點(diǎn)。首先在E中分別找到兩個(gè)結(jié)點(diǎn)第一次出現(xiàn)的位置a和b,然后在L序列從a到b的范圍內(nèi)找深度最小的值,該值所對應(yīng)的結(jié)點(diǎn)即我們要求的LCA結(jié)點(diǎn)。要快速的求出LCA結(jié)點(diǎn),我們可以利用快速RMQ算法的結(jié)構(gòu),首先判斷兩個(gè)結(jié)點(diǎn)是否落在同一個(gè)塊中,如果是的話,因?yàn)閴K內(nèi)任意序號間最小值的位置已在預(yù)處理的時(shí)候算出,我們可以直接從磁盤取出,時(shí)間為0(1),如果兩個(gè)結(jié)點(diǎn)在不同塊中,可以分解為在長度為2n/logn新序列上求解和在塊內(nèi)求解的結(jié)合,總的時(shí)間復(fù)雜度也為0(1)。4,SLCA結(jié)點(diǎn)的計(jì)算方法給定兩個(gè)集合Si和S2,按照firstOccu從小到大的順序?qū),中的每個(gè)結(jié)點(diǎn)v計(jì)算u二slca(v,S2)(根據(jù)性質(zhì)2),但u可能是其他SLCA結(jié)點(diǎn)的袓先,所以我們需要把它先保存起來,繼續(xù)處理其他的結(jié)點(diǎn),如果另一個(gè)結(jié)點(diǎn)經(jīng)過slca計(jì)算得出的結(jié)果是x,則我們判斷u.firstOccu和x.firstOccu的大小,如果前者比較大,則易證x是u的祖先,x必不可能是SLCA結(jié)點(diǎn);如果前者比較小或相等,則我們比較u.last0ccu和x.lastOccu,如果u.last0ccu比較大或相等,則根據(jù)性質(zhì)4,我們可以得到u是x的祖先,u不可能是SLCA結(jié)點(diǎn);只有當(dāng)u.lastOccu比x.lastOccu大時(shí),u才是SLCA結(jié)點(diǎn),此時(shí)我們把u加入結(jié)果集中。當(dāng)無法判斷x是否SLCA結(jié)點(diǎn)時(shí),我們也是先把它保存起來。5,XML上的SLCA檢索方法根據(jù)性質(zhì)3,給定k個(gè)結(jié)點(diǎn)集St,S2,…,Sk,我們可以先選擇結(jié)點(diǎn)個(gè)數(shù)最小的集合,假設(shè)為S,,進(jìn)行k-l次迭代,第i次求出前i+l個(gè)集合的SLCA結(jié)點(diǎn)集AnSi,不妨設(shè)Ans。二Si,則在第i+l次我們利用4求出slca(AnSi,Si+1)。則Ansk即為slca(Si,S2,,Sk)。以圖1的XML樹為例,經(jīng)過深度優(yōu)先遍歷樹后,我們得到了歐拉序列和深度序列(表l),同時(shí),我們也創(chuàng)建了索引表(表2)。則歐拉序列結(jié)點(diǎn)的個(gè)數(shù)為2*7=14個(gè)。在歐拉序列的基礎(chǔ)上,我們生成了Sparsetable(圖2),Sparsetable—共有2n/logn=2*14/[logl4]=7個(gè)塊,每個(gè)塊大小為logl4/2=2。當(dāng)我們需要計(jì)算g和c的slca結(jié)點(diǎn)時(shí)。首先我們求出他們的結(jié)點(diǎn)集Sg={5,12},S。={4,6},其中結(jié)點(diǎn)集中的數(shù)字表示相應(yīng)結(jié)點(diǎn)的firstOccu標(biāo)號。因?yàn)镾。和Sg大小相同,所以我們枚舉Sg中的每個(gè)元素以計(jì)算SLCA結(jié)點(diǎn)集。首先我們得到firrstOccu標(biāo)號為5的結(jié)點(diǎn)(設(shè)為gl,通過二分的方法,我們得到S。中最靠近gl的點(diǎn)是id分別為4和6的結(jié)點(diǎn)cl和c2。則根據(jù)性質(zhì)2,我們需要求出gl和cl的lea結(jié)點(diǎn)以及gl和c2的lea結(jié)點(diǎn)。因?yàn)間l和cl屬于同一個(gè)塊,所以我們可以求出深度序列上他們之間的深度最小的結(jié)點(diǎn),即gl,所以gl是gl和cl的lca結(jié)點(diǎn)。另一方面,gl和c2屬于不同的塊,我們可以先求他們各自塊中在他們之間的且深度最小的結(jié)點(diǎn),然后利用sparsetable求出他們之間的塊的深度最小的結(jié)點(diǎn),并取最小的那個(gè)。于是,我們得到lca(gl,c2)=c2。因此,slca(gl,S。)=gl。接著我們計(jì)算slca(g2,S。)。因?yàn)镾。中最靠近g2的點(diǎn)有c2。所以我們只需求lca(c2,g2),方法和上面類似,最后得到lca(c2,g2)=a。得到gl后,我們還不知道gl是否屬于g和c的slca集合,于是我們暫時(shí)把他保存起來。在得到a后,我們比較gl和a的first0ccu,因?yàn)間l的first0ccu比a大,所以a必定不是slca結(jié)點(diǎn)。此時(shí)我們把a(bǔ)刪去,因?yàn)闆]有其他可能是slca的結(jié)點(diǎn),所以gl為slca結(jié)點(diǎn)。故slca(Sg,Sc)=gl。<table>tableseeoriginaldocumentpage9</column></row><table>表l<table>tableseeoriginaldocumentpage9</column></row><table>表2表1為圖3為歐拉序列和深度序列;表2為圖5的索引序列。附圖l流程圖中1:輸入?yún)?shù),u和v是直接包含兩個(gè)關(guān)鍵詞的兩個(gè)結(jié)點(diǎn),E和L是XML樹的歐拉序列和對應(yīng)的深度序列;2:i和j分別是u和v第一次在E中出現(xiàn)的序號;3:k是L中在L[i]和L[j]之間最小值所對應(yīng)的序號;4:輸出k的深度序列號,結(jié)束。附圖2浪程圖中1-輸入?yún)?shù)S1和S2,分別是用歐拉序列中結(jié)點(diǎn)第一次出現(xiàn)的序號表示的結(jié)點(diǎn)集合;2:初始化,R是結(jié)果集,u是上一步的結(jié)果結(jié)點(diǎn),n是循環(huán)變量,初始化為0;3:判斷條件,針對S1的每一個(gè)結(jié)點(diǎn),都執(zhí)行4;4:v是Sl的當(dāng)前待處理結(jié)點(diǎn),x是v和S2的slca結(jié)點(diǎn),性質(zhì)2;5:如果是第一次循環(huán),就初始化U為X;6:如果u的firsrOccu和lastOccu都分別小于x的相應(yīng)值,就執(zhí)行;8:U添加到結(jié)果集R中;9:U取X的當(dāng)前值;10:將最后一次的U加到R中;11-輸出結(jié)果集合,結(jié)束。權(quán)利要求1、一種XML關(guān)鍵字檢索的最低公共祖先快速查找方法,其特征是,該方法首先進(jìn)行預(yù)處理,預(yù)處理的具體步驟是步驟1,在解析XML文檔的過程中,構(gòu)建歐拉序列E和深度序列L,記錄XML文檔中每個(gè)結(jié)點(diǎn)的開始位置,結(jié)束位置和深度信息,對XML文檔進(jìn)行序列化,并在處理文本信息的時(shí)候,建立倒排表記錄每個(gè)單詞;步驟2,將深度序列L按長度logn/2劃分成2n/logn個(gè)塊,在每個(gè)塊上選取最小值組成一個(gè)長度為2n/logn的新序列,利用新序列建立SparseTable;步驟3,枚舉每個(gè)等價(jià)塊,計(jì)算并存儲塊內(nèi)任意序號間最小值的位置。2、根據(jù)權(quán)利要求1所述的XML關(guān)鍵字檢索的最低公共祖先快速査找方法,在預(yù)處理方法中,是在計(jì)算兩個(gè)結(jié)點(diǎn)的LCA結(jié)點(diǎn)時(shí),先判斷兩個(gè)結(jié)點(diǎn)是否在同一個(gè)塊中,如果在同一個(gè)塊中,直接取出相應(yīng)等價(jià)塊中兩個(gè)結(jié)點(diǎn)的間最小值的位置,如果不是,則分別求解在新序列上的最小值和塊內(nèi)的最小值。3、根據(jù)權(quán)利要求1或2所述的XML關(guān)鍵字檢索的最低公共祖先快速查找方法,其特征在于,采用預(yù)處理后的文檔結(jié)構(gòu),對XML進(jìn)行關(guān)鍵字進(jìn)行檢索,給定k個(gè)關(guān)鍵字結(jié)點(diǎn)集S,S2,…,Sk,檢索的方法如下步驟l,求出結(jié)點(diǎn)集最小的關(guān)鍵字集合,假設(shè)為S,,作為SLCA結(jié)點(diǎn)的候選結(jié)點(diǎn)集;步驟2,對候選結(jié)點(diǎn)集進(jìn)行k-l次迭代,每次迭代對候選結(jié)點(diǎn)集和另一個(gè)關(guān)鍵字結(jié)點(diǎn)集進(jìn)行SLCA結(jié)點(diǎn)的計(jì)算,并將結(jié)果集作為下一次迭代的候選集;步驟3,在經(jīng)過k-l次迭代后,得到k個(gè)集合的SLCA結(jié)點(diǎn)集,其中SLCA結(jié)點(diǎn)計(jì)算得出候選slca結(jié)點(diǎn),然后刪除所有非SLCA結(jié)點(diǎn)。全文摘要本發(fā)明屬數(shù)據(jù)庫
技術(shù)領(lǐng)域
,具體提出了一種新型的基于RMQ的關(guān)鍵字檢索方法,這種檢索方法通過有效的預(yù)處理,可以消去XML上關(guān)鍵字檢索時(shí)借助Dewey編碼求解共同祖先的時(shí)間系數(shù)d,同時(shí)由于僅存儲結(jié)點(diǎn)的歐拉序列而不是Dewey編碼,可以有效減少存儲空間的開銷,所以在性能和空間利用上要優(yōu)于現(xiàn)有算法。本發(fā)明涉及一種XML關(guān)鍵字檢索的最低公共祖先快速查找方法。文檔編號G06F17/30GK101364234SQ20081020067公開日2009年2月11日申請日期2008年9月27日優(yōu)先權(quán)日2008年9月27日發(fā)明者周傲英,王曉玲,濤謝申請人:復(fù)旦大學(xué)
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
巨野县| 北海市| 长汀县| 灌阳县| 梁平县| 阿拉尔市| 马鞍山市| 梅州市| 宁都县| 安国市| 三门县| 游戏| 昭平县| 滦平县| 龙游县| 阿克| 林甸县| 汕尾市| 凤翔县| 景洪市| 榆社县| 定兴县| 汉阴县| 耒阳市| 略阳县| 上思县| 冀州市| 微山县| 乌恰县| 成武县| 永仁县| 寿光市| 库尔勒市| 胶南市| 昆明市| 临澧县| 明光市| 涿州市| 祁门县| 长葛市| 抚松县|