高效地表示Python中的子图(数据结构)

时间:2016-06-09 08:26:24

标签: python performance data-structures graph

在Python中保留和比较给定输入图G的生成子图的有效方法是什么?

一些细节:

  1. 输入图G是一个有向的简单图,顶点数从n = 100-10000变化。边数 - 可以假设最大值是完整图的10%(通常更少),因此在这种情况下给出最大数量的n *(n-1)/ 10

  2. 有一种算法可以从数字/数千的输入图G子图中生成。并且为每个子图进行一些(耗时的)计算。 配对"子图,计算结果"必须存储以供以后使用(动态编程方法 - 如果已经处理了子图,我们想重新使用其结果)。

  3. 由于点(2.),将子图/结果对存储在子图是关键字的字典中会非常好。如何有效地完成它?有效计算子图哈希值的一些想法可能是?

  4. 让我们假设内存不是问题,我可以找到有足够内存的机器来保存数据 - 所以我们只关注速度。

  5. 当然如果已经很好地使用可能对这个问题有帮助的数据结构(比如来自scipy的稀疏矩阵),那么非常受欢迎。

    我只是想知道你对此的看法,也许还有一些关于解决这个问题的提示。 我知道Python有很好的图形/网络库,比如NetworkX,igraph,graph-tool,它们有非常有效的算法来处理提供的图形。但似乎(或我找不到)有效的方式来实现积分(2. 3。)

1 个答案:

答案 0 :(得分:0)

此处的关键点是您的算法已生成的图形的数据格式。它是否通过添加顶点和边来构造新图形?它是可擦写的吗?它是否使用给定格式(矩阵,邻接列表,顶点和节点集等)。

如果你有选择的话,因为你的子图有一个“低”基数,而且因为空间不是问题,我会将子图存储为位掩码数组(位掩码部分是可选的,但它是可清除的并且是紧凑的组)。那么子图表示就是

  • L全局图G中的节点引用列表。它也可以是用作哈希的位掩码
  • A一个位掩码数组(矩阵),其中A[i][j]是边L[i] -> L[j]
  • 的真值

这利用了Python整数的无限大小的低空间要求。空间复杂度为O(n * n)但您可以获得有效的遍历并且可以轻松地对结构进行哈希处理。