Algorithm 一对集合(图)分区之间转换次数的算法

Algorithm 一对集合(图)分区之间转换次数的算法,algorithm,graph,set,data-partitioning,Algorithm,Graph,Set,Data Partitioning,假设我有一个集合(或图形),它被划分成若干组。我感兴趣的是找到两个分区之间的转换数量,其中转换涉及从一个分区中取出一个元素并将其移动到另一个分区(或单体分区本身) 例如,分区之间有一个转换 12 | 3和1 | 2 | 3 但是在1234和1234 我认为最小的转换次数是2次 所以我的问题是,有没有算法,给定一对分区和一个集合,可以返回它们之间的转换状态数 还有一个更复杂的问题是,这个集合实际上表示一个图,我希望每个分区(和过渡分区)都连接起来(即,如果1和2之间不存在被3的单个分区解锁的in/

假设我有一个集合(或图形),它被划分成若干组。我感兴趣的是找到两个分区之间的转换数量,其中转换涉及从一个分区中取出一个元素并将其移动到另一个分区(或单体分区本身)

例如,分区之间有一个转换

12 | 3
1 | 2 | 3

但是在
1234
1234

我认为最小的转换次数是2次

所以我的问题是,有没有算法,给定一对分区和一个集合,可以返回它们之间的转换状态数

还有一个更复杂的问题是,这个集合实际上表示一个图,我希望每个分区(和过渡分区)都连接起来(即,如果1和2之间不存在被3的单个分区解锁的in/direct连接,则1 2 | 3将无效)但除非你真的对这个话题有所了解,否则你很可能会忽略这个问题

谢谢


作为一个注释,我有一个我自己想到的方法,基本上是找到分区a的所有邻居(即,可以在一个转换中找到的所有分区),并对分区B做同样的操作,如果这两组邻居之间有重叠,那么它们是一个转换。但是,这种方法很快就会变得非常昂贵。

我将对您的方法进行一点扩展,基本上构建一个图形并进行图形搜索。图的顶点将是集合的有效分区,边将是变换。实际上,您可以同时构建和搜索,并且只构建搜索所需的图形部分

为此,我将使用A*(或其他最佳优先搜索),并在每一步生成当前分区的所有邻居。棘手的部分是确定A*搜索的最佳启发式。您可能可以通过假设所有转换都会导致连接的分区来估计转换的数量(基本上,忽略您的约束)


这显然很昂贵,但通过使用“最佳优先搜索”和边走边生成图形,您可以节省时间和空间。

是的,构建图形是一个相当有趣的想法,尽管我正在做的事情中有这么多嵌套的图形,但它变得相当滑稽。我也在考虑“随走随搜索”和选择性搜索。例如,如果两个分区的大多数分组是相同的,但有一个或两个分区是不同的,那么首先开始根据不同的分组查找邻居可能是有意义的。但我相信这一定是以前文献中的某个地方攻击过的(或者可能不是?)。问题是找到正确的术语来搜索它。分区的数量对您有什么好处?您需要转换的数量或实际列表吗?