在数据库中搜索字符串的部分匹配。(python)

时间:2014-03-11 23:53:44

标签: algorithm debugging python-3.x

我正在尝试实现prims算法来查找图的MST。我在图中给出了节点的邻接列表。 EX:[[10001,5,8,4],[5,10001,6,9],[8,6,10001,10],[4,9,10,10001]]其中数字是两者之间的长度节点i和j。

我实现了以下代码来检查创建边缘并返回mst中的列表边缘。但是,似乎无法得到正确的答案。

这是我的代码。

def find_MST(n, length):
      print(length) #this is only for debugging purposes
      n = len(length)
      dist = [float('inf') for i in range(n)]
      prev = [None for i in range(n)]
      done = [False for i in range(n)]
      dist[0] = 0
      q = [i for i in range(len(length))]
      while len(q) > 0:
        smaller = MAX_LENGTH
        for i in q:
          if dist[i] < smaller:
            smaller = dist[i]
            pos = i
        u = q[q.index(pos)]
        q.pop(q.index(pos))
        if dist[u] == float('inf'):
              break    
        for v in range(len(length[u])):
          alt = length[u][v]
          if dist[v] > alt:
            dist[v] = alt
            prev[v] = u  

      l = []      
      for i in range(len(prev)):
        if prev[i] != None:
            edge = (min(prev[i],i), max(prev[i], i))    
            l.append(edge)

      return l

anybode可以让我知道我应该改变什么来让它给出正确的输出吗?

这是一个例子: 其中每一行都是不同的测试用例 我的输出:

(0, 1)
(0, 2) (1, 2)
(0, 1) (2, 3) (2, 3)
(0, 1) (0, 2) (0, 3)
(0, 1) (0, 3) (1, 2)

正确输出:

(0, 1)
(0, 2) (1, 2)
(0, 1) (0, 3) (2, 3)
(0, 1) (0, 2) (0, 3)
(0, 1) (0, 3) (1, 2)

1 个答案:

答案 0 :(得分:0)

对于任何想知道的人,我解决了这个问题。最终将每个边缘与最小的边缘进行多次比较,以找到绝对最小的边缘。如果不是负边缘,这种实现是正确的。我必须做的是删除while循环和q,然后在第一个循环之前添加2个循环以这种方式:

    for i in range(len(length)):
         for u in range(len(length)):
               for v in range len(length[u]):

然后我继续使用剩下的代码。

这整个代码块已经过时了:

while len(q) > 0:
    smaller = MAX_LENGTH
    for i in q:
      if dist[i] < smaller:
        smaller = dist[i]
        pos = i
    u = q[q.index(pos)]
    q.pop(q.index(pos))
    if dist[u] == float('inf'):
          break