【问题标题】:Alternative to this python code?替代这个 python 代码?
【发布时间】:2016-08-22 19:07:44
【问题描述】:

我有一行代码我不完全理解,想要一些更简单的替代方法。它的作用是使用权重列表,这是一个相互连接的边列表,并返回图中对应值最低的边列表(邻接矩阵)。这是针对 Prim 的最小生成树问题。

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

【问题讨论】:

  • 很高兴您现在理解了那条线,但值得一提的是,这并不是一种特别有效的方式。您应该使用min 而不是sorted

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


【解决方案1】:

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

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

【讨论】:

  • 正是我需要的。代码现在有意义了。谢谢
【解决方案2】:

如果您希望代码不那么“紧凑”,这应该可以解决问题:

shortest = weightList[0]

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

将最短边设置为等于weightList中的第一条边,然后遍历列表,看看是否有更短的边。

【讨论】:

    【解决方案3】:

    在尝试降低复杂性时,我总是想方设法将事物分解为不言自明的模块化函数:

    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];
    

    【讨论】:

      【解决方案4】:

      照你说的做:对于所有边,找出图中最低的值。

      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)(但可能更慢,因为我假设sorted 是用C 实现的)。相反,您可以通过使用min 使用标准函数在O(n) 中获得相同的结果,这无疑是所有三个选项中最有效和最易读的选项:

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

      【讨论】:

        猜你喜欢
        • 2011-05-05
        • 2014-09-28
        • 1970-01-01
        • 2011-05-01
        • 1970-01-01
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 2013-08-18
        相关资源
        最近更新 更多