この回答O(n^2 * sqrt(n) * log(n))
は、この問題の解決策を作成する方法を示しています。
ナイーブな遅いアルゴリズム:
まず、ナイーブは、問題をモデル化する 2 部グラフでマッチング アルゴリズムをO(n^4 * sqrt(n))
繰り返し使用し、削除できない「エッジの最高セット」を探していることに注意してください。(意味: マッチングで最小になる最大エッジを探します)。
グラフは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