首页 > 编程语言 >稳定婚姻问题(Gale-Shapley算法)

稳定婚姻问题(Gale-Shapley算法)

时间:2023-10-04 20:16:28浏览次数:41  
标签:稳定 Shapley 匹配 表白 对象 Gale 算法 女孩子 男孩子

前言

今天 duck、香饽饽老板和彬彬一起出了个模拟赛,赛时T2想到了跟正解很接近的做法,但最后还是打挂了then喜提0pts,后面 duck 讲题的时候才知道是稳定婚姻板题。

看完证明之后觉得很妙,遂开坑。

只是简单整理,图一乐子吧算是。

说是稳定婚姻问题,但其实我觉得更合适的叫法是属性稳定分配问题,毕竟用简单几个维度来判断两人是否更适合结婚是很不明智的呢。QwQ

所以说恋综什么的完全就是无脑人群的流量游戏而已吧。


问题概述

有两类人群,分别为一群男孩子和一群女孩子,每个男孩子对女孩子们都有一个好感度排序,一个女孩子的排序越靠前则该男孩子越喜欢该女孩子,女孩子同理。
现在有两段恋爱关系:男孩子 \(A\) 与女孩子 \(A'\) 在一起了,男孩子 \(B\) 和女孩子 \(B'\) 在一起了。

但是当女孩子 \(B'\) 更喜欢男孩子 \(A\)、男孩子 \(A\) 也更喜欢女孩子 \(B'\) 时,则称这两段恋爱关系是不稳定的。

现在有 \(n\) 个男孩子和 \(n\) 个女孩子,问如何匹配才能使得所有的分配关系都是稳定的。


\(\text{Gale-Shapley}\) 算法

简单概述就是男孩子主动,女孩子在追求者中选最优。

匹配进行若干轮,直到所有人匹配成功时才会结束匹配。

在每一轮中,每个单身的男孩子都优先追求自己更喜欢的女孩子。

在面对一个男孩子表白时,女孩子会遇到如下局面:

  • 没有男孩子表白:没对象then专心AK NOI

  • 有一个男孩子表白:和该男孩子在一起。

  • 有一堆男孩子表白:选最优的那个男孩子。

注意第三种情况,这种情况下意味着有的男孩子可能会失去对象重归单身状态,此时他便需要在下一轮中重新追求一个女孩子。

重复若干轮,最后可证明每个人都一定会匹配上,并且整体的匹配关系是稳定的。

该算法流程体现的恋爱观我真的很难认可。

隔行如隔山,我祝他们成功。


证明

简单证明一下为什么该算法保证一定有稳定匹配方案

在每一轮匹配中,每个没有对象的男孩子都会至少向所有女孩子中的一个女孩子表白,一个男孩子经历了若干次在一起和分手后,他一定不会再与和他分过手或者拒绝过他的女孩子再在一起,因为和他分过手/拒绝了他的女孩子被他表白时一定会拥有一个更优的对象,此时这个男孩子会在该轮中继续选择更劣的一位女孩子进行表白。

最后在进行了超级超级多轮之后,若一个男孩子还是没有找到匹配,此时他一定跟所有的女孩子都表白过了,而每个女孩子在被表白过之后一定不会再变为单身状态,所以此时所有女孩子都一定有相应的匹配对象了。

于是为什么一定有匹配方案的问题就解决了。

接下来证明为什么此时的方案一定是稳定分配

理解了算法流程之后我们不难发现,男孩子的对象只会越变越差,女孩子的对象只会越来越优。

假设当前男孩子 \(A\) 和女孩子 \(B'\) 都有了各自的对象,且他俩没在一起,那么如果男孩子 \(A\) 相对于自己现在的对象更喜欢女孩子 \(B'\) 的话,那他一定会在表白自己当前的对象之前就表白了女孩子 \(A\),但是被女孩子 \(A\) 拒绝了,说明女孩子 \(A\) 有更喜欢的男孩子了,此时不满足不稳定关系的定义,故所有关系一定是稳定的。


时间复杂度

最优 \(O(n)\),最坏 \(O(n^2)\)。

最优情况下,在第一轮中,每个男孩子都没有被拒绝,直接一轮 \(O(n)\) 搞定。

最劣情况下,每一轮中都至少有一个女孩子和男孩子在一起,所以最多进行 \(n\) 轮,时间复杂度 \(O(n^2)\)。

注:最劣情况下的证明不严谨,但我不想写了,还要去补今天的第四题,各位可以自行证明。

标签:稳定,Shapley,匹配,表白,对象,Gale,算法,女孩子,男孩子
From: https://www.cnblogs.com/vicky-like-orange/p/17742645.html

相关文章

  • 【基础算法】排序算法
    一、排序算法简介排序是对批量数据按照一定的顺序进行排列的操作。1.1学习排序算法的要点算法原理、代码实现、评价算法优劣。1.2评价排序算法的优劣排序算法的优劣可以从以下3个方面进行评价:时间性能:最好、最坏、平均时间复杂度;内存占用:是否原地排序,原地排序算法,......
  • C/C++学习 -- 分组加密算法(DES算法)
    数据加密标准(DataEncryptionStandard,DES)是一种对称密钥加密算法,是信息安全领域的经典之作。本文将深入探讨DES算法的概述、特点、原理,以及提供C语言和C++语言实现DES算法的代码案例。一、DES算法概述DES算法是一种对称密钥加密算法,由IBM于1977年开发并于1977年被美国国家标准局(NI......
  • 视频融合/监控汇聚平台EasyCVR人形检测算法应用汇总
    安防视频监控平台EasyCVR是一个具有强大拓展性、灵活的视频能力和轻便部署的平台。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,还可以支持厂家的私有协议和SDK接入,例如海康Ehome、海大宇等设备的SDK。该平台不仅拥有传统安防视频监控的功能,还具备接入AI智能分析的......
  • 排序算法
    在线验证算法排序数组算法实现1.快排思路树的前序遍历。每次选取一个数作基准值,将小于基准值的数放在左边,大于基准值的数放在右边。遍历左子树及右子树,直到只有1个数为止。实现classQuickSort{publicstaticvoidsort(int[]nums){shuffle(nums);......
  • 归并排序算法详解
    算法介绍引用百度百科的介绍。归并排序(MergeSort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(DivideandConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表......
  • 算法:线段树
    算法:线段树哦吼!终于来学线段树啦~~拖了好久都没有敢学,主要是基础知识点不熟,代码能力太弱。但是现在已经是时候了。来看:线段树(SegmentTree)几乎是算法竞赛最常用的数据结构了,它主要用于维护区间信息(要求满足结合律)。与树状数组相比,它可以实现\(O(log⁡\n)\)的区间修改,......
  • 文心一言 VS 讯飞星火 VS chatgpt (105)-- 算法导论10.1 3题
    三、用go语言,仿照图10-2,画图表示依次执行操作ENQUEUE(Q,4)、ENQUEUE(Q,1)、ENQUEUE(Q,3)、DEQUEUE(Q)、ENQUEUE(Q,8)和DEQUEUE(Q)每一步的结果,队列初始为空,存储于数组Q[1..6]中。文心一言:在这个问题中,我们尝试使用Go语言来模拟队列的操作,并且展示每一步的结果。首先,我们需要定......
  • 文心一言 VS 讯飞星火 VS chatgpt (105)-- 算法导论10.1 3题
    三、用go语言,仿照图10-2,画图表示依次执行操作ENQUEUE(Q,4)、ENQUEUE(Q,1)、ENQUEUE(Q,3)、DEQUEUE(Q)、ENQUEUE(Q,8)和DEQUEUE(Q)每一步的结果,队列初始为空,存储于数组Q[1..6]中。文心一言:在这个问题中,我们尝试使用Go语言来模拟队列的操作,并且展示每一步的结果。首先,我们需要定义......
  • 记一种无需形式幂级数求逆的多点求值算法
    仅作为个人理解之用来自https://judge.yosupo.jp/submission/140699首先producttree部分不变我们考虑如何不使用形式幂级数求逆注意到如果对dft的点值求逆实际上是在对x^lim-1取模的意义下实际上在这个意义下也是可做的首先判掉所求点值在dft所用的单位根上的平凡情况(......
  • [数据结构和算法] 堆/优先队列的实现
    预备知识:完全二叉树可以用数组表示:从下标0开始存储数据:左子节点=2*父节点+1,右子节点=2*父节点+2;从下标1开始存储数据:左子结点=2*父节点,右子节点=2*父节点+1;堆:大根堆:父节点的值大于等于左右子节点的值;小根堆:父节点的值小于等于左右子节点的值;......