Алгоритм Гейла-Шепли предназначен для решения задачи стабильного сопоставления с 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 := 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 раз в худшем случае. Это дает время l oop O (n ^ 2). Но во внутренней l oop есть строка, которая касается меня:
if w prefers m to m' then
Разве это не значит, что нам нужно перебирать список предпочтений, чтобы найти, кто появляется первым? Разве это не будет O (n), что делает алгоритм O (n 3 )?
Мои списки предпочтений для мужчин и женщин относятся к типу int[n][n]
. Внешний индекс - это идентификатор человека, которому принадлежит внутренний список. Внутренний список содержит идентификаторы каждого противоположного пола, упорядоченные по предпочтению владельца.