我有 15M(百万)个 DAG(有向无环图 - 实际上是有向超立方体)的集合,我想从中删除同构。常见的算法是什么?每个图都相当小,一个维度为 N 的混合立方体,其中 N 为 3 到 6(目前),导致在 N=6 情况下每个节点有 64 个节点的图。
使用networkx和python,我像这样实现了它,它适用于像300k(千)这样的小集合很好(在几天内运行)。
def isIsomorphicDuplicate(hcL, hc):
"""checks if hc is an isomorphism of any of the hc's in hcL
Returns True if hcL contains an isomorphism of hc
Returns False if it is not found"""
#for each cube in hcL, check if hc could be isomorphic
#if it could be isomorphic, then check if it is
#if it is isomorphic, then return True
#if all comparisons have been made already, then it is not an isomorphism and return False
for saved_hc in hcL:
if nx.faster_could_be_isomorphic(saved_hc, hc):
if nx.fast_could_be_isomorphic(saved_hc, hc):
if nx.is_isomorphic(saved_hc, hc):
return True
return False
一种更好的方法是将每个图转换为其规范排序,对集合进行排序,然后删除重复项。这绕过了检查二进制 is_isomophic() 测试中的每一个 15M 图,我相信上面的实现类似于 O(N!N) (不考虑同构时间),而干净地将所有转换为规范排序和排序应该需要O(N) 用于转换 + O(log(N)N) 用于搜索 + O(N) 用于删除重复项。O(N!N) >> O(log(N)N)
我发现这篇关于规范图标记的论文,但它用数学方程非常简洁地描述,没有伪代码:“McKay 的规范图标记算法” - http://www.math.unl.edu/~aradcliffe1/Papers/Canonical.pdf
tldr:我有大量的图要通过二元同构检查来检查。我相信这样做的常用方法是通过规范排序。是否存在任何打包的算法或发布的直接实现算法(即有伪代码)?