Algorithm 如何找到通过一组集合的最短路径?

Algorithm 如何找到通过一组集合的最短路径?,algorithm,graph-theory,set-theory,Algorithm,Graph Theory,Set Theory,我有一个算法问题,我有许多无序的元素集,我需要找到通过所有这些元素集的最短路径(这些元素的有序组合)。可能有数千套。 例如,假设有以下4个无序集: A=abcdefg B=cd C=abch D=def 最短路径大小为11 一种可能的解决方案是: P=CADB=habcgdeficd |P|=11 请注意,集合可能与路径中的相邻集合共享元素 也可能存在属于不同集合的重复元素(如上例所示,P中通过将B添加到CAD)来重复“c”和“d”。 请提供一种算法,以找到所述的最短路径。 谢谢 您有一个图表:

我有一个算法问题,我有许多无序的元素集,我需要找到通过所有这些元素集的最短路径(这些元素的有序组合)。可能有数千套。

例如,假设有以下4个无序集:
A=abcdefg
B=cd
C=abch
D=def

最短路径大小为11

一种可能的解决方案是:
P=CADB=habcgdeficd
|P|=11

请注意,集合可能与路径中的相邻集合共享元素
也可能存在属于不同集合的重复元素(如上例所示,P中通过将B添加到CAD)来重复“c”和“d”。

请提供一种算法,以找到所述的最短路径。
谢谢

您有一个图表:

  • 节点是集合
  • 如果
    A
    B
    有交叉点但不是彼此的子集,则存在边
    A-B
  • 如果边
    A-B
    存在,则距离
    A-B
    等于
    A
    union
    B
    的大小
您正在寻找覆盖所有节点的最短路径。这是的一个变体,无需回到起点

一些阅读:

编辑: 我试图总结评论和我的回答中讨论的内容

  • 问题中不清楚的是:如果一个集合是另一个集合的超集,你会怎么做?我假设你想把这两个集合分开,这就是为什么我写道:“如果A和B有交集,但不是另一个的子集,那么边A-B就存在。”。对于TSP,如果边不存在,只需在集合a和B之间使用无限距离。这适用于子集/超集

  • 路径是有序的(根据路径的定义),但集合是无序的。这就是为什么这不是最短公共超弦问题的(微不足道的)变体。一个字符串被排序,一个集合号

  • TSP思想在上述定义的距离下也不起作用,因为:

    • 距离的定义不好:当交叉口增长时,距离应严格减小。解决方案是
      max(len(S))-len(A^B)
    • 更重要的是:不允许在集合的“两面”使用相同的字母。例如,“abc”与“bcd”的距离不能为1,与“eb”的距离不能为2,因为如果选择路径“a-bc-d”,则边“abc”-“eb”不再存在。也许贪婪的选择会奏效,但我不确定
  • 您有一个图表:

    • 节点是集合
    • 如果
      A
      B
      有交叉点但不是彼此的子集,则存在边
      A-B
    • 如果边
      A-B
      存在,则距离
      A-B
      等于
      A
      union
      B
      的大小
    您正在寻找覆盖所有节点的最短路径。这是的一个变体,无需回到起点

    一些阅读:

    编辑: 我试图总结评论和我的回答中讨论的内容

  • 问题中不清楚的是:如果一个集合是另一个集合的超集,你会怎么做?我假设你想把这两个集合分开,这就是为什么我写道:“如果A和B有交集,但不是另一个的子集,那么边A-B就存在。”。对于TSP,如果边不存在,只需在集合a和B之间使用无限距离。这适用于子集/超集

  • 路径是有序的(根据路径的定义),但集合是无序的。这就是为什么这不是最短公共超弦问题的(微不足道的)变体。一个字符串被排序,一个集合号

  • TSP思想在上述定义的距离下也不起作用,因为:

    • 距离的定义不好:当交叉口增长时,距离应严格减小。解决方案是
      max(len(S))-len(A^B)
    • 更重要的是:不允许在集合的“两面”使用相同的字母。例如,“abc”与“bcd”的距离不能为1,与“eb”的距离不能为2,因为如果选择路径“a-bc-d”,则边“abc”-“eb”不再存在。也许贪婪的选择会奏效,但我不确定

  • 这个问题可以简化为

    的变体。这个问题可以简化为

    有趣的变体,我认为这个问题可能更适合MathExchange(甚至MathOverflow)。另外,我怀疑这个问题是否存在一个有效的解决方案。我倾向于认为这个解决方案将是非多项式的。假设您可以使用一些预先计算来回答
    O(1)
    中的“这些集合有多少个共同元素”问题。现在,将每个集合放在一个图中,您就有了一个
    单击
    ,其中每个边都是这个查询。您需要找到一条经过所有顶点并具有最大交点的路径。我不确定,但我认为这是一个NP难的问题。有趣的是,我认为这个问题可能更适合MathExchange(甚至MathOverflow)。另外,我怀疑这个问题是否存在一个有效的解决方案。我倾向于认为这个解决方案将是非多项式的。假设您可以使用一些预先计算来回答
    O(1)
    中的“这些集合有多少个共同元素”问题。现在,将每个集合放在一个图中,您就有了一个
    单击
    ,其中每个边都是这个查询。您需要找到一条经过所有顶点的路径,并且