替代这个python代码?

时间:2016-08-22 19:07:44

标签: python sorting minimum-spanning-tree prims-algorithm

我有一行代码,我不完全理解,想要一些更容易的替代品。这样做,使用weightList,它是彼此连接的边的列表,并从图中返回具有最低对应值的边列表(邻接矩阵)。这是Prim的最小生成树问题。

edge = sorted(weightList, key=lambda e:graph[e[0]][e[1]])[0];

4 个答案:

答案 0 :(得分:3)

稍微分解一下就足够了。这个怎么样?

get_edge_weight = lambda e: graph[e[0]][e[1]]
sorted_weights = sorted(weightList, key=get_edge_weight)
edge = sorted_weights[0]

答案 1 :(得分:0)

完全如你所说:对于所有边缘,找到图中最低的值。

i, j = current_edge = weightList[0]
current_min = graph[i][j]

for edge in weightList[1:]:
    i, j = edge

    if graph[i][j] < current_min:
        current_min = graph[i][j]
        current_edge = edge

weightList的第一条边开始,然后迭代所有其他边以尝试找到较低的值。退出循环时,current_edge是具有最低值的边缘。

话虽这么说,但尝试理解你的代码可能是值得的。我假设你知道sorted做了什么。要对weightList进行排序,sorted使用参数key,这是一个返回值的函数。在您的情况下,函数会返回边缘位置graph中的值。 sorted将使用此值将边缘进行比较。

因此,这会将所有边缘从具有最低值的边缘排序到具有最高值的边缘。然后,一旦对其进行排序,就会获取第一个元素,即具有最低值的边缘。

在算法上,使用sorted来完成这项工作并不是一个好主意,因为它的时间复杂度为O(n log n)。相比之下,我的算法是O(n)(但可能更慢,因为我假设{C}中实现了sorted。相反,您可以使用min使用标准函数在O(n)中获得相同的结果,这当然是所有三个中最有效和最易读的选项:

edge = min(weightList, key=lambda (i,j): graph[i][j])

答案 2 :(得分:0)

如果你希望代码少一点&#34; compact&#34;,这应该可以解决问题:

shortest = weightList[0]

for edge in weightList:
    if graph[edge[0]][edge[1]] < graph[shortest[0]][shortest[1]]:
        shortest = edge

将最短边设置为等于weightList中的第一条边,然后浏览列表并查看是否有任何边更短。

答案 3 :(得分:0)

当试图降低复杂性时,我总是想方设法将事情分解为自解释的模块化函数:

def distance(adjacency_matrix, start_node, end_node):
    return adjacency_matrix[start_node][end_node]

sorted_edges = sorted(weightList, key=lambda e: distance(graph, e[0], e[1]))
edge = sorted_edges[0];