Page 12 - 《软件学报》2021年第11期
P. 12

3338                               Journal of Software  软件学报 Vol.32, No.11, November 2021

                                                                                4
                                                           4
                             3
                 当前 1 和结点 n 的 maxroot=3 中选择最大值,故结点 n 的 maxroot=3.因此,结点 n 右上方标记为(1,3).当网树创
                                                           2
                                                                                2
                             1
                                                                                  3
                 建完毕后,从叶子层至树根层逐层更新每个结点的 minleaf 和 maxleaf.这里以结点 n 为例,易知其可抵达的最小
                                                                                  1
                                             3
                 叶子为 7,最大叶子为 9,于是,结点 n 右下方的标记为(7,9).运用最小、最大根和最小、最大叶子,可以方便地确
                                            1
                 定该结点是否满足长度约束:若该结点的长度区间[minleaf−maxroot+1,maxleaf−minroot+1]与长度约束 LEN 存
                                                                        9
                 在交集,那么此结点就满足长度约束;否则,就不满足长度约束.如结点 n ,其 minleaf 和 maxleaf 为(12,12),minroot
                                                                        1
                                                                                              9
                 和 maxroot 为(9,9),那么此结点的长度区间为[4,4],与长度约束 LEN=[5,7]不存在交集,所以,结点 n 不满足长度
                                                                                             1
                 约束,即出现〈9,10,11,12〉不满足长度约束.因此,本例中满足间隙约束及长度约束的出现全集 R 为
                              {〈1,2,5,7〉,〈1,4,5,7〉,〈3,4,5,7〉,〈3,6,8,9〉,〈7,10,11,12〉,〈12,13,15,16〉,〈12,14,15,16〉}.
                                    (1,1)   (3,3)            (7,7)   (9,9)  (12,12)  (16,16)
                                 1       3                7       9       12      16
                                   (7,7)    (7,9)           (12,12)  (12,12)  (16,16)  (16,16)
                                                   (3,3)
                                    (1,1)   (1,3)           (7,9)           (12,12)  (12,12)
                                 2       4       6       10               13      14
                                    (7,7)   (7,7)   (9,9)   (12,12)         (16,16)  (16,16)
                                    (1,3)           (3,3)   (7,9)           (12,12)
                                 5               8       11               15
                                    (7,7)           (9,9)   (12,12)         (16,16)
                                   (1,3)            (3,3)   (7,9)           (12,12)
                                 7               9       12               16
                                    (7,7)           (9,9)    (12,12)         (16,16)
                                     Fig.4    NetTree with minroot, maxroot, minleaf, and maxleaf
                                        图 4   具有最小、最大根及最小、最大叶子的网树

                                                                                                       i
                    本文创建网树的基本原理如下            [25,26] :逐一读取序列中每个字符 s i ,若其与 p 1 相同,则直接创建网树树根 n ,
                                                                                                       1
                                                                                                       i
                 并设置最小、最大根均为 i;若其与 p j (j>1)相同,且第 j−1 层存在与 s i 满足间隙约束条件的结点,则创建结点 n ,
                                                                                                       j
                                          i
                 并在第 j−1 层寻找所有与结点 n 满足间隙约束的双亲结点,建立父子关系,并更新结点 n 的最小、最大根.当全
                                                                                      i
                                          j                                           j
                 部字符读取完毕后,网树创建完毕.此时从网树的叶子层向树根层,逐层逐一更新各个结点的最小、最大叶子.具
                 体创建算法如算法 1 所示.
                    算法 1. CreNetTree.
                    输入:序列 S 及模式 P.
                    输出:NetTree.
                    1:   for i=1 to n step 1 do
                    2:     for j=1 to m step 1 do
                    3:         if p 1 =s i  then
                                            i
                    4:            NetTree[1].add( n )并设置最小、最大根均为 i;
                                            1
                    5:         else if p j =s i 且第 j−1 层存在与 i 满足间隙约束的结点  then
                                           i
                    6:            NetTree[j].add( n );
                                            j
                                                                               i
                    7:            与第 j−1 层满足间隙约束的所有结点建立父子关系,并更新 n 的最小、最大根;
                                                                               j
                    8:         end if
                    9:     end for
                    10:   end for
                    11:   for j=m to 1 step −1 do
   7   8   9   10   11   12   13   14   15   16   17