Случайный алгоритм с оптимальным ожидаемым временем выполнения O (n) и отличными константами:
- Выбор случайного человека
- Спросите остальных, является ли он лжецом,пока один из вариантов («да» или «нет») не будет иметь вес> n / 2 (т. е. до тех пор, пока более n / 2 человек не ответили одинаково).
Большинство принимает решение (это ключевое наблюдение!). - Если он не лжец, переберите оставшихся людей и спросите только его , является ли каждый человек лжецом (поскольку мы определили, что он говорит правду).
- Если он лжец, выведите его из группы и вернитесь к 1.
Ключевое наблюдение состоит в том, что если мы спросим всех об одном человеке, мнение большинства должно быть правильным(так как есть большинство рассказчиков правды).Небольшая техническая составляющая: если мы сначала выберем не-лжеца и спросим всех остальных, если предположим, что все лжецы лгут, мы достигнем 50-50, так как мы решим, какая сторона говорит правду?Это не проблема, так как мы можем достичь 50-50, только если выберем не-лжеца, поэтому наш человек действительно рассказчик правды.
Ожидаемое числолюди, которых нам придется выбирать случайным образом, - это O (1) (это самая важная часть этого вопроса, и поскольку это может быть домашнее задание, я пропущу доказательство, но намекну на простое доказательство: геометрическое распределение), что означает, что мынайдем наш правдивый и надежный источник за O (1) * O (n) раз, а оттуда еще один O (n) до финиша.Всего O (n).