我有一组对象(介于1和大约500之间)。每个对象与同一组中的某些(零个或多个)其他对象兼容。
任何人都可以给我一些指示,指出如何确定创建彼此兼容的对象对的最佳方法,以便集合中的大多数对象配对?
答案 0 :(得分:6)
您正在寻找一般图表中的最大匹配。与您熟悉的稳定婚姻问题相反,在最大匹配问题中,输入图不一定是二分的。没有稳定性的概念(因为顶点不对其兼容选项进行排名),而您正在寻找的是图的边缘的子集,使得没有两条边共享公共顶点(也就是匹配)。您正在尝试构建包含最大可能边数的匹配。
幸运的是,在一般图中找到最大匹配的问题可以使用Edmond's matching algorithm在多项式时间内解决(也称为开花算法因为它如何收缩开花(奇数)循环)到单个顶点)。 Edmond匹配算法的时间复杂度为O(E•V ^ 2)。虽然效率不高,但我相信这对于您正在处理的相对较小的图表来说已经足够了。您甚至不必自己从头开始实现它,因为您可以使用开源Java implementation of Edmond's algorithm。但是,如果您对最先进的技术感兴趣,可以使用已知的most efficient algorithm来解决在O(E•sqrt(V))中运行的问题。
如果输入的顶点兼容性不是二分的(也就是说,每个顶点都有一个在其邻居中指定其首选项的排名),则可以向边添加相应的权重以适应首选项配置文件并使用{{3 }}