zoukankan      html  css  js  c++  java
  • 读论文系列: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树
     
  • 相关阅读:
    Reborn
    个人总结
    第十六周个人进度条
    梦断代码阅读笔记03
    第十五周个人进度条
    第十四周个人进度条
    第十三周个人进度条
    冲刺9
    冲刺8
    事后诸葛亮会议
  • 原文地址:https://www.cnblogs.com/hzhesi/p/3727891.html
Copyright © 2011-2022 走看看