KM算法的时间复杂度,为什么可以降低一个数量级

背景知识

KM算法的作者是Kuhn-Munkras,发明时间在1960年左右,你随手百度一把就能找到不少相关资料,这里我就不重复罗列了,稍微归总一下基于二分图匹配相关的几个算法。

具体可以参考这篇文章:浅谈KM算法

算法性能的平均方式

算法性能的评价标准一般基于两种方式进行衡量:时间复杂度和空间复杂度。设计良好的算法,一般都会把时间和空间复杂度做到最优的状态,但是如果时间复杂度和空间复杂度只能选其一的话,一般都会优先考虑时间复杂度。毕竟,现在计算机的内存已经越来越便宜,而时间却越来越宝贵,用空间换时间就是一种良好的对策。

为什么KM需要考虑时间复杂度

KM算法如果不进行任何优化,原始默认的时间复杂度是: <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n 4 ) O(n^4) </math>O(n4)

n: 表示二分匹配的顶标数目。

下面我用一个更通俗的故事来表示,为什么这个复杂度是 : <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n 4 ) O(n^4) </math>O(n4)

故事如下

假设你是糖果工厂的小班长,要把3种不同颜色的糖果(红、蓝、绿)分给3个小朋友(小明、小红、小刚)。每个小朋友对不同颜色的糖果有不同的"喜爱值",比如小明特别喜欢红色糖(值5分),小红最爱蓝色糖(值4分)等等。你的任务是让每个小朋友都分到一颗糖,并且让总"喜爱值"最高。

原始方法(慢吞吞的O(n⁴))
  1. 第一步:随便分

    比如先给小明红糖果(5分),小红蓝糖果(4分),小刚绿糖果(3分)。总和是5+4+3=12分。

  2. 第二步:检查有没有更好的分法

    你觉得小刚可能更喜欢蓝糖果?于是重新调整:小明红糖果(5)、小红绿糖果(2)、小刚蓝糖果(4)。总和是5+2+4=11分,反而更差了!于是再换回来。

  3. 问题来了

    每调整一次,都要从头开始计算所有可能的分法。

    计算方式如下:

    小朋友数:3

    糖果数:3

    总分法: 3 * 3 = 9

    在最坏的情况下,每次都分错了,分错的总次数:3 * 3 = 9

    所以总共尝试次数就是: 3 * 3 * 3 * 3 = 81

    得到时间复杂度: <math xmlns="http://www.w3.org/1998/Math/MathML"> O ( n 2 ) ∗ O ( n 2 ) = O ( n 4 ) O(n^2)*O(n^2)=O(n^4) </math>O(n2)∗O(n2)=O(n4)

优化方法(聪明的O(n³))

秘诀:用笔记本记录重要信息!

  1. 第一步:分糖果时做笔记
    比如第一次分完后,你发现小红和小刚都喜欢蓝糖果,但小红更喜欢。于是你在笔记本上写:"下次优先把蓝糖果给小红"。
  2. 第二步:按笔记调整
    下次调整时,不用从头开始,直接看笔记本:蓝糖果已经给小红了,小刚只能选其他颜色。这样跳过了很多重复的尝试。
  3. 结果
    每次调整只需要检查剩下的可能性,不用从头再来。如果有100个小朋友,大约只需要试100×100×100(一百万次),比之前快了一百倍!这就是O(n³)。
🌈 核心思想总结
  • 原始方法:像没头苍蝇一样乱试,每次都要从头开始。
  • 优化方法:用"笔记本"记住谁喜欢什么,避免重复劳动。

时间复杂度就像数数:

  • 原始方法数数:1,2,3...10 → 要数10次,但每次都要重新从1开始,实际数了10×10=100次。
  • 优化方法数数:1,2,3...10 → 直接记住数到哪里了,只数10次。

结论:记住中间结果(笔记本)让算法聪明多了!

KM算法的时间复杂度

原始KM算法的时间复杂度

根据我的学习,原始的KM算法在最坏情况下的时间复杂度是O(n^4),其中n是图中顶点的数量。这个复杂度来源于算法的几个关键步骤:

  1. 初始化标号:为每个顶点分配初始标号。
  2. 寻找相等子图:基于标号构建一个包含所有顶点的子图,其中边的权重等于两端标号之和。
  3. 寻找完美匹配:在相等子图中尝试找到一个完美匹配。如果找不到,调整标号并重复。

在原始的实现中,每次调整标号后可能需要重新开始寻找匹配,这导致了较高的时间复杂度。

优化的KM算法

后来,人们对KM算法进行了优化,使其时间复杂度降低到O(n^3)。主要的优化点包括:

  1. 松弛边的处理:通过更高效的方式更新和维护可行顶标,减少不必要的计算。
  2. 使用广度优先搜索(BFS)或深度优先搜索(DFS) :在寻找增广路径时,采用更高效的搜索策略。
  3. 避免重复计算:通过维护一些中间结果,避免在每次迭代中重复相同的计算。
相关推荐
机器学习之心1 小时前
多目标鲸鱼优化算法(NSWOA),含46种测试函数和9个评价指标,MATLAB实现
算法·matlab·多目标鲸鱼优化算法·46种测试函数·9个评价指标
max5006002 小时前
基于Meta Llama的二语习得学习者行为预测计算模型
人工智能·算法·机器学习·分类·数据挖掘·llama
callJJ2 小时前
从 0 开始理解 Spring 的核心思想 —— IoC 和 DI(2)
java·开发语言·后端·spring·ioc·di
王哥儿聊AI3 小时前
Lynx:新一代个性化视频生成模型,单图即可生成视频,重新定义身份一致性与视觉质量
人工智能·算法·安全·机器学习·音视频·软件工程
你的人类朋友4 小时前
JWT的组成
后端
手握风云-4 小时前
优选算法的寻踪契合:字符串专题
算法
北风朝向5 小时前
Spring Boot参数校验8大坑与生产级避坑指南
java·spring boot·后端·spring
闭着眼睛学算法5 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
IT古董5 小时前
【第五章:计算机视觉-项目实战之目标检测实战】2.目标检测实战:中国交通标志检测-(2)中国交通标志检测数据格式转化与读取
算法·目标检测·计算机视觉
MobotStone5 小时前
LLM 采样入门到进阶:理解与实践 Top-K、Top-P、温度控制
算法