Algorithm k图之间的最长公共路径

Algorithm k图之间的最长公共路径,algorithm,data-structures,graph,Algorithm,Data Structures,Graph,我在考虑面试问题时遇到了这个问题,没有找到一个可靠的解决办法 实际问题是在星期五提出的 给定多个学龄儿童以及他们从学校到家的路径,找出最长最常见的路径(路径按儿童所走的步骤顺序给出) 例如: child1 : a -> g -> c -> b -> e child2 : f -> g -> c -> b -> u child3 : h -> g -> c -> b -> x result = g -> c ->

我在考虑面试问题时遇到了这个问题,没有找到一个可靠的解决办法

实际问题是在星期五提出的

给定多个学龄儿童以及他们从学校到家的路径,找出最长最常见的路径(路径按儿童所走的步骤顺序给出)

例如:

child1 : a -> g -> c -> b -> e
child2 : f -> g -> c -> b -> u
child3 : h -> g -> c -> b -> x

result = g -> c -> b
注意:可能有多个子项。输入的形式为steps和childID。例如,输入如下所示:

(child1, a)
(child2, f)
(child1, g)
(child3, h)
(child1, c)
...
一些人建议最长的公共子字符串可以工作,但它不会成为示例-

1 a-b-c-d-e-f-g
2 a-b-c-x-y-f-g
3 m-n-o-p-f-g
4 m-x-o-p-f-g
1 and 2 will give abc, 3 and 4 give pfg
now ans will be none but ans is fg

这就像图问题,我们如何在k个图之间找到最长的公共路径?

方法1:使用图构造

考虑这个例子:

1 a-b-c-d-e-f-g
2 a-b-c-x-y-f-g
3 m-n-o-p-f-g
4 m-x-o-p-f-g
画一个有向加权图

我是一个懒惰的人。因此,我没有画出方向箭头,但我相信它们是无形的。如果箭头上未标记边缘权重,则边缘权重为1

给出最长链的长度,链中的每条边具有最大边重
MEW

  • MEW
    是4,我们的答案是FG
  • 假设AB&BC的边权重为4,那么ABC应该是答案
下面的例子是
MEW
<#children的情况,应该输出ABC

1 a-b-c-d-e-f-g
2 a-b-c-x-y-f-g
3 m-n-o-p-f-h
4 m-x-o-p-f-i
如果有一个孩子像我一样,他会在回家前漫游多个地方。在这种情况下,您可能会看到
MEW
#儿童,解决方案将变得复杂。我希望我们投入的所有孩子都听话,他们从学校直接回家


方法2:无图构造

幸运的是,如果问题提到最长的公共路径应该出现在所有子级的路径中,即严格地
MEW
==#子级,那么您可以用更简单的方法解决。下面的图片应该会给你们一些关于该怎么做的线索

以下面的例子为例

1 a-b-c-d-e-f-g
2 a-b-c-x-y-f-g
3 m-n-o-p-f-g
4 m-x-o-p-f-g
方法1:

获取前两个的最长公共图:a-b-c,f-g(结果1)

获取最后两个的最长公共图:p-f-g(结果2)

使用结果1和2,我们得到:f-g(最终结果)

方法2:

获取前两个的最长公共图:a-b-c,f-g(结果1)

取结果1和下一张图,即m-n-o-p-f-g:f-g(结果2)

取结果2和下一张图,即m-x-o-p-f-g:f-g(最终结果)

这种没有图形构造的方法的美妙之处在于,即使孩子们多次漫游同一条路径,我们也能得到正确的解决方案



如果您向前走一步,您可以将这些方法结合起来,并将方法1用作方法2中的子程序。

方法1:使用图形构造

考虑这个例子:

1 a-b-c-d-e-f-g
2 a-b-c-x-y-f-g
3 m-n-o-p-f-g
4 m-x-o-p-f-g
画一个有向加权图

我是一个懒惰的人。因此,我没有画出方向箭头,但我相信它们是无形的。如果箭头上未标记边缘权重,则边缘权重为1

给出最长链的长度,链中的每条边具有最大边重
MEW

  • MEW
    是4,我们的答案是FG
  • 假设AB&BC的边权重为4,那么ABC应该是答案
下面的例子是
MEW
<#children的情况,应该输出ABC

1 a-b-c-d-e-f-g
2 a-b-c-x-y-f-g
3 m-n-o-p-f-h
4 m-x-o-p-f-i
如果有一个孩子像我一样,他会在回家前漫游多个地方。在这种情况下,您可能会看到
MEW
#儿童,解决方案将变得复杂。我希望我们投入的所有孩子都听话,他们从学校直接回家


方法2:无图构造

幸运的是,如果问题提到最长的公共路径应该出现在所有子级的路径中,即严格地
MEW
==#子级,那么您可以用更简单的方法解决。下面的图片应该会给你们一些关于该怎么做的线索

以下面的例子为例

1 a-b-c-d-e-f-g
2 a-b-c-x-y-f-g
3 m-n-o-p-f-g
4 m-x-o-p-f-g
方法1:

获取前两个的最长公共图:a-b-c,f-g(结果1)

获取最后两个的最长公共图:p-f-g(结果2)

使用结果1和2,我们得到:f-g(最终结果)

方法2:

获取前两个的最长公共图:a-b-c,f-g(结果1)

取结果1和下一张图,即m-n-o-p-f-g:f-g(结果2)

取结果2和下一张图,即m-x-o-p-f-g:f-g(最终结果)

这种没有图形构造的方法的美妙之处在于,即使孩子们多次漫游同一条路径,我们也能得到正确的解决方案



如果您向前走一步,您可以组合这些方法并将方法1用作方法2中的子程序。

您可以构造一个有向图
g
,其中边
a->b
存在,当且仅当它存在于所有单独的路径中时,然后删除所有阶数为零的节点

  • 图形
    g
    将没有循环。如果有,那么相同的循环将出现在所有单独的路径中,并且根据定义,路径没有循环

  • 此外,所有入度和出度都将为零或一。例如,如果一个节点
    a
    的度数大于1,那么将有两条边表示两个学生从两个不同的节点到达
    a
    。这样的边不能通过构造出现在
    g

图形将看起来像一个断开连接的路径集合。可能有多个最大长度的路径,也可能没有(如果愿意,可以是空路径)

在下面的Python代码中,我找到了所有公共路径,并返回了一个最大长度的路径。我相信整个过程在输入边的数量上是线性的



当且仅当边
a->b
存在于所有单独的路径中时,可以构造一个有向图
g
,然后删除度为零的所有节点

  • 图形
    g
    将没有