【问题标题】:Faster graph structure generation更快的图结构生成
【发布时间】:2012-07-25 15:15:36
【问题描述】:

我从一个 Nx2 唯一点数组开始,然后为这些点找到 Delaunay edges,一个由 points 的索引组成的 Mx2 数组。还有一个Mx1 对应每条边的权重数组。

我正在尝试将数据放入 Hetland 的“Python 算法 - 掌握 Python 语言中的基本算法”一书清单 2.3 中描述的结构中。结构是:

a, b, c, d, e, f, g, h = range(8)
G = [
    {b:2, c:1, d:3, e:9, f:4}, # a
    {c:4, e:3}, # b
    {d:8}, # c
    {e:7}, # d
    {f:5}, # e
    {c:2, g:2, h:2}, # f
    {f:1, h:6}, # g
    {f:9, g:8} # h
]

其中G[a] 返回与点a 相关的边,G[a][b] 返回在ab 之间的边的权重。

转换的目标是能够使用书中也介绍的一些快速遍历等算法。为了在我现有的数据结构和这个结构之间进行转换,我这样做:

def make_graph(points, edges, weights):
    G = []
    for i in range(len(points)):
        w = numpy.where(edges == i)
        d = {}
        for ind,j in enumerate(edges[w[0],~w[1]]):
            d[j] = weights[w[0][ind]]
        G.append(d)
    return G

这在大型集合上相当耗时(即在 > 15,000 个顶点上需要大约 40 秒)并成为代码中的瓶颈。如何更快地转换成数据结构G

编辑:

仅供参考,使用matplotlib.delaunay.delaunay() 输出中心、边、三角形和邻居,这可能很有用。但是,我还没有想出如何将它们用于此目的。

【问题讨论】:

    标签: python graph dictionary numpy


    【解决方案1】:

    您的代码中有很多不必要的操作。您可以在边缘上一次迭代完成整个事情:

    G = [{} for i in range(len(points))]
    for i,e in enumerate(edges):
      G[e[0]][e[1]] = weights[i]
    return G
    

    这应该会将运行时间从 O(P*E) 减少到 O(E),所以我希望您会看到相当大的加速。

    【讨论】:

    • 你说得对,我有一堆不必要的复杂步骤。这大大减少了其他东西成为瓶颈的时间。
    • 如果图是无向图,还应该加上 G[e[1]][e[0]] = weights[i]。
    猜你喜欢
    • 2019-08-19
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2012-08-15
    • 2021-03-17
    • 2012-05-09
    • 2020-02-05
    相关资源
    最近更新 更多