В группе из N человек всем известен только один человек. Такой человек может присутствовать на вечеринке, если да, то он не знает никого на вечеринке. Мы можем только задавать вопросы типа « А знает ли Б? «. Найдите незнакомца (знаменитость) в минимальном количестве вопросов.
Мы можем описать ввод проблемы как массив чисел / символов, представляющих людей в группе. У нас также есть гипотетическая функция HaveAcquaintance (A, B), которая возвращает true, если A знает B, иначе false . Как мы можем решить эту проблему.
Мы измеряем сложность с точки зрения обращений к HaveAcquaintance ().
Метод 1 (график)
Мы можем смоделировать решение, используя графики. Инициализируйте степень и степень каждой вершины как 0. Если A знает B, нарисуйте направленное ребро из A в B, увеличьте степень B и степень A на 1. Постройте все возможные ребра графа для каждой возможной пары [i, j ]. У нас есть N C 2 пары. Если на вечеринке присутствует знаменитость, у нас будет один приемный узел на графике с нулевой степенью и степенью N-1. Мы можем найти узел приемника за (N) времени, но общая сложность составляет O (N 2 ), так как нам нужно сначала построить граф.
Метод 2 (рекурсия)
Мы можем разложить проблему на комбинацию меньших экземпляров. Скажем, если мы знаем знаменитостей из N-1, можем ли мы распространить решение на N? У нас есть две возможности: Знаменитость (N-1) может знать N, или N уже знала Знаменитость (N-1). В первом случае N будет знаменитостью, если N никого не знает. В последнем случае нам нужно проверить, что Знаменитость (N-1) не знает N.
Решите проблему меньшего экземпляра во время шага деления. На обратном пути мы находим знаменитость (если есть) из меньшего экземпляра. На этапе объединения проверьте, известна ли всем возвращенная знаменитость, и он никого не знает. Рецидив рекурсивного разложения
Т (Н) = Т (Н-1) + О (Н)
T (N) = O (N 2 ). Вы можете попробовать написать псевдокод, чтобы проверить свои навыки рекурсии.
Метод 3 (Использование стека)
Построение графа занимает O (N 2 ) времени, оно похоже на поиск методом перебора. В случае рекурсии мы уменьшаем экземпляр проблемы не более чем на один, а также комбинированный шаг, позволяющий проверить M-1 человек (M — размер экземпляра).
У нас есть следующие наблюдения, основанные на технике исключения (см. Книгу Поли «Как решить» ).
- Если А знает В, то А не может быть знаменитостью. Откажитесь от А, и Б может быть знаменитостью .
- Если A не знает B, то B не может быть знаменитостью. Откажитесь от Б, и А может быть знаменитостью .
- Повторите выше два шага, пока мы не ушли только с одним человеком.
- Убедитесь, что оставшийся человек знаменитость. (Зачем нам этот шаг?)
Мы можем использовать стек для настоящей знаменитости.
- Сложите всех знаменитостей в стек.
- Вытащите двух верхних игроков из стека, откажитесь от одного человека на основе статуса возврата HaveAcquaintance (A, B) .
- Поместите оставшегося человека в стек.
- Повторите шаги 2 и 3, пока в стеке не останется только один человек.
- Проверьте, что оставшийся человек в стеке не знаком с кем-либо еще.
Мы отбросим N элементов максимально (Почему?). Если знаменитость присутствует на вечеринке, мы будем вызывать HaveAcquaintance () 3 (N-1) раза. Вот код, использующий стек.
|
Джава
|
Выход :
Celebrity ID 2
Сложность O (N). Всего сравнений 3 (N-1). Попробуйте приведенный выше код для успешного выполнения MATRIX {{0, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 1}}.
Примечание: вы можете подумать, зачем нам нужен новый график, поскольку у нас уже есть доступ к матрице ввода. Обратите внимание, что матрица MATRIX использовалась для помощи гипотетической функции HaveAcquaintance (A, B), но никогда не получала доступ через обычную запись MATRIX [i, j]. У нас есть доступ к входу только через функцию HaveAcquiantance (A, B) . Матрица — это просто способ кодирования решения. Мы можем принять стоимость гипотетической функции как O (1).
Если все еще не ясно, предположим, что функция HaveAcquiantance осуществляет доступ к информации, хранящейся в наборе связанных списков, расположенных по уровням. Узел списка будет иметь указатели next и nextLevel . Каждый уровень будет иметь N узлов, то есть список N элементов, следующие точки указывают на следующий узел в списке текущего уровня, а указатель nextLevel в последнем узле каждого списка будет указывать на заголовок списка следующего уровня. Например, представление связанного списка вышеупомянутой матрицы выглядит так:
L0 0->0->1->0 | L1 0->0->1->0 | L2 0->0->1->0 | L3 0->0->1->0
Функция HaveAcquanintance (i, j) будет искать в списке j-й узел на i-м уровне. Наша цель — минимизировать вызовы функции HaveAcquanintance .
Метод 4 (с использованием двух указателей)
Идея состоит в том, чтобы использовать два указателя, один с начала и один с конца. Предположим, что начальный человек — А, а конечный — Б. Если А знает В, то А не должен быть знаменитостью. Иначе, Б не должно быть знаменитостью. Мы найдем кандидата в знаменитости в конце цикла. Пройдите через каждого человека снова и проверьте, является ли это знаменитостью. Ниже приведена реализация C ++.
|
Джава
|
C #
|
PHP
|
Выход :
Celebrity ID 2
Спасибо Сисси Пенг за предложение этого метода.
Связанная статья:
Количество узлов стока в графе
Упражнения:
1. Напишите код, чтобы найти знаменитость. Не используйте какие-либо структуры данных, такие как графики, стек и т. Д., У вас есть доступ только к N и HaveAcquaintance (int, int) .
2. Реализуйте алгоритм, используя Очереди. Каково ваше наблюдение? Сравните ваше решение с поиском максимума и минимума в массиве и турнирным деревом . Какое минимальное количество сравнений нам нужно (оптимальное количество обращений к HaveAcquaintance () )?
— Венки . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Проблема с гайками и болтами (проблема с замком и ключом) | Набор 2 (Hashmap)
- Проблема с гайками и болтами (проблема с замком и ключом) | Комплект 1
- Проблема с черепицей
- Задача суммы подмножеств | DP-25
- Проблема укладки коробок | DP-22
- Проблема с разделами | DP-18
- 0-1 Рюкзак Задача | DP-10
- Проблема раздела художника | Набор 2
- Проблема капли воды
- Проблема изоморфизма деревьев
- Проблема распространения шоколада
- Проблема раздела художника
- Проблема с разрывом слов | DP-32
- Проблема золотого рудника
- Проблема переноса слов | DP-19
0.00 (0%) 0 votes