Python Iterative Depth First Search from table

时间:2017-08-28 23:46:25

标签: python depth-first-search

我有以下数据表:

child_pid   parent_pid
       1        -1
       2         1
       6        -1
       7         6
       8         7
       9         8
       21       -1
       22       21
       24       -1
       25       24
       26       25
       27       26
       28       27
       29       28
       99        6
       107      99
       108      -1
       109      108
       222      109
       1000      7
       1001     1000

我想编写一个python迭代深度优先搜索,它会生成以下结果:

('final: ',
   [[u'1', u'2'],
   [u'6', u'7', u'8', u'9'],
   [u'6', u'7', u'1000', u'1001'],
   [u'6', u'99', u'107'],
   [u'21', u'22'],
   [u'24', u'25', u'26', u'27', u'28', u'29'],
   [u'108', u'109', u'222']])

以上输出是使用递归方法生成的。我们可以看到所有子/父关系都得到了适当的保留。

我尝试使用其他教程中的以下逻辑来尝试推导迭代方法:

def dfs_iterative(graph, start):
    stack, path = [start], []

    while stack:
        vertex = stack.pop()
        if vertex in path:
            continue
        path.append(vertex)
        for neighbor in graph[vertex]:
            stack.append(neighbor)

    return path

导致:

('final: ',
   [[u'1', u'2'],
   [u'6', u'99', u'107', u'7', u'1000', u'1001', u'8', u'9'],
   [u'21', u'22'],
   [u'24', u'25', u'26', u'27', u'28', u'29'],
   [u'108', u'109', u'222']])

我们可以看到结果几乎完全相同,除非节点有多个子节点。具体而言,节点6具有以下关系:

6->7->8->9
6->7->1000->1001
6->99->107

在上面的递归输出中,我们看到节点6被适当地分解为其正确的路径关系。在我的迭代尝试中,所有节点6"后代"被归为一个列表。寻找生成递归输出的方法,但在python中使用迭代方法。思考?我很感激帮助!

1 个答案:

答案 0 :(得分:0)

这里的问题是你的迭代"等效"不是:您的算法找到图形闭包。您想要的结果是在树中查找单个路径。当您使用错误的工具时,您会得到不同的结果。

您的方法似乎从给定节点(表面上是根节点之一)开始,并以未定义的邻居顺序累积单个节点。相反,试试这个

  • 从堆栈中弹出顶部 partial_path
  • 顶点< = partial_path的最后一个元素
  • 如果顶点没有子项:
    • partial_path 附加到结果。
  • 否则
    • 顶点
    • 的每个孩子
    • 添加(追加或推送)[ partial_path + 孩子]到堆叠

这会处理你的问题吗?