在Python中快速找到给定大小的所有连通子图的方法?

2024-02-04

[注:快速解决方案在answer https://stackoverflow.com/a/75751315/12842085然而,需要进一步改进速度。]

给定一个无向稀疏连接图G with n顶点。我正在寻找一种快速的方法来找到所有连接的子图G with m顶点。可以假设mn并且顶点的度数G is deg(v)n.

图解示例

对于我们的例子n=5, m=3.

4个连通子图为:(0,1,2),(1,2,3),(0,2,3),(2,3,4)

代码示例

以下代码使用networkx and ego_graph是相当慢的。绘制一张图大约需要 100 秒n=100, deg(v)=10, m=4。这是一个例子mn and deg(v)n。案子n=10000 需要永恒的时间。

import networkx as nx
import itertools
import time

n=100   #nodes in graph
deg=10  #node degree in graph
m=4     #nodes in subgraph

graph=nx.gnm_random_graph(n,n*deg,seed=1)#construct random graph

starttime=time.time()
G = graph.copy()
all_connected_subgraphs = []
radius=m-1
for n in graph.nodes():
    egoG = nx.ego_graph(G,n,radius=radius,center=False)# all closeby nodes
    for sn in itertools.combinations(egoG, radius):# test all combinations of closeby nodes
        SG=[n,*sn]
        G_sub=G.subgraph(SG)
        if nx.is_connected(G_sub):
            all_connected_subgraphs.append(SG)
    G.remove_node(n)

endtime=time.time()
print(endtime-starttime)        

缓慢的脚步是线条G_sub=G.subgraph(SG) and if nx.is_connected(G_sub):分别消耗总计算时间的 20% 和 80%。

In a 相关问题 https://stackoverflow.com/q/54440779/12842085没有给出有效的解决方案。


这是使用递归生成器函数的解决方案:我没有使用 NetworkX,因此该图表示为邻居集的列表。

def all_connected_subgraphs(g, m):
    def _recurse(t, possible, excluded):
        if len(t) == m:
            yield t
        else:
            excluded = set(excluded)
            for i in possible:
                if i not in excluded:
                    new_t = (*t, i)
                    new_possible = possible | g[i]
                    excluded.add(i)
                    yield from _recurse(new_t, new_possible, excluded)
    excluded = set()
    for (i, possible) in enumerate(g):
        excluded.add(i)
        yield from _recurse((i,), possible, excluded)

这是一种回溯算法,它表示,给定大小的部分子图< m以及允许添加的一组节点,添加每个节点并扩展可能的选项集以包括从该节点可到达的所有节点。为了减少对称性,我们跟踪哪些节点已经被使用并将它们添加到excluded set.

使用示例图进行演示:

>>> example_graph = [{1, 2}, {0, 2}, {0, 1, 3}, {2, 4}, {3}]
>>> list(all_connected_subgraphs(example_graph, 3))
[(0, 1, 2), (0, 2, 3), (1, 2, 3), (2, 3, 4)]

这是我用来生成随机图的代码,它应该相当于您从中采样的 G(n, m) 分布:

import random
import itertools as it

def random_graph(n, num_edges):
    adj_sets = [set() for i in range(n)]
    all_edges = list(it.combinations(range(n), 2))
    random.shuffle(all_edges)
    for (i, j) in all_edges[:num_edges]:
        adj_sets[i].add(j)
        adj_sets[j].add(i)
    return adj_sets

在我的笔记本电脑上,从具有 100 个节点和 1,000 个边的图中查找大小为 4 的所有连接子图的运行时间不到半秒,如您的基准测试:

>>> g = random_graph(100, 1000)
>>> import timeit
>>> timeit.timeit(lambda: list(all_connected_subgraphs(g, 4)), number=1)
0.42606337900360813

注意list这里需要耗尽生成器,否则算法实际上不会生成任何子图。如果您只想使用 a 迭代所有连接的子图for循环,那么你不需要先将它们放入列表中。

有多种“简单”的方法可以优化它,例如每个节点的边集i可以首先过滤以删除小于节点的“后边缘”i,并且可以用堆栈替换递归以创建不使用的迭代算法yield(这可能会产生相对较大的性能开销)。但除非您的输入需要更大或更密集,否则可能不需要这些优化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中快速找到给定大小的所有连通子图的方法? 的相关文章

  • 在 Windows 上导入 scipy.linalg 时出错(python 3.3)

    我在 Windows 上使用 python 3 3 我下载了scipy 0 13 2 win32 py3 3 exe from scipy 库 http www lfd uci edu 7Egohlke pythonlibs scipy并安
  • 如何用PHP进行有向图绘制?

    我正在寻找一种在 PHP 中绘制有向图的方法 如http upload wikimedia org wikipedia commons 0 08 Directed acirclic graph png http upload wikimed
  • 将文件拆分为块

    我正在尝试分割格式为以下的文件 some garbage lines target G0 S0 type xy 0 108847E 02 0 489034E 04 0 108711E 02 0 491023E 04 0 108574E 02
  • 相当于“setup.py”中的“--find-links”

    相当于什么 find links f标记为pip in setup py I know dependency links存在 但这需要指向一个特定的文件 我想要类似的东西 f它可以指向一个链接列表 可以根据版本和操作系统从中选择包 In a
  • 适用于 Python 3.x 的 Hive 客户端

    是否可以使用 Python 3 x 连接到 hadoop 并运行 hive 查询 我正在使用Python 3 4 1 我发现可以按照这里写的方式完成 https cwiki apache org confluence display Hiv
  • min() arg 是一个空序列

    我试图找到矩阵行中的最小元素 但有两个条件 1 它必须 gt 0 2 并且这个点一定不能被访问 is visited k is False 我下一步正在尝试做 min x for x in matr sum i if x gt 0 if i
  • 如何将 UPX 与 pyinstaller 一起使用?

    如何将 UPX 与 pyinstaller 一起使用 我正在关注文档 我已经下载了UPX 我的文件如下所示 import csv import selenium import pandas print Hello 然后我运行 pyinsta
  • 如何将嵌套的Python字典转换为简单的命名空间?

    假设我有一个深度为 N 的嵌套字典 如何将每个内部嵌套字典转换为简单的命名空间 example input key0a test key0b key1a key2a keyNx key2b test key1b test example o
  • 在Python 3中将二进制字符串转换为字节数组

    尽管有很多相关的问题 但我找不到任何符合我的问题的问题 我想更改二进制字符串 例如 0110100001101001 转换成字节数组 同一个例子 b hi 我试过这个 bytes int i for i in 011010000110100
  • 为什么实现 __iter__ 的对象不被识别为可迭代的?

    假设您使用包装对象 class IterOrNotIter def init self self f open tmp toto txt def getattr self item try return self getattribute
  • 找不到仅适用于数字的 Tesseract 4.0 tessdata

    正如这篇文章中所说 pytesseract 仅使用 tesseract 4 0 数字不起作用 https stackoverflow com questions 46574142 pytesseract using tesseract 4
  • 在 python 3 中压缩字符串?

    我不明白 在 2 X 中它起作用了 import zlib zlib compress Hello world 现在我有一个 zlib compress Hello world TypeError must be bytes or buff
  • = 上的语法无效? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我是 python 的初学者 试图使用 yes no 来制作一个非常简单的程序 它表示该行中的第一个 存在语法错误 if monk
  • “WebDriverWait(驱动程序,20)”是什么意思?

    我正在使用以下 Selenium 代码 import time from selenium webdriver support ui import WebDriverWait from selenium webdriver common b
  • ipython3 笔记本垂直边距/标记线为 80 个字符

    如何使 ipython3 笔记本在 80 个字符处显示垂直边距 标记线 如何获取 ipython3 笔记本中的 i bar 位置 例如第 30 行第 56 个字符 这些功能有助于编写符合 PEP8 的代码 Spyder 中提供了这些功能 更
  • 大收件箱上的 imaplib.select:命令参数太多

    我正在尝试从 python 脚本访问 Gmail 中的电子邮件 我使用的代码如下 import imaplib m imaplib IMAP4 SSL imap gmail com m login username password m s
  • 地图与星图的性能?

    我试图对两个序列进行纯Python 没有外部依赖 逐元素比较 我的第一个解决方案是 list map operator eq seq1 seq2 然后我发现starmap函数来自itertools 这看起来和我很相似 但事实证明 在最坏的情
  • 避免在列表理解中计算相同的表达式两次[重复]

    这个问题在这里已经有答案了 我在列表理解中使用一个函数和一个 if 函数 new list f x for x in old list if f x 0 令我恼火的是这个表达f x 在每个循环中计算两次 有没有办法以更清洁的方式做到这一点
  • 连接运算符 + 或 ,

    var1 abc var2 xyz print literal var1 var2 literalabcxyz print literal var1 var2 literal abc xyz 除了带有 的自动空格之外 两者有什么区别 哪个通
  • Tensorflow ctc_loss_calculator:找不到有效路径

    当运行我的神经网络 双向 LSTM 进行音频识别时 我使用连接主义时间分类 CTC 但在某些时候 训练网络时我几乎每批都会收到来自 Tensorflow 的警告 W tensorflow core util ctc ctc loss cal

随机推荐

  • 如何移动 Atomikos 的 tm.out 和 *.epoch 文件的位置?

    我正在运行一个使用 Atomikos 的 J2SE 应用程序 它将大量日志文件转储到当前目录 我想将这些文件的位置移动到 tmp 但我找不到可以在 Spring XML 配置文件中设置的配置属性 Atomikos 文档引用了一个属性 com
  • 从 R 中的 Excel 文件中提取超链接

    如何在 Excel 中获取包含超链接文本的单元格并提取超链接部分 我发现了一种超级复杂的方法来提取超链接 library XML rename file to zip my zip file lt sub xlsx zip my excel
  • Django Rest框架中的HTTP 403

    所以我有一个基于函数的视图 与 Django Rest 框架一起使用 如下所示 from rest framework permissions import IsAuthenticated from rest framework decor
  • Vim、NERDtree 在会话恢复中未恢复

    当我有一个 NERDtree 面板并保存一个 Vim 会话 mksession 文件名 然后打开该会话 vim S 文件名 时 该面板会打开并标记为 NERDtree 但不会填充 如果我从命令行尝试 NERDtree 窗口确实会填充 但现在
  • 如何在 group_concat() 中使用 sum()?

    问题已修改 真的想要一个 group concat 的总和 表 商店 shop id name state 0 shop 0 5 1 shop 1 5 2 shop 2 5 3 shop 3 2 表 项目 shop item quantit
  • 在 C# 中打印 excel(使用 Spreadsheetgear 生成)

    在 C 中 我正在生成特定格式的 Excel 我必须在 click print 上打印相同的 Excel 格式 P s Microsoft Office 不可用 请使用 SpreadSheetGear 来实现此目的 如果您有 UI 并且正在
  • MySQL 表的交错行

    我有一个包含数据和类的表 例如 DATA Class 1 A 2 A 5 B 10 A 2 A 45 B 90 B 我想将这两个类交错以获得如下内容 DATA Class 1 A 5 B 2 A 45 B 2 A
  • Symfony2 Forms - 如何在表单构建器中使用参数化构造函数

    我正在学习使用 Symfony2 在我读过的文档中 与 Symfony 表单一起使用的所有实体都有空的构造函数 或者根本没有 例子 http symfony com doc current book index html http symf
  • 扩展方法什么时候会中断?

    我们目前正在讨论 NET 中的扩展方法是否不好 或者在什么情况下扩展方法可能会引入难以发现的错误或以任何其他方式出现意外行为 我们想出了 为不受您控制的类型编写扩展方法 例如 使用 GetTotalSize 扩展 DirectoryInfo
  • Comparer 类的用途是什么?

    其目的是什么Comparer
  • Dart 包 - 如何隐藏公共类中的内部方法?

    我正在开发一个关于 Flutter 的包 我在类中有一些方法仅对包本身有用 对导入我的包的程序员没有用 是否可以在公共类中隐藏这些方法以进一步实现 我正在尝试使用 internal注释 但我仍然可以看到标记为包外部内部的方法 Example
  • Java 中的枚举是否允许有 setter?

    我有一个enum它有一个参数 字段 是String 我可以在这个领域拥有二传手吗 public enum Blah Monday a Tuesday b private final String letter Blah String let
  • 对 csv 文件进行排序

    我有一个 csv 文件 需要对其进行排序 该文件如下所示 ID Name Surname Age Salary 1 John Asben 33 1000 2 Adam Smith 22 1200 3 Amanda J 22 2000 4 G
  • 扩展程序和小书签的内容安全策略

    Github有以下内容内容安全政策 https w3c github io webappsec specs content security policy 内容安全策略 默认 src 脚本 src asset cdn github com
  • 无法在 Yosemite DP 7 上安装 Cocoapods

    我在安装在单独分区上的 Yosemite DP 7 上安装 Cocoapods 时遇到问题 我已经尝试按照上找到的说明进行操作Cocoapods 与 Xcode 6 和 10 10 Yosemite https stackoverflow
  • 使用 JavaScript 获取 div id

    这是一些 HTML div class results div something div div something else div div blah blah blah div div etc div div 现在如果我可以使用 jQ
  • 从多个 hdf5 组创建数据集

    从多个 hdf5 组创建数据集 团体代码 np array hdf get all my groups 然后我添加了用于从组创建数据集的代码 with h5py File train h5 w as hdf hdf create datas
  • SQLite 内存数据库的优点[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我今天从一本关于 SQLite 的书中读到了关键字 memory 但它只说了它是什么 如何使用 而且解释太短了 所以我在这里搜索了更多
  • React js 日期选择器的多个实例

    如果我使用日期选择器的多个实例 我在更新反应日期选择器上的日期时遇到问题 日期选择器组件
  • 在Python中快速找到给定大小的所有连通子图的方法?

    注 快速解决方案在answer https stackoverflow com a 75751315 12842085然而 需要进一步改进速度 给定一个无向稀疏连接图G with n顶点 我正在寻找一种快速的方法来找到所有连接的子图G wi