Algorithm 如何实现Gale-Shapley算法的O(n^2)复杂度?
解决了O(n2)的稳定匹配问题。在匹配问题中,有n个女人和n个男人。每个人都有一份对每一位异性婚姻成员的偏好列表。我们的目标是创造这样的夫妻,没有人会因为把婚姻留给别人而变得更好 以下是来自维基百科的伪代码:Algorithm 如何实现Gale-Shapley算法的O(n^2)复杂度?,algorithm,data-structures,time-complexity,Algorithm,Data Structures,Time Complexity,解决了O(n2)的稳定匹配问题。在匹配问题中,有n个女人和n个男人。每个人都有一份对每一位异性婚姻成员的偏好列表。我们的目标是创造这样的夫妻,没有人会因为把婚姻留给别人而变得更好 以下是来自维基百科的伪代码: algorithm stable_matching is Initialize all m ∈ M and w ∈ W to free while ∃ free man m who still has a woman w to propose to do w
algorithm stable_matching is
Initialize all m ∈ M and w ∈ W to free
while ∃ free man m who still has a woman w to propose to do
w := first woman on m's list to whom m has not yet proposed
if w is free then
(m, w) become engaged
else some pair (m', w) already exists
if w prefers m to m' then
m' becomes free
(m, w) become engaged
else
(m', w) remain engaged
end if
end if
repeat
在最坏的情况下,每个男人(n)最多可以求婚n次。这就给出了while循环O(n^2)。但在内部循环中有一条线与我有关:
if w prefers m to m' then
这难道不意味着我们必须遍历一个偏好列表才能找到谁最先出现吗?这不也是O(n)吗,使算法成为O(n3)
我对男性和女性的偏好列表都是
int[n][n]
类型。外部索引是内部列表所有者的id。内部列表包含每个异性的ID,按所有者的偏好排序。否。不需要迭代来查找偏好。因为偏好是按顺序给出的。在这里,偏好的定义是对男性或女性的排序。因此,您不需要迭代来发现m
是否优于m'
这难道不意味着我们必须遍历一个偏好列表才能找到谁最先出现吗?这不也是O(n)吗,使算法成为O(n3)
没有
我对男性和女性的偏好列表都是int[n][n]类型。外部索引是内部列表所有者的id。内部列表包含每个异性的ID,按所有者的偏好排序
您需要对首选项执行的操作决定了要为其使用的适当数据结构。你需要一个女人能够在固定的时间内比较她对两个不同男人的偏好,所以你应该使用支持这一点的数据结构。例如,您可以反转女性偏好列表以创建排名图,这样rank[m]
将返回男性m
在其原始偏好列表中的排名
创建所有排名图需要O(n2)个时间(以人数计算),因此不会增加算法的整体复杂性。我的想法是朝着这个方向发展的,但我所看到的描述或实现都没有定义女性偏好列表与男性偏好列表不同。让男人的偏好列表也成为排名图是没有意义的,对吧?对。男性按顺序访问他们的偏好,因此队列或堆栈适合他们。