@b2afb924

Как угадать возраст за наименьшее кол-во попыток?

Имеем популяцию людей от одного до ста лет, и знаем заранее ориентировочную статистику распределения людей по возрастам. Как, за наименьшее кол-во шагов "угадать" возраст человека, если ему можно задавать вопросы только в формате "старше/моложе ли вы N лет?". Я знаю как угадать за 7 шагов (методом деления пополам), но интересуют более совершенные методы. Буду благодарен любым соображениям на этот счет.
  • Вопрос задан
  • 607 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Бинарный поиск, однако точка деления — не (a+b)/2, а медиана куска распределения от a до b (т.е. round(F−1([F(a) + F(b)]/2)); F(·) — функция распределения, тупо переделанная из кусочно-постоянного вида в кусочно-линейный, сплайновый или ещё какой-нибудь).
Немного неоптимально, но крайне просто.

З.Ы. Эта штука достаточно оптимальна для «гладких» распределений. В общем случае неоптимальна — например, если у нас три возраста с вероятностями 0,45, 0,1 и 0,45, стоит спросить первый, потом третий и уж при полном невезении второй (среднее 1,65 запроса), а не брать среднее, а затем — первое или второе (в среднем 1,9 запросов).

Если нужен точный оптимум — решать задачу динамического программирования по критерию
N[a,b] = min{c} (1 + (N[a,c−1]p[a,c−1] + N[c+1,b]p[c+1,b]) / p[a,b]).
Граничные условия: при a = b N[a,b] = 1; при a>b N[a,b] = 0.
p[a,b] — суммарная вероятность от a до b включительно; вычисляется как sum[b]−sum[a−1]; sum[i] = sum{x <= i} p(x).
N[0,M] = ?

Или, обозначив Q[a,b] как N[a,b]p[a,b],
Q[a,b] = min{c} (p[c] + Q[a,c−1] + Q[c+1,b]).
Так как p[0,M] = 1, то Q[0,M] = N[0,M].
Граничные условия: при a = b Q[a,b] = p[a]; при a>b Q[a,b] = 0.
Q[0,M] = ?

Решается задача за O(M²) операций. Если нужно хранить всю информацию, чтобы в нужный момент прокрутить цепь запросов — O(M²) памяти; если только указать оптимум — можно обойтись O(M).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
agent10
@agent10
Software Engineer
Имхо, для точного результата - только бинарный поиск как вы и делаете.
Все остальные способы - результат с вероятностью.
Ответ написан
opium
@opium
Просто люблю качественно работать
Попробуйте делить на три )
Ну и неплохо бы использовать статистику распределения, чтобы увеличить шансы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы