为什么以下最大二分匹配实现的时间复杂度为O(m * n ^ 2)?

时间:2013-03-10 19:20:17

标签: performance algorithm time-complexity matching bipartite

这个库有许多算法的实现,其中一个是最大的二分匹配。

以下是源代码的链接:http://shygypsy.com/tools/bpm.cpp

我也会在这里添加(没有评论)

#include <string.h>

#define M 128
#define N 128

bool graph[M][N];
bool seen[N];
int matchL[M], matchR[N];
int n, m;

bool bpm( int u )
 {
  for( int v = 0; v < n; v++ ) 
   if( graph[u][v] )
   {
    if( seen[v] ) continue;
    seen[v] = true;

    if( matchR[v] < 0 || bpm( matchR[v] ) )
    {
        matchL[u] = v;
        matchR[v] = u;
        return true;
    }
}
return false;
}

int main()
{
  memset( matchL, -1, sizeof( matchL ) );
  memset( matchR, -1, sizeof( matchR ) );
  int cnt = 0;
  for( int i = 0; i < m; i++ )
  {
      memset( seen, 0, sizeof( seen ) );
      if( bpm( i ) ) cnt++;
  }
  return 0;
}

我们有一个运行m次的for循环。数字m指的是工人数量。 然后我们输入bpm函数,它有另一个for循环。此循环运行n次,其中n是任务量。

到目前为止,我们有m*n时间复杂度。

但是在第三个if语句中有一个bpm的递归函数调用。此函数的目标是运行dfs以查找扩充路径。

我知道dfs的时间复杂度为O(n+m)。所以我假设函数bpm的复杂度为O(n+m)

因此,总时间复杂度为O(m*(n+m))

然而,作者说这是O(m*n^2)。有人可以解释我为什么会这样吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

这里的变量有点令人困惑:M和N指的是图表每一侧的节点数。 DFS的运行时为O(E+V),其中E是边数。在二分图| E |中最多为N * M,V将为(N + M),因此您的DFS将采用O(NM)。然后,总时间复杂度为O(NM^2)。不确定N^2的位置,可能是一个错字......