读论文系列:Nearest Keyword Search in XML Documents中使用的数据结构(CT、ECT)
Reference:
[1]Y. Tao, S. Papadopoulos, C. Sheng, K. Stefanidis. Nearest Keyword Search in XML Documents.
[2]M. Qiao, L. Qin, H. Cheng, J. X. Yu, W. Tian. Top-K Nearest Keyword Search on Large Graphs.
假设原树如Figure4所示;节点上有t的即为关键词节点;节点上的数字表示在树的先序遍历中的次序;祖先节点的先序序号一定比子孙节点的先序序号小;
CT树:有两类节点,第一类是关键词节点{2、5、9、23};第二类是至少含有两个含有关键词的直接子树的节点{3、1}(为了保证树的连通性)
下面是构造CT树的伪码,由两步构成,第一步在原树中找出所有CT树的节点,第二步将这些节点建成树
注释:For each node u in the data tree T, we use W(u) to represent the set of keywords associated with u. Let U(w) be the set of nodes inT that include word w.
1step:即找出CT树的两类节点
1line:S = {带关键词w的节点} //第一类节点
2line:对S中的节点以其在原树中的先序访问次序按升序进行排序
3, 4line:对在S中的连续的两个关键词节点{u,v},求LCA,并将其加入S末尾;所有关键词处理完时停止; //第二类节点
注释:For each node u of T, define its rank, denoted as rank(u), to be the sequence number of u in the pre-order traversal of T. We associate u with an interval R(u)=[x, y], where x is the rank of u, and y is the largest rank of the nodes in sub(u).
2step:
1line:对S中的节点以其在原树中的先序访问次序按升序进行排序
5line:若R(v)与R(u)不相交,说明v、u不在以v为根的子树下,即v、u之间没有边
本质上,步骤二按先序访问顺序构造出了CT树,并利用先序区间确定父节点
ECT树:
改变节点:考虑在CT树上的边{u,v},如{1,23},在原树中走{1->17->18->22->23},NN(1) = {2} != NN(18) = {23},18为改变节点(即第一个与NN(u)不同的点);
ECT树为在CT树上加入改变节点后的树;
思考:在CT树上的边{u,v}的NN,只会有两种可能,NN(u),NN(v),因此,改变节点在每个CT边上至多有一个
作用:用于求解使得相同先序区间为同一个NN
对于边{u,v}求改变节点所在的层,注意这里的层的意思是:根节点到节点的边数(相当于边的权值为1)
可以这么理解
再看图
其实求的是距离NN(u)以及NN(v)“相等”的层,即为改变节点所在的层
下面是构造ECT树的伪码
1line:即为了后继对边进行宽度优先遍历
2line:没用,在6line也会求NN(u),可每次循环判断u是否改变,决定是否重新计算NN(u)
6line:如下图所示,NN(v) = { NN(u) or NNsub(v) };若pre_order(NN(u)) >= pre_order(NNsub(v)),那么NN(u)在(2)区域中,
则NN(u) == NNsub(v)==NN(v);若pre_order(NN(u)) < pre_order(NNsub(v)),那么NN(u)在(1)区域中,则需要判断dist(NNsub(v), v)及
dist(v, NN(u))的距离,哪个更小,取更小的节点作为NN(v)
7line:若NN(u) = NN(v),则{u, v}边上没有改变节点
9line:否则利用前述公式求出改变节点所在的层,在原树{u, v}路径上执行a level-on-path query即可求出改变节点z(注意:若边权值不为1,你不可以这么做)
11line:将{u, z},{z, v}加入ECT树