问题描述如下:
有n个男生和n个女生,找出一种稳定的匹配方式,满足以下条件:
1. 每个男生能且只能匹配一个女生。
2. 每个男生将所有女生排序形成一个列表,从最喜欢到最不喜欢依次排列。
3. 每个女生将所有男生排序形成一个列表,从最喜欢到最不喜欢依次排列。
不稳定因素:如果在已经匹配好的方案中,存在某个男生,更喜欢他配偶以外的女生,且那个女生也更喜欢他,则该男生与女生则为一对不稳定因素。注意,单方面更喜欢并不是不稳定因素。
稳定匹配:保证完美匹配且不存在不稳定因素。
一种稳定匹配算法:Propose-and-reject algorithm. [Gale-Shapley 1962]
Initialize each person to be free.
while (some man is free and hasn't proposed to every woman) {
Choose such a man m
w = 1st woman on m's list to whom m has not yet proposed
if (w is free)
assign m and w to be engaged
else if (w prefers m to her fiancé m')
assign m and w to be engaged, and m' to be free
else
w rejects m
}
通俗来讲就是:
- 从男生集合中选择一位男生,根据他的偏好列表,从没有尝试过的第一位女生开始尝试匹配。
- 如果对应的女生没有配偶,或者该女生有配偶但更喜欢当前男生。那么这个女生就会答应当前男生,并T掉之前的配偶。
- 否则,女生拒绝当前男生,进行下一次循环。
算法的时间复杂度为O(n^2)
注意,稳定匹配不一定存在,如果待匹配的两个集合互不相关,则一定存在稳定匹配;如果是一个集合中的元素互相匹配,则不一定有稳定匹配。
一个反例: