匹配问题

匹配问题

    • 最大匹配与完全匹配
    • 最大流算法
    • 匈牙利
      • 基于DFS
      • 基于BFS

 


最大匹配与完全匹配

匹配是基于无向图的算法,且这个无向图是一个二分图。

二分图:
匹配问题_第1张图片
二分图:对于图中的顶点可以分成俩部分,图的每条边都是横跨俩部分的。

匹配问题的应用:

  • 打车匹配

    以上图为例,图中所有的节点被分为了两类,红的是一类,蓝的是一类。

    红的和蓝的之间可以有连接,也就是它们可以做匹配,您可以把红节点看成打车的人,蓝节点看成是开车的司机。

    虽然上图中每一个红节点都和蓝节点有连接,但是在实际生活中,这个条件未必要满足,也就是说,一个点可能只和很少数量的对面的节点有连接。

    比如如果我们把接单的范围限制在5公里以内,尽管北京市有 10 10 10 万辆车在跑,和您能产生连接的可能只有七八辆。

    在二分图中,红节点之间,蓝节点之间没有直接的关系。

    图中的每一条连线都可以有一个权重,通常在各个应用中,它们是设计出来的成本函数,或者利润函数。

    这个函数的设计就体现各个公司的领域知识了。

    在二分图中,有一种被称为最大匹配的算法,它满足两个条件,第一是保证节点数量少的一边所有的节点都有匹配,第二个是让整个网络中找到的匹配权重达到最大。

    无论是滴滴打车的问题,还是亚马逊的推荐、交友网站的匹配(男性看成打车人,女性看成出租车司机)、学生选导师,算法复杂度不高于 M M M 乘以 N N N,都是二分图中的最大匹配问题。

    如果是 G o o g l e 、 F a c e b o o k Google、Facebook GoogleFacebook 的广告系统,一个人看到的页面可以有多个广告,假如是 K K K 个广告,那么复杂度也不过是在 M M M 乘以 N N N 的基础上,再乘以一个 K K K,也就是 Θ ( M ∗ N ∗ K ) \Theta(M*N*K) Θ(MNK)

匹配问题,主要考察:

  • 最大匹配:每个顶点只能匹配一次,且只能是有边(弧)连接的俩个顶点。

    最大匹配尽可能使俩边顶点匹配到,但总是有顶点没有匹配到。

  • 完全匹配:每个顶点只能匹配一次,且只能是有边(弧)连接的俩个顶点。

    完全匹配是所有顶点都匹配到了。完全匹配一定是最大匹配,但最大匹配不一定是完全匹配。

匹配问题的问题核心,在于最大匹配,是否是完全匹配只需要检测所有顶点是否匹配到即可。

 


最大流算法

 


匈牙利

匈牙利算法:

  • 从左侧的一个非匹配点出发
  • 从右向左走,一直走已匹配的边 —> 匹配边和非匹配边交替出现
  • 如果终止于另一个非匹配点 —> 最大匹配数 + 1

 


基于DFS

 


基于BFS

你可能感兴趣的:(#,图论)