Xml关键字检索的最低公共祖先快速查找方法

文档序号:6469298阅读:172来源:国知局

专利名称::Xml关键字检索的最低公共祖先快速查找方法
技术领域
:本发明属数据库
技术领域
,具体涉及一种高效的对XML数据进行关键字检索的方法。
背景技术
:随着XML的流行,XML上的关键字检索也正在成为一个研究热点。XML上的关键字检索不需要用户对所査询XML的DTD或schema模式、复杂的XML査询语言(比如XQuery)等相关知识有所了解,因此更容易被用户接受。通常在Web上的关键字检索,比如google或者百度,他们的返回结果是包含用户提供的关键字的整个网页。但如果对大XML文档上的关键字检索,由于XML文档通常被建模成树形结构,有着层次性的嵌套关系,用户通常希望能得到最小结果片断,此时返回结果应是包含这些关键字的结点集,而且结点集中的任一结点的子孙结点都不能再包含所查询的关键字。以往的XML关键字检索在求解任意两个结点的最低公共祖先结点(LCA)的时候,都是基于Dewey编码,所谓Dewey编码是指每个结点的编码以父亲结点的编码为前缀,这样两个结点的LCA结点就是他们最长公共前缀所指示的结点。使用这种编码好处在于给定任意两个结点,只需比较他们的编码就可以求解出LCA,但同时应看到编码随着结点的深度在增加,一方面在求解最长公共前缀时将会比较耗时,另一方面存储这样的编码对空间的耗费也是很巨大的。
发明内容本发明的目的在于提出了在XML关键字检索中应用基于RMQ(RangeMinimumQuery)的LCA求解算法,该方法在假设XML元素的个数为n的情况下,通过O(nlogn)的预处理可以达到0(1)的LCA求解时间效率,从而消去XML上关键字检索时借助Dewey编码求解共同祖先的时间系数d,同时由于仅存储结点的欧拉序列而不是Dewey编码,可以有效减少存储空间的开销。该方法首先进行预处理,预处理的具体步骤是步骤l,在解析XML文档的过程中,构建欧拉序列E和深度序列L,记录XML文档中每个结点的开始位置,结束位置和深度信息,对XML文档进行序列化,并在处理文本信息的时候,建立倒排表记录每个单词;步骤2,将深度序列L按长度logn/2划分成2n/logn个块,在每个块上选取最小值组成一个长度为2n/logn的新序列,利用新序列建立SparseTable5步骤3,枚举每个等价块,计算并存储块内任意序号间最小值的位置。在预处理方法中,是在计算两个结点的LCA结点时,先判断两个结点是否在同一个块中,如果在同一个块中,直接取出相应等价块中两个结点的间最小值的位置,如果不是,则分别求解在新序列上的最小值和块内的最小值;无论哪种情况,时间复杂度都为O(l)。相比于现有的算法,本发明不仅避免了求LCA结点时逐层比较两个结点的Dewey编码,消去了时间系数d,而且仅存储结点的欧拉序列而不是Dewey编码,可以有效减少存储空间的开销。采用预处理后的文档结构,对XML进行关键字进行检索,给定k个关键字结点集Si,S2,…,Sk,检索的方法如下步骤1,求出结点集最小的关键字集合,假设为Si,作为SLCA结点的候选结点集;步骤2,对候选结点集进行k-1次迭代,每次迭代对候选结点集和另一个关键字结点集进行SLCA结点的计算,并将结果集作为下一次迭代的候选集;步骤3,在经过k-l次迭代后,得到k个集合的SLCA结点集,其中SLCA结点计算得出候选slca结点,然后删除所有非SLCA结点。本发明的优点在于,这种检索方法通过有效的预处理,可以消去XML上关键字检索时借助Dewey编码求解共同祖先的时间系数d,同时由于仅存储结点的欧拉序列而不是Dewey编码,可以有效减少存储空间的开销,所以在性能和空间利用上要优于现有算法。图1为LCA算法流程图。图2为SLCA算法流程图。图3为XML文档树图。具体实施例方式1.与本发明有关的一些概念和定义。1,XML文档:在本发明中,一个XML文档D被建模成有序的带标记树T(N,E)。其中树结点集N包含文档中的所有元素、属性或者值。而边集E表示元素之间的包含关系。为简便起见,我们忽略了结点间可能的引用边。2,LCA结点集:给定关键词集合S^kl,k2,k3,…knh对每个关键字ki都会有一个结点集Si,里面的每一个结点都直接包含关键字ki。对每一种可能的结点组合(el,e2,…,en),其中eiESi,都会有一个相应的LCA结点v,即v=lca(el,e2,…,en)。这里我们用lca(Sl,S2,…Sn)来代表所有可能组合的LCA结点集。3,SLCA结点集对lca(S1,S2,…Sn)集合中的结点v来说,如果集合中没有其他结点u满足v<u,(这里用v<u表示v是u的祖先,用v!<u表示v不是u的祖先),则v是Sl,S2,…Sn的一个SLCA结点,记做v=slca(Sl,S2,…Sn),所有这样的v结点即组成了查询结果集R,记做R^SLCA(Sl,S2,…,Sn)。4,RMQ问题对一个长度为n的数组N,任意给出序号i和j,返回数组中在第i个元素到第j个元素中值最小的元素的下标。5,欧拉序列和深度序列在深度优先遍历树的时候,从根结点开始,每次经前向边或者后向边访问到的结点都记录下来,最后回到根结点,所得到的序列就是欧拉序列。欧拉序列中的每个结点对应的深度组成的序列就是深度序列。如图1中简单树的欧拉序列(用E表示)如表1所示,同时给出了对应的深度序列(用L表示)。2.与本发明有关的一些性质。性质1:任意两结点u和v的LCA结点,是从u到v的深度优先遍历过程中遇到的深度最小的结点。这里深度是指从根结点算起的路径长度,而且我们假设在树的优先遍历中,u在v前面。性质2:^ca((v〉,S)-(c^cemfa""/cfl(v,/w(v,S)),/ca(v,nM(v,S))))。此性质说明,在求结点v和结点集S中结点的slca时,只要比较从v和S中最靠近v的两个结点得到的lca即可。其中,函数lm(v,S)返回在S中前序遍历顺序在v前面(左边)最接近v的结点,由于结点采用Dewey编码,所以就是返回S中小于或者等于v的最大的编码。函数rm(v,S)则是返回大于或等于v的最小的编码。函数desendant(vl,v2)则是返回两个结点里的子孙结点。性质4:若结点u满足u.first0ccu<v.first0ccu<u.last0ccu,则u是v的祖先。1,欧拉序列E和深度序列L的创建方法欧拉序列E和深度序列L是在解析XML的过程中创建的,考虑到支持大规模的XML文档,用占用内存比较小的SAX方式进行解析。初始时,欧拉序列,倒排表和栈均为空,在解析的过程中,SAX会引发三种事件startElement,endElement和characters,分别表示当前处理的内容是开始标签,结束标签和文本内容,我们分别对这三种事件进行处理。当前事件为startElement时,我们分三步进行处理。第一步,建立一个新的对象表示当前结点,并记录当前结点的深度。第二步,判断欧拉序列中最后一个结点是不是当前结点的父亲,如果不是的话,添加当前结点的父亲结点到欧拉序列中。第三步,把当前结点添加到欧拉序列和栈中。当前事件为endElement时,首先我们把当前结点从栈顶取出,然后判断欧拉序列中最后一个结点是不是当前结点,如果不是的话,把当前结点添加到欧拉序列中。当前事件为characters时,我们对文本内容进行分词,并把每个分词加入到倒排表中。2,快速RMQ算法的构建方法我们分三步完成。第一,将深度序列L按长度logn/2划分成2n/logn个块,在每个块上选取最小值组成一个长度为2n/logn的新序列,如图2所示。第二,在新序列上应用SparseTable算法,SparseTable是一个二维数组M,其中M[i][j]表示深度序列L中从第i个位置开始,长度为2j的范围中的最小值对应的序号,也就是M[i][j]=argraink二i…i+2j{L[k]}。这样i的变化范围是从1到n,j的变化范围是从1到logn,所以构建的复杂度为O(nlogn)。第三,考虑到深度序列是士l变动的序列,而且我们的RMQ计算仅是为了找出范围内最小值对应的序号,因此我们认为士l变化完全相同的块是等价的。进一步,这样的等价块共有2('""/2_1)=^"1/2)。对每个等价块我们采用最简单的方式进行预处理,计算并存储块内任意序号间最小值的位置,每个块代价为(1(^"/2)2=C>(lQg2"),总的时间代价为0("1/21^2"、3,两个结点的LCA结点计算方法假设要求e和f的LCA结点。首先在E中分别找到两个结点第一次出现的位置a和b,然后在L序列从a到b的范围内找深度最小的值,该值所对应的结点即我们要求的LCA结点。要快速的求出LCA结点,我们可以利用快速RMQ算法的结构,首先判断两个结点是否落在同一个块中,如果是的话,因为块内任意序号间最小值的位置已在预处理的时候算出,我们可以直接从磁盘取出,时间为0(1),如果两个结点在不同块中,可以分解为在长度为2n/logn新序列上求解和在块内求解的结合,总的时间复杂度也为0(1)。4,SLCA结点的计算方法给定两个集合Si和S2,按照firstOccu从小到大的顺序对S,中的每个结点v计算u二slca(v,S2)(根据性质2),但u可能是其他SLCA结点的袓先,所以我们需要把它先保存起来,继续处理其他的结点,如果另一个结点经过slca计算得出的结果是x,则我们判断u.firstOccu和x.firstOccu的大小,如果前者比较大,则易证x是u的祖先,x必不可能是SLCA结点;如果前者比较小或相等,则我们比较u.last0ccu和x.lastOccu,如果u.last0ccu比较大或相等,则根据性质4,我们可以得到u是x的祖先,u不可能是SLCA结点;只有当u.lastOccu比x.lastOccu大时,u才是SLCA结点,此时我们把u加入结果集中。当无法判断x是否SLCA结点时,我们也是先把它保存起来。5,XML上的SLCA检索方法根据性质3,给定k个结点集St,S2,…,Sk,我们可以先选择结点个数最小的集合,假设为S,,进行k-l次迭代,第i次求出前i+l个集合的SLCA结点集AnSi,不妨设Ans。二Si,则在第i+l次我们利用4求出slca(AnSi,Si+1)。则Ansk即为slca(Si,S2,,Sk)。以图1的XML树为例,经过深度优先遍历树后,我们得到了欧拉序列和深度序列(表l),同时,我们也创建了索引表(表2)。则欧拉序列结点的个数为2*7=14个。在欧拉序列的基础上,我们生成了Sparsetable(图2),Sparsetable—共有2n/logn=2*14/[logl4]=7个块,每个块大小为logl4/2=2。当我们需要计算g和c的slca结点时。首先我们求出他们的结点集Sg={5,12},S。={4,6},其中结点集中的数字表示相应结点的firstOccu标号。因为S。和Sg大小相同,所以我们枚举Sg中的每个元素以计算SLCA结点集。首先我们得到firrstOccu标号为5的结点(设为gl,通过二分的方法,我们得到S。中最靠近gl的点是id分别为4和6的结点cl和c2。则根据性质2,我们需要求出gl和cl的lea结点以及gl和c2的lea结点。因为gl和cl属于同一个块,所以我们可以求出深度序列上他们之间的深度最小的结点,即gl,所以gl是gl和cl的lca结点。另一方面,gl和c2属于不同的块,我们可以先求他们各自块中在他们之间的且深度最小的结点,然后利用sparsetable求出他们之间的块的深度最小的结点,并取最小的那个。于是,我们得到lca(gl,c2)=c2。因此,slca(gl,S。)=gl。接着我们计算slca(g2,S。)。因为S。中最靠近g2的点有c2。所以我们只需求lca(c2,g2),方法和上面类似,最后得到lca(c2,g2)=a。得到gl后,我们还不知道gl是否属于g和c的slca集合,于是我们暂时把他保存起来。在得到a后,我们比较gl和a的first0ccu,因为gl的first0ccu比a大,所以a必定不是slca结点。此时我们把a删去,因为没有其他可能是slca的结点,所以gl为slca结点。故slca(Sg,Sc)=gl。<table>tableseeoriginaldocumentpage9</column></row><table>表l<table>tableseeoriginaldocumentpage9</column></row><table>表2表1为图3为欧拉序列和深度序列;表2为图5的索引序列。附图l流程图中1:输入参数,u和v是直接包含两个关键词的两个结点,E和L是XML树的欧拉序列和对应的深度序列;2:i和j分别是u和v第一次在E中出现的序号;3:k是L中在L[i]和L[j]之间最小值所对应的序号;4:输出k的深度序列号,结束。附图2浪程图中1-输入参数S1和S2,分别是用欧拉序列中结点第一次出现的序号表示的结点集合;2:初始化,R是结果集,u是上一步的结果结点,n是循环变量,初始化为0;3:判断条件,针对S1的每一个结点,都执行4;4:v是Sl的当前待处理结点,x是v和S2的slca结点,性质2;5:如果是第一次循环,就初始化U为X;6:如果u的firsrOccu和lastOccu都分别小于x的相应值,就执行;8:U添加到结果集R中;9:U取X的当前值;10:将最后一次的U加到R中;11-输出结果集合,结束。权利要求1、一种XML关键字检索的最低公共祖先快速查找方法,其特征是,该方法首先进行预处理,预处理的具体步骤是步骤1,在解析XML文档的过程中,构建欧拉序列E和深度序列L,记录XML文档中每个结点的开始位置,结束位置和深度信息,对XML文档进行序列化,并在处理文本信息的时候,建立倒排表记录每个单词;步骤2,将深度序列L按长度logn/2划分成2n/logn个块,在每个块上选取最小值组成一个长度为2n/logn的新序列,利用新序列建立SparseTable;步骤3,枚举每个等价块,计算并存储块内任意序号间最小值的位置。2、根据权利要求1所述的XML关键字检索的最低公共祖先快速査找方法,在预处理方法中,是在计算两个结点的LCA结点时,先判断两个结点是否在同一个块中,如果在同一个块中,直接取出相应等价块中两个结点的间最小值的位置,如果不是,则分别求解在新序列上的最小值和块内的最小值。3、根据权利要求1或2所述的XML关键字检索的最低公共祖先快速查找方法,其特征在于,采用预处理后的文档结构,对XML进行关键字进行检索,给定k个关键字结点集S,S2,…,Sk,检索的方法如下步骤l,求出结点集最小的关键字集合,假设为S,,作为SLCA结点的候选结点集;步骤2,对候选结点集进行k-l次迭代,每次迭代对候选结点集和另一个关键字结点集进行SLCA结点的计算,并将结果集作为下一次迭代的候选集;步骤3,在经过k-l次迭代后,得到k个集合的SLCA结点集,其中SLCA结点计算得出候选slca结点,然后删除所有非SLCA结点。全文摘要本发明属数据库
技术领域
,具体提出了一种新型的基于RMQ的关键字检索方法,这种检索方法通过有效的预处理,可以消去XML上关键字检索时借助Dewey编码求解共同祖先的时间系数d,同时由于仅存储结点的欧拉序列而不是Dewey编码,可以有效减少存储空间的开销,所以在性能和空间利用上要优于现有算法。本发明涉及一种XML关键字检索的最低公共祖先快速查找方法。文档编号G06F17/30GK101364234SQ20081020067公开日2009年2月11日申请日期2008年9月27日优先权日2008年9月27日发明者周傲英,王晓玲,涛谢申请人:复旦大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1