如何加速检查并行边缘图的O(n ^ 2)算法?

时间:2015-10-21 06:54:42

标签: python algorithm graph

我在这里有一段代表性的代码,我一直在努力检查图中的平行边。看它目前的形式是非常人为的......我需要帮助的只是算法,这是一个缓慢的O(n ^ 2)(尽我所知),字符串比较算法。

真实的图形是成千上万的边缘。我想知道是否有更快的方法来做到这一点。请注意我创建的并行边的特殊情况,它表明需要所有字符串检查逻辑。

class graph_edge:
    def __init__(self, node1, node2):
        self.node1 = node1
        self.node2 = node2
    def __str__(self):
        return '%s <-> %s' % (self.node1, self.node2)

graph_edges = [graph_edge(('a-1','b-1'),('c-1','d-1')), graph_edge(('e-1','f-1'),('g-1','h-1')), graph_edge(('c-1','d-1'),('a','1-b-1'))]

# check list of edges for any that are parallel
num_deleted = 0
for x, a in enumerate(graph_edges):
    for y, b in enumerate(graph_edges[0:x]):
        if ( ( ( '%s-%s' % a.node1 == '%s-%s' % b.node1 )   and
               ( '%s-%s' % a.node2 == '%s-%s' % b.node2 ) ) or
             ( ( '%s-%s' % a.node1 == '%s-%s' % b.node2 )   and
               ( '%s-%s' % a.node2 == '%s-%s' % b.node1 ) ) ):
            print '(%s)  and  (%s) are parallel' % (a, b)
            del graph_edges[x]
            num_deleted += 1

print '%s parallel edges were found' % ( num_deleted if num_deleted else 'no' )

1 个答案:

答案 0 :(得分:0)

您可以在

之前轻松使用Hash来检查它是否存在

UPD1

您可以使用dict()。对于边e,首先检查它是否存在于dict()中,然后将其放入dict()

字典是通过哈希方法实现的