在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中快速找到给定大小的所有连通子图的方法? 的相关文章

  • 没有名为 pandas_datareader 的模块

    我刚刚安装了pandas datareader using pip install pandas datareader运行成功 现在我尝试将它用于教程 当我尝试导入时出现此错误 import pandas datareader as pdr
  • 如何获取 Flask 中当前的基本 URI? [复制]

    这个问题在这里已经有答案了 在下面的代码中 我想将 URL 存储在变量中以检查发生 URL 错误的错误 app route flights methods GET def get flight flight data mongo db fl
  • 如何将 xlsx 读取为 pandas 数据框,并将公式作为字符串

    我有一个包含一些计算列的 Excel 文件 例如 我在 a 列中有一些数据 而 b 列是使用 a 列中的值计算的 我需要将新数据附加到 a 列并计算 b 列并保存文件 import pandas as pd df pd DataFrame
  • 从谷歌云存储桶加载数据

    这是一个从谷歌云存储桶加载数据的函数 action dataset folder path action data set zip path actions zip url http console cloud google com sto
  • 将大型 Twitter JSON 数据 (7GB+) 加载到 Python 中

    我已经通过 AWS 设置了一个公共流来收集推文 现在想做一些初步分析 我的所有数据都存储在 S3 存储桶中 5mb 文件 我下载了所有内容并将所有文件合并为一个 每条推文都按照 Twitter 规范存储为标准 JSON 对象 基本上 合并的
  • pandas 数据框列表的列表列表

    我有一个列表的列表 最外层列表的长度为 20 单独的类别 中间列表的长度可变 时间戳列表 内部列表的长度为 5 分割每个时间戳 例如 sTimestamps 0 5 Tue Feb 7 10 06 30 2017 Tue Feb 7 10
  • 完整无向图的最有效实现

    问题背景 我目前正在开发蚁群系统算法的框架 我想我应该从尝试它们解决的第一个问题开始 旅行商问题 TSP 我将使用 C 来完成该任务 所有 TSP 实例将包含一个完整的无向图 每个边有 2 个不同的权重 Question 到目前为止 我只使
  • 无法在 VS Code 中导入

    我是 python 新手 一直在使用 VS code 现在我正在研究汤普森采样问题 需要 numpy 和 matplotlib 我已经导入了这两个库 但 VS code 给出了无法导入的错误 我知道我必须使用 PIP 进行安装 并且我已经看
  • 在unittest.main()之后执行命令

    我从另一个 Python 脚本调用以下脚本 测试 py 日志文件 它应该运行测试并将结果保存在日志文件中 但由于某种原因 之后的命令unittest main testRunner runner 没有被执行 我什至不确定文件写入后是否会关闭
  • 根据graphviz_layout中的权重设置边长

    我正在尝试使用networkx绘制加权图 我正在使用生成顶点的位置graphviz layout 我希望图中的边长与我使用的边权重成比例 以下是我实现此目的的代码片段 import networkx as nx from networkx
  • 导入错误 - 发生了什么?

    Python 导入 再次 我有这个文件结构 test start py from scripts import main scripts init py empty main py from import install install p
  • 在 python3 中优雅地退出多进程[重复]

    这个问题在这里已经有答案了 我想通过 Ctrl C SIGINT 或用户输入优雅地退出程序 如果可能的话 终端应该提示类似的内容 按 Enter 键终止 Python 3 6 执行的代码 def worker process i 0 whi
  • 循环列表的值[重复]

    这个问题在这里已经有答案了 我是编码新手 正在尝试编写一个简单的代码 该代码将采用一个列表 例如 1 2 3 并循环元素 n 次 所以如果n 1 我应该得到A 3 1 2 如果n 2 我应该得到A 2 3 1 我写的代码是 n 1 j 0
  • 使用 Boto3 进行 IAM 身份验证的 SQLAlchemy 可刷新凭证

    我使用 Boto3 生成的身份验证令牌通过 Sqlalchemy 连接到 Amazon RDS self client boto3 client rds region name eu central 1 self token self cl
  • 如何在 Django Admin 的“更改”页面中显示内嵌上传的图像?

    我正在尝试在中显示内联上传的图像 变更列表 页面在 Django 管理中 这是我的代码如下 models py from django db import models class Product models Model name mod
  • 我无法使用 Python 和 Facebook Marketing API 获取所有 Facebook 营销活动的统计信息

    我正在尝试检索以下指标 date campaign name impressions clicks spend 在我的 Facebook 帐户中的所有活动中 但显然我编写的脚本仅返回某些活动的统计数据 而不是全部 它仅返回大多数营销活动的营
  • 如何在离线绘图中绘制垂直线?

    如何使用 python 以离线方式绘制一条垂直线 我想在 x 20 x 40 和 x 60 处添加线条 所有线条都在同一个图中 def graph contracts self trace1 go Scatter x np array ra
  • 在 NetworkX 中使边缘更粗

    student id 0 1 2 3 4 5 6 7 8 9 10 11 12 0 131X1319 1 14 6 16 1 10 8 15 15 17 15 18 16 1 13212YX3 1 1 4 8 11 9 14 7 0 3 0
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • neo4j - python 驱动程序,服务不可用

    我对 neo4j 非常陌生 我正在尝试建立从 python3 6 到 neo4j 的连接 我已经安装了驱动程序 并且刚刚开始执行第一步 导入请求 导入操作系统 导入时间 导入urllib 从 neo4j v1 导入 GraphDatabas

随机推荐

  • 如何移动 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