假设我有一个分组成组(或图表)。我有兴趣找到两个分区之间的转换次数,其中转换涉及从一个分区中取出一个元素并将其移动到另一个分区(或单独的分区)
例如,分区之间有一个转换
1 2 | 3
和1 | 2 | 3
但在1 2 3 4
和1 2 | 3 | 4
之间
我相信最小转换次数是2。
所以我的问题是,是否存在给出一对分区和一组的算法,可以返回它们之间的转换状态数?
还有一个复杂的问题,这个集合实际上代表了一个图形,我希望每个分区(和转换分区)都能连接(即如果在1和2之间不存在/直接连接,则1 2 | 3将无效没有被3个单独的分区阻止)但除非你对这个话题真正开悟,你很可能会忽略它。
由于
作为一个注释,我确实有一个我自己想到的方法,它基本上是找到分区A的所有邻居(即可以在一个转换中找到的所有分区)并对分区B执行相同的操作,如果这些是一些这两组邻居之间重叠,那么他们就是一个过渡。然而,这种方法很快就变得非常昂贵。
答案 0 :(得分:1)
我会稍微扩展你的方法,基本上构建一个图并进行图搜索。图的顶点将是该集的有效分区,并且边将是过渡。您实际上可以同时构建和搜索,并且只构建搜索所需的图形部分。
为此,我将使用A *(或其他最佳优先搜索),并在每一步生成当前分区的所有邻居。棘手的部分是确定A *搜索的最佳启发式。您可以通过假设所有转换将导致连接的分区来估计转换的数量(基本上,忽略您的约束)。
这显然很昂贵,但您可以通过使用最佳优先搜索和生成图表来节省时间和空间。