Эффективный подход к максимальному увеличению количества пар

Это вопрос из интервью, с которым я недавно столкнулся. У вас есть G гостей (пронумерованных от 1 до G) на вечеринке. У каждого гостя есть список предпочтений длиной G, который представляет его предпочтения в общении с другими. Например, если список предпочтений гостя 1 N Y N N Y (при условии, что гостей 5), то гость 1 заинтересован в разговоре либо с 2, либо с 5, но не с другими.

Предположить, что

а) Каждый гость может поговорить только с одним другим гостем
б) Если a заинтересован в разговоре с b , то b также заинтересован в разговоре с a

Учитывая матрицу гостей и их предпочтения, дайте максимальное количество пар, которые могут оставаться занятыми.

Let G = 5;

Матрица предпочтений

N Y N N N
Y N Y Y Y
N Y N N N
N Y N N N
N Y N N N

Как мы видим, всем интересно поговорить с Гостем 2, но он может поговорить только с одним другим человеком, поэтому ответ — 1 пара.

Мой подход:

Я думал об этом как о проблеме максимального соответствия в теории графов, но не смог реализовать ее в короткие сроки (я не очень хорошо разбираюсь в реализации графического алгоритма)

Это решается только с помощью графиков или есть более быстрый и лучший подход?
Существует ли жадный подход?


person algo1    schedule 06.11.2014    source источник
comment
Нет более простого комбинаторного способа сделать это, чем алгоритм цветения Эдмондса. (По крайней мере, неизвестно.) Однако есть забавный трюк с линейной алгеброй.   -  person tmyklebu    schedule 06.11.2014


Ответы (2)


Мы можем использовать рекурсию и некоторую мемоизацию. Пожалуйста, найдите способ распознать граф с K узлами и всеми отношениями (ниже мы увидим, зачем нам это нужно). Во время рекурсии мы должны записать уже решенные случаи (K, R), где K — количество гостей, а R — список отношений этих K гостей.

Для задачи (N, R) мы будем нумеровать гостей как 1, 2, ..., N, а затем просмотреть список отношений, чтобы получить список без повторений (хэш-таблица может помочь проверить наличие дубликатов).

1 и 2, 1 и 4, 2 и 3 и т. д.

Нам нужно найти максимум не сталкивающихся пар (например, 1 и 2 сталкиваются с 2 и 3). Мы можем использовать следующий рекурсивный алгоритм:

A) если 1 и 2 взяты, то удалите все пары с 1 или 2 и выполните рекурсию на остальных.

RA будет списком оставшихся отношений без 1 и 2. И у нас есть рекурсия ((N-2), RA)

B) если 1 и 2 пропущены, выполните рекурсию с остальными.

RB будет списком оставшихся отношений без ссылки (1 и 2). И у нас есть рекурсия (N, RB) - все еще N, потому что 1 или 2 все еще могут оставаться в полном наборе.

C) Проверьте, какой маршрут отображает большее количество пар.

Нам нужна память для хранения результатов (K, R), потому что могут быть группы гостей, такие как (1, 3, 5,...) и (2, 4, 6,...), где гости являются друзьями друг друга. только внутри кластеров.

Если мы используем наивную рекурсию, мы будем решать одни и те же проблемы много раз. Но кластеры означают, что их решения симметричны. Поэтому нам нужно распознавать графы по комбинации количества гостей и их отношений (перенумерация гостей дает тот же граф).

person Timothy Ha    schedule 06.11.2014
comment
Смотрите ответ Ганнуса. Удаление гостей, у которых не осталось друзей, на каждом шаге рекурсии — это оптимизация. - person Timothy Ha; 07.11.2014
comment
+1, Хорошая мысль у вас тут, про кластеры, но вы ее в алгоритм не внесли. Я попытался улучшить его дальше. - person Gangnus; 07.11.2014
comment
@Gangnus, функция для (K, R) должна заботиться об идентичных кластерах. Я все еще думаю, как можно быстро распознать, что два графика идентичны. Это должна быть стандартная тема CS, но интересно подумать над ней самостоятельно. - person Timothy Ha; 07.11.2014
comment
Конечно, дополнительная утилита для сравнения графиков будет полезна, чтобы не переделывать похожие подграфы. Особенно это было бы полезно для небольших графиков. - person Gangnus; 07.11.2014
comment
@Gangnus - сравнение графиков оказалось довольно большой темой :) cs.bilkent.edu.tr/~saksoy/courses/cs551-Spring2009/papers/ (тридцать лет сопоставления графов! И O(n) предлагается только в 2001 году) - person Timothy Ha; 09.11.2014

Рекурсия будет разделена на два основных этапа:

Упрощение:
Удаление гостей без друзей.
Разделение графика на несвязанные области.

Далее для каждой области будет выполняться следующий этап:

Обрезка
Упорядочить гостей в соответствии с количеством их друзей.
Внести первое непроверенное соединение в список найденных пар.
Повторить весь процесс, начиная с упрощения, с помощью полученной уменьшенной области до тех пор, пока все соединения не будут рекурсивно опробованы или количество пар в текущем наборе построения не станет равным [мощность области /2].

Мы также могли бы улучшить скорость, если сначала попробуем соединения, которые делят область на две несвязанные области с равной мощностью.

person Gangnus    schedule 06.11.2014
comment
Не могли бы вы проверить мой ответ? Упорядочивание, возможно, не сильно помогает в случае кластеров гостей, хотя удаление гостей без друзей на каждом шаге рекурсии является оптимизацией. - person Timothy Ha; 07.11.2014