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
unionA
的大小B
- 距离的定义不好:当交叉口增长时,距离应严格减小。解决方案是
max(len(S))-len(A^B)
- 更重要的是:不允许在集合的“两面”使用相同的字母。例如,“abc”与“bcd”的距离不能为1,与“eb”的距离不能为2,因为如果选择路径“a-bc-d”,则边“abc”-“eb”不再存在。也许贪婪的选择会奏效,但我不确定李>
- 节点是集合李>
- 如果
和A
有交叉点但不是彼此的子集,则存在边B
李>A-B
- 如果边
存在,则距离A-B
等于A-B
unionA
的大小B
- 距离的定义不好:当交叉口增长时,距离应严格减小。解决方案是
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)
中的“这些集合有多少个共同元素”问题。现在,将每个集合放在一个图中,您就有了一个单击
,其中每个边都是这个查询。您需要找到一条经过所有顶点的路径,并且