Page 74 - 《软件学报》2021年第9期
P. 74

2698                                 Journal of Software  软件学报 Vol.32, No.9,  September 2021

         共子串为“public,int,for,if”.字符串 S 和 T 分别为快速排序和冒泡排序关键字流图节点存储信息组合而成.根据
         字符串 S 和 T 的最大公共子串构建关键字流图最大公共子图.
                        Table 2    Finding common keywords using dynamic programming algorithm
                                       表 2   动态规划法查找公共关键字
                          S
                    T         public    int     if      null     for      if      null
                     public   public   “⋅”      “⋅”      “⋅”     “⋅”      “⋅”     “⋅”
                       int     “⋅”   Public,int  “⋅”     “⋅”     “⋅”      “⋅”     “⋅”
                      for      “⋅”     “⋅”      “⋅”      “⋅”     for      “⋅”     “⋅”
                      for      “⋅”     “⋅”      “⋅”      “⋅”     for      “⋅”     “⋅”
                       if      “⋅”     “⋅”      “⋅”      “⋅”     “⋅”     for,if   “⋅”
                      null     “⋅”     “⋅”      “⋅”      “⋅”     “⋅”      “⋅”     “⋅”
             图 6 是冒泡排序和快速排序关键字流图的最大公共子图(灰色部分).灰色部分节点存储了字符串 S 和 T 公
         共子串中的关键字,关键字流图的最大正是由 S 和 T 公共子串的关键字所在的节点构成.



                                    public                         public
                                     int                            int

                                     if                             for

                                     for     null                   for

                                     if
                                                                    if
                              null        null
                                                                           null
                                     null                           null



                              (a)  快速排序关键字流图                   (b)  冒泡排序关键字流图
                          Fig.6    Maximum common sub-graph of keyword flow graph (in gray)
                                   图 6   关键字流图的最大公共子图(灰色部分)
         2.4   程序相似性的判定

             待测程序快速排序与冒泡排序的关键字流图最大公共子图已经生成,本节利用最大公共子图距离算法(见
         定义 5)计算程序相似程度.最大公共子图距离公式(公式(1))中,|G 1 |和|G 2 |分别表示程序快速排序和冒泡排序的
         节点数,mcs|G 1 ,G 2 |表示最大公共子图的节点数.由图 6 知:冒泡排序与快速排序存储关键字的节点都为 5,关键字
         流图最大公共子图的节点为 4,故 max(|G 1 |,|G 2 |)=5,mcs|G 1 ,G 2 |=4,将具体数值带入公式,可得最大公共子图距离
         D(G 1 ,G 2 )=0.2.公式(2)将程序相似度定义为 1−D(G 1 ,G 2 ),已知冒泡排序和快速排序的最大公共子图距离 0.2,故两
         程序的相似度 S(G 1 ,G 2 )=(1−D(G 1 ,G 2 ))×100%=80%.
             基于关键字流图判定程序相似度的伪代码见算法 1.
             算法 1.  程序相似度的判定.
             输入:待测程序 program1,program2;
             输出:待测程序相似度 similarity.
   69   70   71   72   73   74   75   76   77   78   79