给定两个相等大小为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.
计算此匹配的算法是什么?它的复杂性是什么?
答案 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] B
和E = 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算法来解决它。