Page 398 - 《软件学报》2025年第4期
P. 398

1804                                                       软件学报  2025  年第  36  卷第  4  期


                                                                                                  v 从候选
                                           ;
                 中  id 为顶点  u 的编号, 表示为   u.id nnd 为顶点  u 在  (S L ,S R ) 中的非邻居数量, 表示为  u.nnd . 基于该结构, 当
                                         v
                 集中加入   (S L ,S R ) 时, 只需利用   与候选集中其他顶点   u 是否是邻居关系以及       v.nnd  与  u.nnd  的大小即可确定顶点  u
                 是否可以扩展新的当前解. 基于该思想, 本文设计了一种新的更新算法, 其伪代码如算法                         2  所示. 容易看出其时间复
                 杂度与候选集的大小线性相关, 因为判断            (v.id,u.id) 是否是图  G  中的边可以基于索引技术在线性时间内完成.
                 算法  2.   Update(S L ,v,S R ,C L ,C R ) .

                   ¯
                   d(S L ,S R ) ← G(S L ,S R ) 中缺失的边数;
                 1.
                           ′
                    ′
                          ;
                 2.   C ← ∅ C ← ∅ ;
                    L      R
                 3. foreach   u ∈ C L  then
                       ¯
                 4.  if   d(S L ,S R )+v.nnb+u.nnb ⩽ k then
                        ′
                 5.     C .push(u) ;
                        L
                 6.   end if
                 7. end for
                 8. foreach   u ∈ C R  then
                 9.  if   (v.id,u.id) < E  then   u.nnb ← u.nnb+1 ; end if
                       ¯
                 10.   if   d(S L ,S R )+v.nnb+u.nnb ⩽ k then
                         ′
                 11.     C .push(u) ;
                         R
                 12.   end if
                 13. end for
                         (C ,C ) ;
                           ′
                              ′
                 14. return    L  R
                    值得注意的是算法        2  仅展示了顶点   v 加入  S L  时更新候选集  (C L ,C R ) 的方法, 而排除集  (X L ,X R ) 的更新方法与
                 此类似. 同时当    v 加入   S R  时, 候选集与排除集的更新方法与      v 加入  S L  时也是类似的. 为了避免重复, 本文省略了针
                 对上述情况的更新方法.

                 4.4   分支优化技术                      (X L ,X R )  中存在顶点
                    在当前递归分支无法利用定理            1  来产生子递归分支时, 算法       1  将使用传统的分支定界技术以保证递归的继
                 续. 然而该方法的效率很低, 可能产生大量的冗余分支. 本文发现, 在执行分支定界技术过程中, 若用于扩展候选集
                 (S L ,S R )  的顶点   能够使得新的当前解在候选集中具有更多的非邻居, 则可以提升枚举算法的性能. 因为当前解
                             v
                 (S L ,S R ) 在候选集中的非邻居数量越多, 不仅能够减少分支定界枚举的使用, 而且还有利于提高对称集合枚举的效
                 率. 为此, 当递归分支不满足定理         1  的要求时, 本文将从候选集      (C L ,C R ) 中选择在  G(S L ∪C L ,S R ∪C R ) 中度数最小的
                 顶点执行分支定界枚举.
                    除了上述提到的, 在算法        1  的  Branch  函数中, 本文还发现可以利用排除集中的顶点来判断当前递归是否可以
                                                                                             (S L ,S R ) 的  k-缺
                 提前终止, 以进一步减少冗余计算. 其主要思想是, 如果能够确定当前搜索空间中任何包含当前解
                 陷二团在原始二部图中一定不是极大的, 则当前递归可以直接终止计算. 为此, 可以得到如下结论.
                    定理   8. 在某个递归分支中, 若排除集                         v ∈ X L  (或者  u ∈ X R  ) 满足  (S R ∪C R ) ⊆ N v (G)  (或者
                 (S L ∪C L ) ⊆ N u (G)  ), 则当前搜索空间中不存在极大解.
                           (A,B) 是当前递归搜索到的极大                                            (S L ∪C L ) ⊆ N u (G) ), 可
                    证明: 设                           k-缺陷二团, 基于条件      (S R ∪C R ) ⊆ N v (G) (或者
                 以容易看出    (A∪{v},B) (或者  (A,B∪{u}) ) 一定是一个更大的  k-缺陷二团. 因此, 该递归分支中的任何解都不是极大的.
                    综合上述所有的优化技术, 可以得到一种改进的极大                 k-缺陷二团枚举算法, 其具体的伪代码如算法              3  所示. 具
                 体的, 算法  3  首先基于排序优化将原始二部图划分成一系列的子图                   ≻    ≻     ) (第  1–3  行), 然后利用上界剪
                                                                      v i  v i  ,E v i
                                                                     G = (L ,R v i
                 枝技术以减少子图的规模         (第  4  行), 最后在各个子图中调用     Branch  函数  (第  5  行) 枚举极大  k-缺陷二团. 值得注意
                 的是, 递归调用    Branch  加入了上界剪枝技术、线性更新技术以及分支优化技术.
   393   394   395   396   397   398   399   400   401   402   403