【问题标题】:Counting Subgraph Instances计算子图实例
【发布时间】:2010-11-23 19:30:01
【问题描述】:

假设我有一个大的(几千个节点)有向图 G 和一个小得多的(3-5 个节点)有向图 g。我想计算 g 中有多少个 g 的同构。换句话说,我想知道 G 中有多少独特的节点集与 g 匹配。我意识到这是子图同构问题的一个实例,因此是 NP 完全的。但是,鉴于您可能假设 g 很小,是否有任何合理有效的算法可以做到这一点?

【问题讨论】:

  • 也许math.stackexchange.com 会给您带来更好的结果 - 我知道您所寻求的是一种算法,但您或许可以从理论上设计一种算法
  • 您的问题是“一种情况”还是您想要一个通用算法。我问只是因为 g 边缘的基数上的一些特征可能有很大帮助......
  • 如果您的小图的大小没有随着 N 的函数增长,那么即使是蛮力算法也应该是多项式时间,因为 N 选择 k 是 O(N^k)。跨度>
  • @mcbeckish:我想到了 O(N^k) 算法,但那可能行不通。
  • 是的,即使是多项式时间算法也可能需要很长时间。我只是想澄清一下,如果较小图的大小是固定的,那么这不是 NP-Complete。

标签: algorithm graph graph-theory np-complete isomorphism


【解决方案1】:

虽然图同构通常是 NP 完全的,但您在现实世界中遇到的问题通常很容易。一个简单的暴力破解就足够了:让M_i 是一组从 g 的前 i 个节点到 G 的节点的映射。从包含空映射的 m_0 开始,一次扩展一个节点,丢弃任何映射这违反了约束x->y iff m(x)->m(y)

您需要对 g 中的节点进行排序,以便尽早进行大量修剪。假设您的图非常稀疏,您需要一个尽可能早地完成尽可能多边的订单,可能是来自最高度节点的 dfs。

【讨论】:

  • 我之前也想过这个,但我认为可能有一个更聪明的解决方案。事实证明,对于我正在处理的问题大小,这只需几秒钟即可运行。我想教训是避免事情过于复杂。
猜你喜欢
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多