此答案指导如何为此问题创建O(n^2 * sqrt(n) * log(n))
解决方案。
朴素慢速算法:
首先,请注意,朴素在对问题建模的二分图上O(n^4 * sqrt(n))
迭代地使用匹配算法,并寻找无法去除的“最高边集”。(意思是:寻找匹配中最小的最大边)。
该图是G= (V,E)
, whereV = 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