python - 列表中元素的对称二分匹配

标签 python algorithm optimization graph-theory matching

从一个随机的整数列表开始,比如说:

list = [2,5,7,1,3]

目标:最大限度地将列表中的每个条目与列表中的另一个条目配对。当且仅当 log_base_2((m + n)/gcd(m, n)) 不是整数时,值 (m,n) 的条目可以匹配。 IE。 (7,3) 是有效匹配,而 (1,3) 不是。

我很确定执行此操作的一种方法是生成两个列表 A 和 B,相当于初始列表:

A=B=list=[2,5,7,1,3]

然后将其视为一个二分匹配问题,附加约束条件是如果 A[m] 匹配 B[n],则 A[n] 也必须匹配 B[m](同样,除了上面的匹配约束之外)。我想象得到的流动网络的可视化将是水平对称的(即沿着源-汇轴,因此是标题)。

我知道如何使用 MaxFlow 解决二分匹配问题,但不知道如何实现最后一个粗体约束。任何帮助都会非常,呃,有帮助。

最佳答案

附加约束(如果 A[m] 匹配 B[n] 那么 A[n] 也必须匹配 B [m]) 从根本上改变了问题的性质。事实上,该约束破坏了输入图的二分性,实际上将其变成了一般的无向图。因此,您正在寻找的是一种在一般图中找到最大匹配的算法。

问题可以用Edmonds Algorithm解决它展示了与二部案例的最大流量解决方案不同的方法(尽管它确实使用了增广路径的概念)。该算法利用了二分匹配可以很容易解决的事实,并且在某种程度上尝试通过折叠奇数循环将输入图变成二分(当且仅当它没有奇数循环时,图是二分的,因此数图中的奇数循环测量输入图远非二分图的程度)。上面的链接详细解释了该算法的工作原理。

这是 a Python implementation of the algorithm .该算法对于稀疏图相当有效,但对于密集图不是很有效。图的密度取决于有多少对条目 m, n 满足条件 (m + n)/gcd(m, n) 是 2 的幂。如果大多数对满足条件,运行时间将约为 O(n^4)。一般来说,运行时间是 O(E•V^2)

关于python - 列表中元素的对称二分匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42794263/

相关文章:

c++ - 假位法(需要帮助)

c++ - 优化:为什么 < 比 multiple 更昂贵!=

python - 非阻塞 Scrapy 管道到数据库

python - 如何在 Jupyter notebook 中设置环境变量

c++ - 看一个点是否在一条线上( vector )

javascript - 功能及优化方面存在问题

c - 矩阵旋转的性能优化

python - 使用 Python 的 xlsxwriter 在 Excel 中的字符串条件格式 "equal to"

python - ffmpeg 通过 python 子进程无法找到相机

algorithm - 排序算法问题