算法到max(min(匹配))?

时间:2012-06-06 15:02:42

标签: algorithm

给定两个相等大小为N的A和B,以及为交叉积AxB的每个N ^ 2项分配实数的加权,我们希望形成A和B的匹配,使得最低权重最大化。

举一个例子,我们正在组织一场赛马,我们有10个骑师和10匹马,每个骑师都有不同的骑马速度。我们必须选择哪个骑师骑哪匹马,以便这场比赛中最慢的赛马/马匹尽可能快。

    i  j  k
a   9  1  2
b   4  3  1
c   7  3  5

这里“max-min-matching”是{(a,i),(b,j),(c,k)},值为3.

计算此匹配的算法是什么?它的复杂性是什么?

2 个答案:

答案 0 :(得分:1)

此答案指导如何为此问题创建O(n^2 * sqrt(n) * log(n))解决方案。

Naive slow algorithm:
首先,请注意,一个天真的O(n^4 * sqrt(n))迭代地使用matching algorithm on the bipartite graph来模拟问题,并寻找无法重新转移的“最高边集”。 (含义:寻找匹配中最小的最大边缘。)

图表为G= (V,E),其中V = A [union] BE = A x B

算法是:

sort the edges according to the weighted value
while there is an unweighted match match:
   remove the edge with smallest value
return the match weight of the last removed edge

正确性说明:
很容易看出该值不小于最后一个被移除的边缘 - 因为使用它而不是“较小”边缘匹配。
它也不高,因为当这条边被移除时 - 没有匹配。

<强>复杂性:
运行O(n^2)匹配算法,O(|E|sqrt(|V|)) = O(n^2 * sqrt(n))合计O(n^4 * sqrt(n)

我们希望减少O(n^2)因子,因为可能应该使用匹配算法。

<强>优化:
请注意,算法实际上在寻找“切割”排序边列表的位置。我们实际上正在寻找列表中必须存在的最小边缘以获得匹配。
这里可以暗示二元搜索,其中每个“比较”实际上都在检查是否存在匹配,并且您正在寻找产生匹配的“最高”元素。这将导致匹配算法的O(log(n^2)) = O(logn)次迭代,总计为O(n^2 * sqrt(n) * log(n))

高级优化算法:

//the compare OP
checkMatching(edges,i): 
   edges' <- edges 
   remove from edges' all the elements with index j < i
   check if there is a match in the graph
   return 1 if there is, 0 otherwise.
//the algorithm:
find max_min(vertices,edges):
   sort edges according to weight ascending
   binary search in edges for the smallest index that yields 0
   let this index be i
   remove from edges all the elements with index j < i
   return a match with the modified edges

答案 1 :(得分:0)

此问题是典型的Bipartite匹配问题。您可以查看匈牙利方法或KM算法来解决它。