【问题标题】:How to find the shortest path that pass through a group of Sets?如何找到通过一组集合的最短路径?
【发布时间】:2019-02-14 13:03:18
【问题描述】:

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

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

最短路径大小为 11

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

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

请提供算法以找到所描述的最短路径。
谢谢!

【问题讨论】:

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

标签: algorithm graph-theory set-theory


【解决方案1】:

这个问题可以简化为Shortest common superstring problem的变体

【讨论】:

  • 我是你的例子,abcdefghi 是 A、B、C、D 的超字符串。试试>>> A,B,C,D=map(set, ["abcdefg", "cd", "abch", "defi"]) >>> all(set("abcdefghi") >= S for S in [A, B, C, D]) True。但abcdefghi 似乎不是真正的路径(A 包含 B)。
  • 字符串 'abcdefghi' 不是 A、B、C、D 的超字符串,因为没有字符串是集合 C 的变体,包含在该字符串中。
  • 我的错误:一个超集。您的第一篇文章中没有提到顺序,因此超字符串是另一个问题的解决方案。
  • 在我写的第一句话中:“……最短路径(集合的有序组合)……”
【解决方案2】:

你有一个图表:

  • 节点是集合;
  • 如果AB 有交集但不是彼此的子集,则存在边A-B
  • 如果边A-B存在,距离A-B就是A并集B的大小。

您正在寻找覆盖所有节点的最短路径。这是travelling salesman problem 的变体,无需回到开头。

一些阅读: What is the problem name for Traveling salesman problem(TSP) without considering going back to starting point?

编辑: 我试图总结 cmets 中讨论的内容和我的答案。

  1. 问题中不清楚的是:如果一个集合是另一个集合的超集,你会怎么做?我假设您想将这两组分开,这就是我写的原因:'如果 A 和 B 有交集但不是另一个的子集,则边缘 A-B 存在'。对于 TSP,如果边不存在,只需在集合 A 和 B 之间使用无限距离。这适用于子集/超集。

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

  3. TSP 的想法也不适用于上面定义的距离,因为:

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

【讨论】:

  • 当您必须包含一个完全包含另一个的集合时,问题就开始了。一个简单的 TSP 是不够的。不过,最短公共字符串的答案非常接近 TSP。
  • @ekatz 如您所见,我写道:“如果 A 和 B 有交集但不是另一个子集,则存在边 A-B”。这种情况会强制子集/超集被分离。
  • 正如我所写:“...我需要找到通过 all 的最短路径(集合的有序组合)套。”因此,在您的解决方案中,我可能有一个最终的有序路径,其中某个集合不会位于其中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多