iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >KM算法详解及如何使用java实现
  • 837
分享到

KM算法详解及如何使用java实现

2023-06-19 09:06:24 837人浏览 独家记忆
摘要

今天就跟大家聊聊有关KM算法详解及如何使用java实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。匈牙利算法基本概念二分图:二分图又称为二部图.简单来说,如果图中点可以被分为两组,

今天就跟大家聊聊有关KM算法详解及如何使用java实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

匈牙利算法

基本概念

  • 二分图:二分图又称为二部图.简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。准确地说:把一个图的顶点划分为两个不相交集 U 和V ,使得每一条边都分别连接U、V中的顶点。如果存在这样的划分,则此图为一个二分图。二分图的一个等价定义是:不含有"含奇数条边的环"的图。生成子图:子图包含原图的所有顶点

  • 匹配: 通俗的说:匹配(matching)是一个边的集合,其中任意两条边都没有公共顶点.定义:对给定二分图G,在G的子图M中,M的边集{E}中的任意两条边不依赖于同一个顶点,则称M为一个匹配

  • 最大匹配: 图的所有匹配中,含有边数最多的匹配称为最大匹配

  • 完备匹配: 如果图G的某个匹配M,使G的每个顶点都和匹配M中的某条边相关联,则称M为完全匹配(完备匹配); 完备匹配一定是最大匹配.

  • KM算法详解及如何使用java实现

  • 如图: Fig.1为一个二分图,将其改为Fig.2的形式更为直观;Fig.3 红线部分,为一个匹配; Fig.4 为一个最大匹配,也是一个完备匹配

求图最大匹配的匈牙利算法

  • 求最大匹配最直接暴力的方法是: 找出全部匹配,然后保留边最多的. 这个方法的复杂度为边数目的指数级函数. 匈牙利算法是效率更高的方法.

  • 增广路径: 若P是图G一条连通两个未匹配点的路径,并且属于匹配M的边和不属于M的边(即已匹配边和未匹配边)在P上交替出现,则称P为相对于M的一条增广路径.

  • KM算法详解及如何使用java实现

  • 如上图,Fig.5红色为匹配,Fig.6为相对于匹配的一条增广路径

  • 由增广路径的定义,可以推出三个结论:

    1. P的路径长度必定为奇数,第一条边和最后一条边都不属于M;

    2. P经过取反操作,可以得到一个更大的匹配M1;

    3. M为G的最大匹配当且仅当不存在相对于M的增广路径.

  • 匈牙利算法: 用增广路径求最大匹配(匈牙利科学家Edmonds于1965年提出); 其框架如下:

    1. 置M为空;

    2. 找出一条增广路径P,通过取反操作,得到更大的匹配M1;

    3. 重复步骤2,直到找不出增广路径为止.

  • 匈牙利算法实现(java)

    • KM算法详解及如何使用java实现

    • 增广路径有两种寻径方法,一个是深搜(DFS),一个是宽搜(BFS)。如上图,蓝色线为第一次匹配子图,现在从x1寻找增广路径,如果是DFS深搜:首先:x1找到y0,发现y0已经被x0匹配,于是深入到x0,为x0找新的匹配点,发现x0可以匹配y2,让x0与y2匹配,然后让x1与y0匹配,得到第二次匹配子图(红色).现在,从x2出发,搜寻增广路径,x2找到y0匹配,但发现y0已经被x1匹配了,于是就深入到x1,去为x1找新的匹配节点,结果发现x1没有其他的匹配节点,于是匹配失败,x2接着找y1,发现y1可以匹配,于是就找到了新的增广路径,将x2-y1加入匹配中。

    • DFS实现代码见我的代码java实现|GitHub

KM算法

KM算法原理

  • 对于加权完全二分图,找出权和最大的匹配,叫做求最佳匹配; 直接穷举法:效率为n!;用KM算法.

  • 定理: 设M是一个带权完全二分图G的一个完备匹配,给每个顶点一个可行顶标(第i个x顶点的可行标用lx[i]表示,第j个y顶点的可行标用ly[j]表示),如果对所有的边(i,j) in G,都有lx[i]+ly[j]>=w[i,j]成立(w[i,j]表示边的权),且对所有的边(i,j) in M,都有lx[i]+ly[j]=w[i,j]成立,则M是图G的一个最佳匹配。证明很容易。

  • 对任意的G和M,可行标都是存在的

  • 对二分图G和一组可行标,满足可行标边界条件(lx[i]+ly[j]=w[i,j])的所有边构成的生成子图(需要包含所有顶点),称为其等价子图(相等子图),在这个等价子图上,寻找其完备匹配,如果完备匹配存在,则这个完备匹配M就是图G的最大权匹配,最大权等于所有可行标的和; 如果完备匹配不存在,则修改可行标,用贪心的思想,将最优的边加入等价子图. KM算法就是一种逐次修改可行顶标的方法,使之对应的等价子图逐次增广(增加边),最后出现完备匹配.

KM算法流程及实例

  • Kuhn-Munkras算法流程

    1. 初始化可行顶标的值

    2. 用匈牙利算法在等价子图中寻找完备匹配

    3. 若未找到完备匹配则修改可行顶标的值

    4. 重复(2)(3)直到找到相等子图的完备匹配为止

  • 实例解释算法过程:

    • 带权二分图如下:

    • KM算法详解及如何使用java实现

    • KM算法详解及如何使用java实现

    • 从x0找增广路径,找到x0-y4;然后,从x1找不到增广路径,这时,需要修改顶标,加入一条最优的新边到等价子图中:此时搜索过的路径为x1-y4-x0(用匈牙利法DFS),在路径上的X顶点集为S(x0,x1),Y顶点集为T(y4),对所有在S中的点xi及不在T中的点yj,计算d=min{(L(xi)+L(yj)-weight(xiyj))},S中的点的顶标减去d,T中的点的顶标加上d,保持顶标依然为可行顶标.(这个d计算的意义是贪心思想,两种情况:此时让x0与其他点匹配,x1与y4匹配;x0依旧与y4匹配,x1找其他点匹配.d计算的是找到一条新加的边,让x0和x1都搭配后,与x0和x1都同y4搭配的非法搭配这种情况相比,损失的权重值最少).具体来说:此时算出来的最小d=L(X1)+L(Y0)-weight(X1Y0)=2,对顶标进行松弛后,得到的等价子图如上,加了一条边x1-y0,为x1重新找增广路径,找到x1-y0,此时匹配权值和为9+6=15;原来的非法匹配权值和为9+8=17,"损失"的权值最少为2(即加入一条其他的非x1-y0的边如x0-y2,损失的权值为3,比2大,即贪心思想,"损失最小").

    • KM算法原本的时间复杂度为O(n4),n个节点找n次增广路径,在某次找增光路径之中,顶标最多改变n次,修改顶标的松弛量需n2; 可改进为O(n3)时间复杂度:在寻找增广路径时顺便将slack值算出.

看完上述内容,你们对KM算法详解及如何使用java实现有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: KM算法详解及如何使用java实现

本文链接: https://www.lsjlt.com/news/295412.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • KM算法详解及如何使用java实现
    今天就跟大家聊聊有关KM算法详解及如何使用java实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。匈牙利算法基本概念二分图:二分图又称为二部图.简单来说,如果图中点可以被分为两组,...
    99+
    2023-06-19
  • 详解Java如何实现FP-Growth算法
    FP-Growth算法的Java实现 这篇文章重点讲一下实现。需要两次扫描来构建FP树 第一次扫描 第一次扫描,过滤掉所有不满足最小支持度的项;对于满足最小支持度的项,按照全局支持...
    99+
    2024-04-02
  • 详解如何在Java中实现堆排序算法
    目录算法描述实现代码测试代码算法描述 堆排序算法的描述如下: 将待排序的数组调整为最大堆,此时未排序的长度 N 为数组的长度,调整的过程就是倒序将数组的前&nbs...
    99+
    2024-04-02
  • 详解Java如何实现数值校验的算法
    给定一个字符串如何判断它是否为数值类型?例如:字符串+100、5e2、-123、3.1416以及-1E-16都表示数值,为数值类型,但12e、1a3.14、1.2.3、+-5以及12...
    99+
    2024-04-02
  • 详解Java实现分治算法
    目录一、前言二、分治算法介绍三、分治算法经典问题3.1、二分搜索3.2、快速排序3.3、归并排序(逆序数)3.4、最大子序列和3.5、最近点对四、结语一、前言 在学习分治算法之前,问...
    99+
    2024-04-02
  • Java利用位运算实现乘法运算详解
    目录前言正文十进制相乘二进制相乘思路分析代码实现总结前言 在上一篇中,我们介绍了使用位运算实现加法和减法运算,接下来本文主要介绍如何用位运算实现乘法运算,在实现乘法时要用位运算实现,...
    99+
    2023-05-15
    Java位运算实现乘法运算 Java位运算 乘法运算 Java位运算
  • 详解JavaBellman-Ford算法原理及实现
    目录一 点睛二 算法步骤三 算法实现四 测试一 点睛 如果遇到负权边,则在没有负环(回路的权值之和为负)存在时,可以采用 Bellman-Ford 算法求解最短路径。该算法...
    99+
    2024-04-02
  • 遗传算法详解及其MATLAB实现
    遗传算法是一种用于优化问题的启发式搜索算法,它模拟自然界中的进化过程,通过遗传、交叉和变异等操作寻找问题的最优解。遗传算法的核心思想...
    99+
    2023-09-14
    MATLAB
  • JAVA 如何实现解密RSA算法并使用JS加密
    JAVA 如何实现解密RSA算法并使用JS加密?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JAVA 中解密RSA算法JS加密实例详解有这样一个需求,前端登录的用户名密码,...
    99+
    2023-05-31
    java js加密 rsa算法
  • Java实现快速幂算法详解
    目录前言1. 暴力算法(fail)2. 优化取模运算(accept)3. 优化时间复杂度(accept)4. 优化 位运算(accept)前言 此算法偶尔会出现在笔试以及面试中,特意...
    99+
    2022-11-13
    Java实现快速幂算法 Java快速幂算法 Java快速幂
  • 详解如何用Python实现感知器算法
    目录一、题目二、数学求解过程三、感知器算法原理及步骤四、python代码实现及结果一、题目 二、数学求解过程 该轮迭代分类结果全部正确,判别函数为g(x)=-2x1+1 三、...
    99+
    2024-04-02
  • 编程算法:如何使用Java和Bash实现?
    随着计算机技术的不断发展,编程算法成为了计算机领域中的一项重要技能。在现代计算机领域中,编程算法已经成为了一个基础技能,因此熟练掌握编程算法对于计算机从业者来说是非常重要的。 本文将介绍如何使用Java和Bash实现编程算法。Java是一...
    99+
    2023-06-19
    教程 编程算法 bash
  • SPFA算法的实现原理及其应用详解
    目录一、前言二、SPFA 算法1、SPFA算法的基本流程2、代码详解三、SPFA 算法已死一、前言 SPFA算法,全称为Shortest Path Faster Algorithm,...
    99+
    2023-05-20
    SPFA算法原理 SPFA算法应用 SPFA算法
  • 详解Dijkstra算法原理及其C++实现
    目录什么是最短路径问题Dijkstra算法实现思路案例分析代码实现什么是最短路径问题 如果从图中某一顶点(称为源点)到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿...
    99+
    2024-04-02
  • 详解Java实现拓扑排序算法
    目录一、介绍二、拓扑排序算法分析三、拓扑排序代码实现一、介绍 百科上这么定义的: 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中...
    99+
    2024-04-02
  • java实现的DES加密算法详解
    本文实例讲述了java实现的DES加密算法。分享给大家供大家参考,具体如下:一、DES加密算法介绍要求密钥必须是8个字节,即64bit长度因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用加密、...
    99+
    2023-05-31
    java des 加密算法
  • Java数据结构之KMP算法详解以及代码实现
    目录暴力匹配算法(Brute-Force,BF)概念和原理next数组KMP匹配KMP全匹配总结我们此前学了前缀树Trie的实现原理以及Java代码的实现。Trie树很好,但是它只能...
    99+
    2022-12-08
    Java 数据结构 KMP算法 Java KMP算法 Java KMP
  • Java MD5算法如何实现
    本文小编为大家详细介绍“Java MD5算法如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java MD5算法如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。MD5加密简介哈希...
    99+
    2023-07-02
  • Java实现权重随机算法详解
    目录应用场景本文目标算法详解权重比例Java 实现参考应用场景 客户端负载均衡,例如 Nacos 提供的客户端负载均衡就是使用了该算法 游戏抽奖(普通道具的权重很高,稀有道具的权重很...
    99+
    2024-04-02
  • Java如何实现Kruskal算法
    本文小编为大家详细介绍“Java如何实现Kruskal算法”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java如何实现Kruskal算法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。介绍构造最小生成树还有一种...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作