【问题标题】:1 function prim's algorithm python1 函数 prim 的算法 python
【发布时间】:2023-03-03 20:23:02
【问题描述】:

我尝试在 python 中创建一个 1 函数 prims 算法,但它似乎不起作用

def prim(edges):
    inGraph = ['A']
    discovered = []
    results = []
    counter = 0
    while True:
            tmplist = []
            for i in edges:
                    if inGraph[counter] in i:
                            discovered.append(i)
                            tmplist.append(i)
            for i in tmplist:
                    edges.remove(i)
            tmp = []
            for i in discovered:
                    tmp.append(i[2])
            mini = tmp.index(min(tmp))
            alpha = discovered[mini][0]
            beta = discovered[mini][1]

            if alpha not in inGraph or beta not in inGraph:
                    if alpha in inGraph:
                            inGraph.append(beta)
                    elif beta in inGraph:
                            inGraph.append(alpha)
                    results.append(discovered[mini])
            discovered.pop(mini)
            if discovered == []:
                    break
            counter+=1

    return (inGraph, results)

打印 [['A', 'B', 1], ['A', 'C', 102], ['B', 'C', 4], ['C', 'F', 2], ['B', 'F', 1], ['F', 'E', 1]] print prim([['A', 'B', 1], ['A', 'C', 102], ['B', 'C', 4], ['C', 'F', 2 ], ['B', 'F', 1], ['F', 'E', 1]])

问题在于发现的某个地方,要么是 if 语句检查它是否为空,要么是从中删除一个元素。我只是不知道放在哪里

【问题讨论】:

  • 永远不要在遍历列表时更改列表:不要在遍历列表时调用edges.remove(..)
  • 而且你的算法效率很低。
  • 效率无关紧要,也不是通过 for 循环进行编辑
  • 是的,我知道,但迭代器有一个合同,您不能同时更改列表。
  • here

标签: python algorithm python-2.7 prims-algorithm


【解决方案1】:

想象只有一个顶点与“A”相连,比如“B”。因此,在第一次迭代中,您只会发现一个优势。将“B”添加到 inGraph 后,您将弹出已发现的唯一边。

因此,您发现的 == [] 变为真并且循环中断,即使可能仍有数千条边与“B”相连。

要终止主循环,请计算顶点数并在 len(inGraph)==no_of_vertex 时中断。

为此,您可以:

V = set()
for e in edges:
    v.add(e[0])
    v.add(e[1])
no_of_vertex = len(V)
V = None #To help garbage collector

【讨论】:

  • 那么我应该在哪里放置 if 语句或 discovered.pop(mini)
  • 这只是在函数末尾附近添加吗?
  • 我把它放在最后得到了这个错误Traceback (most recent call last): File "prim.py", line 40, in <module> print prim([['A', 'B', 1], ['A', 'C', 102], ['B', 'C', 4], ['D', 'B', 7], ['D', 'F', 240], ['C', 'F', 2], ['B', 'F', 1], ['F', 'E', 1]]) File "prim.py", line 17, in prim mini = tmp.index(min(tmp)) ValueError: min() arg is an empty sequence
  • 函数开始处,while循环开始之前。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多