📜  门| GATE CS Mock 2018年|问题11(1)

📅  最后修改于: 2023-12-03 15:12:38.571000             🧑  作者: Mango

GATE CS Mock 2018年 | 问题11

该问题涉及到计算稳定婚姻的问题。以下是一个完整的解决方案,其中代码片段已按markdown标明。

问题描述

n 个男士和 n 个女士。每个人都有他/她所偏爱的对象。 对于每个男士或女士i,偏好列表按优先级从高到低排序,其中Si表示性别为i的人。 例如,如果Si喜欢Sj,但不喜欢Sk,则Si喜欢Sj比喜欢Sk更多。 在此问题中存在一个偏好,即每个男性(或每个女性)比其他人都要想嫁(或要娶)最喜欢的异性。

从模拟开放测试年份题庫https://www.geeksforgeeks.org/mock-tests-gate-cse/获取更多问题。

稳定的婚姻

稳定婚姻的概念是:不存在一对男女,他们更喜欢彼此而不喜欢自己目前的伴侣。 显然,如果没有人可以找到更好的匹配,那么所有匹配都稳定。

稳定婚姻算法

以下是稳定婚姻算法的实现代码,复杂度为O(n^2)。该算法基于:为每个女性维护当前选择的男性以及对其所有男性的偏好列表的优先级。

def stable_marriage(n, men, women):
    # 表示每个女人选择的男人的下标。初始值全部为None。
    women_match = [None] * n

    # 表示每个人另一半的下标。初始值全部为None。
    men_match = [None] * n

    # 表示每个女人当前正在考虑的男人的下标。
    women_index = [0] * n

    # 稳定婚姻核心循环,一直执行到所有男性都有匹配为止。
    while None in men_match:

        # 对于当前所有未匹配的男子,选择他们目前可能偏好的最佳女子。
        for i, man in enumerate(men):

            # 如果该男性已经匹配,则跳过该男性。
            if men_match[i] is not None:
                continue

            # 按其偏好顺序遍历该男性偏好的女性。
            while women_index[i] < n:

                # 获取该男性的下一个偏好女性。
                woman_index = men[i][women_index[i]]

                # 找到女性的下标。
                woman = women[woman_index]

                # 如果该女性尚未与任何男人匹配,则匹配男性和女性。
                if women_match[woman_index] is None:
                    women_match[woman_index] = i
                    men_match[i] = woman_index
                    break

                # 否则,比较该女性当前匹配的男性与该男性。
                other_man_index = women_match[woman_index]
                other_man = men[other_man_index]

                # 如果该男性更好,则使该男性和该女性匹配。
                if woman.index(i) < woman.index(other_man_index):
                    men_match[other_man_index] = None
                    women_match[woman_index] = i
                    men_match[i] = woman_index
                    break

                # 如果该女性更喜欢当前的配偶,则查找下一位男子。
                women_index[i] += 1
总结

通过上述算法,我们可以计算稳定婚姻。如果有任何男子或女子更喜欢与另一个人匹配,则该算法会找到这些问题并将其解决。 复杂度为O(n^2),这意味着无法处理非常大的输入。