Представь, что ты в высоком здании с кошкой. Кошка может пережить падение из невысокого окна, но умрет, если ее выбросить с высокого пола. Как вы можете определить самую длинную каплю, которую может выжить кошка, используя наименьшее количество попыток?
Очевидно, что если у вас есть только один кот, то вы можете искать только линейно. Сначала бросьте кота с первого этажа. Если он выживет, киньте его со второго. В конце концов, после того, как его выбросят с пола, кошка умрет. Тогда вы знаете, что этаж f-1 был максимально безопасным этажом.
Но что, если у вас есть более одного кота? Теперь вы можете попробовать какой-то логарифмический поиск. Допустим, сборка имеет 100 этажей, и у вас есть две одинаковые кошки. Если вы выбрасываете первого кота с 50-го этажа, и он умирает, то вам нужно только искать 50 этажей линейно. Вы можете сделать еще лучше, если вы выберете нижний этаж для первой попытки. Допустим, вы решили заняться проблемой 20 этажами одновременно, и что первый фатальный этаж - №50. В этом случае ваша первая кошка переживет полеты с этажей 20 и 40, а затем умрет с этажа 60. Вам просто нужно проверить этажи с 41 по 49 индивидуально. Это в общей сложности 12 попыток, что намного лучше, чем 50, которые вам понадобились бы, если бы вы попытались использовать двоичное исключение.
В общем, какова лучшая стратегия и сложность в худшем случае для n-этажного здания с 2 кошками? Как насчет n этажей и m кошек?
Предположим, что все кошки эквивалентны: все они выживут или погибнут от падения из заданного окна. Кроме того, каждая попытка независима: если кошка переживет падение, она совершенно не пострадает.
Это не домашнее задание, хотя, возможно, я однажды решил его для школьного задания. Это просто причудливая проблема, которая возникла у меня в голове сегодня, и я не помню решения. Бонусные баллы, если кто-то знает название этой проблемы или алгоритм решения.
Ответы:
Вы можете легко написать небольшое DP (динамическое программирование) для общего случая n этажей и m котов.
Основная формула,
a[n][m] = min(max(a[k - 1][m - 1], a[n - k][m]) + 1) : for each k in 1..n
должна быть самоочевидной:k - 1
этажи для проверки (все нижеk
) иm - 1
cats (a[k - 1][m - 1]
).n - k
этажей (все этажи вышеk
) и все ещеm
кошки.max
.+ 1
исходит из того, что мы только что использовали одну попытку (независимо от того, выжил кот или нет).min(f(k)) : for k in 1..n
.Это согласуется с результатом Google по ссылке Гаурава Саксены для (100, 2).
Вы можете легко найти стратегию (как бросить первую кошку), если лучше сохранить
k
в другой массив.Есть также более быстрое решение, не требующее O (n ^ 3) вычислений, но я уже немного сонный.
редактировать
Ах да, я помню , где я видел эту проблему раньше .
источник
+ 1
необходимости быть внеmin()
? Как вы сами говорите, удачная попытка или нет, это все же попытка.+1
за пределыmin
. Или перемещая это внутрьmax
:)Согласно недавнему эпизоду Radiolab (о «Падении») , кошка достигает предельной скорости на 9-м этаже. После этого он расслабляется и с меньшей вероятностью будет ранен. Есть совершенно неповрежденные кошки после падения сверху 30-го. Самые опасные этажи с 5 по 9.
источник
Лучшая стратегия для решения этой проблемы - исследовать, используя закон физики, вероятность того, что ваши предположения верны в первую очередь.
Если бы вы сделали это, вы бы поняли, что шансы кошки на выживание на самом деле возрастают с увеличением расстояния до земли. Конечно, если вы выбрасываете его из более высокого здания, такого как башни Петронас, а не из более высокой горы, такой как гора Эверест.
Изменить:
На самом деле, вы увидите незаконченное распределение верблюдов.
Во-первых, вероятность смерти кота мала (очень низкая высота), затем она становится выше (низкая высота), затем снова уменьшается (большая высота), а затем снова увеличивается (очень большая высота).
График вероятности смерти кота в зависимости от высоты над землей выглядит следующим образом:
(закончите на 3, потому что незаконченное распределение верблюдов)
Обновление:
конечная скорость кошки составляет 100 км / ч (60 миль в час) [= 27,7 м / с = 25,4 ярда / с].
Конечная скорость человека составляет 210 км / ч (130 миль в час). [= 75 м / с = 68,58 ярдов / с]
Терминальный источник скорости:
http://en.wikipedia.org/wiki/Cat_righting_reflex
Кредиты:
Goooooogle
Мне нужно проверить позже:
http://en.wikipedia.org/wiki/Terminal_velocity
http://www.grc.nasa.gov /WWW/K-12/airplane/termv.html
источник
Я впервые прочитал эту проблему в Стивене Скиене алгоритмов (упражнение 8.15). Он последовал за главой о динамическом программировании, но вам не нужно знать динамическое программирование, чтобы доказать точные границы стратегии . Сначала постановка задачи, затем решение ниже.
Только 1 яйцо
Сброс яйца с каждого этажа, начиная с первого, найдет критический этаж в (в худшем случае) n операций.
Нет более быстрого алгоритма. В любое время в любом алгоритме, пусть g самый высокий этаж, с которого было замечено, что яйцо не разбилось. Алгоритм должен проверять этаж g + 1 перед любым верхним этажом h> g + 1, иначе, если яйцо оторвется от пола h, он не сможет различить f = g + 1 и f = h.
2 яйца
Сначала рассмотрим случай k = 2 яиц, когда n = r ** 2 - идеальный квадрат. Вот стратегия, которая занимает O (sqrt (n)) время. Начните с того, что опустите первое яйцо с шагом r этажа. Когда первое яйцо разбивается, скажем, на этаже
ar
, мы знаем, что критический этаж f должен быть(a-1)r < f <= ar
. Затем мы бросаем второе яйцо с каждого этажа, начиная с(a-1)r
. Когда второе яйцо разбивается, мы нашли критический этаж. Мы отбрасывали каждое яйцо не более r раз, поэтому этот алгоритм выполняет в худшем случае 2r операций, что составляет Θ (sqrt (n)).Когда n не является идеальным квадратом, возьмем r =
ceil(sqrt(n)) ∈ Θ(sqrt(n))
. Алгоритм остается Θ (sqrt (n)).Доказательство того, что любой алгоритм требует как минимум sqrt (n) времени. Предположим, есть более быстрый алгоритм. Рассмотрим последовательность этажей, с которых оно сбрасывает первое яйцо (пока оно не разбивается). Поскольку он падает меньше, чем sqrt (n), интервал должен быть не менее n / sqrt (n), который равен sqrt (n). Когда f находится в этом интервале, алгоритм должен будет исследовать его со вторым яйцом, и это должно быть сделано поэтапно, напоминая случай с 1 яйцом. ПРОТИВОРЕЧИЕ.
к яиц
Алгоритм, представленный для 2 яиц, может быть легко расширен до k яиц. Отбрасывайте каждое яйцо с постоянными интервалами, которые следует принимать в качестве степеней k-го корня n. Например, для n = 1000 и k = 3, ищите интервалы в 100 этажей с первым яйцом, 10 с вторым яйцом и 1 с последним яйцом.
Точно так же мы можем доказать, что ни один алгоритм не быстрее
Θ(n**(1/k))
, индуцируя из k = 2 доказательства.Точное решение
Мы выводим рецидив, оптимизируя, куда бросить первое яйцо (пол g), предполагая, что мы знаем оптимальные решения для меньших параметров. Если яйцо разбивается, у нас есть этажи g-1 ниже, чтобы исследовать с яйцами k-1. Если яйцо выживет, у нас есть n этажей выше, чтобы исследовать его с k яйцами. Дьявол выбирает худшее для нас. Таким образом, при k> 1 повторение
источник
O(k*n**(1/k))
в худшем случае? Так как в худшем случае мне приходится проходитьn**(1/k)
ровноk
раз.Разве это не предполагает, что вы используете "Тот же кот"?
Вы можете приблизиться к нему математически, но это хорошо в математике ... с правильными предположениями, 0 может равняться 1 (для больших значений 0).
С практической точки зрения, вы можете получить «Похожие кошки», но вы не можете получить «Та же самая кошка».
Вы можете попытаться определить ответ эмпирически, но я думаю, что статистических различий будет достаточно, чтобы ответ был статистически бессмысленным.
Вы можете попытаться ИСПОЛЬЗОВАТЬ «Тот же самый кот», но это не сработает, так как после первого падения это уже не тот же кот. (Аналогично, никто не может дважды войти в одну и ту же реку)
Или вы можете собрать данные о состоянии здоровья кошки, взяв пробы через очень короткие промежутки времени и найти высоты, для которых кошка «в основном жива» (в отличие от «в основном мертвых» из «Невесты принцессы»). Кошки выживут в среднем (до последнего интервала).
Я думаю, что отклонился от первоначального намерения, но если вы идете эмпирическим путем, я голосую за то, чтобы начать как можно выше и продолжать сбрасывать кошек по мере уменьшения высоты, пока они статистически не выживут. А потом еще раз проверить выживших кошек, чтобы быть уверенным.
источник
Я выбрал немного другой метод, чтобы найти решение.
Я начал с определения максимального пола, который можно было бы покрыть, используя х кошек и у догадок , используя следующий метод.
Начните с 1 этажа и продолжайте увеличивать количество догадок, сохраняя при этом проверку этажей, которые предполагают, что они проверены, и сколько кошек осталось на каждом этаже.
Повторите это до у раз.
Это очень неэффективный код для вычисления данного ответа, но тем не менее полезный для небольшого количества кошек / этажей.
Код Python:
Для 2 кошек максимальные этажи, которые можно определить в x догадках:
1, 3, 6, 10, 15, 21, 28 ...
Для 3 кошек:
1, 3, 7, 14, 25, 41, 63 ...
Для 4 кошек:
1, 3, 7, 15, 30, 56, 98 ...
После обширных исследований (в основном связанных с набором последовательностей чисел в OEIS ), я заметил, что максимальные этажи для x соответствуют кусочно- комбинационной комбинации .
Для 2 кошек:
n <2: 2 ^ n - 1
n> = 2: C (n, 1) + C (n, 2)
Для 3 кошек:
n <3: 2 ^ n - 1
n> = 3: C (n, 1) + C (n, 2) + C (n, 3)
Для 4 кошек:
n <4: 2 ^ n - 1
n> = 4: C (n, 1) + C (n, 2) + C (n, 3) + C (n, 4)
Отсюда я взял простой подход простого увеличения n, пока не пройду необходимое количество этажей.
Код Python:
Это дает правильное решение для (100, 2) = 14.
Для любого, кто хочет проверить что-то менее тривиальное, оно дает (1 000 000, 5) = 43.
Это работает в O (n), где n является ответом на проблему (чем больше кошек, тем лучше).
Однако я уверен, что кто-то с более высоким уровнем математики мог бы упростить кусочные формулы для вычисления в O (1).
источник
источник
Я не могу прочитать об этом блог блогов Google (благодаря работам blogwall), но я не думаю, что прямой поиск в двоичном стиле будет лучше. Причина в том, что бинарный поиск основан на представлении о том, что искомый ответ имеет равные шансы оказаться при любом индексе индекса в списке. Однако в этом случае это не так. В этом случае ответ будет иметь более высокую вероятность быть ближе к одному концу диапазона, чем к другому. Я понятия не имею, как учесть это в поиске, но это интересная мысль.
источник
все эти сумасшедшие разговоры о кошках .. и это всего лишь угадать проблему числа с минимальными догадками (количество кошек). не должно быть необходимости искусственно (и неправильно) определять бесконечность как часть решения. переменная должна была иметь название upper-bound или max-try или что-то подобное. определение проблемы (вещь кошки) имеет некоторые серьезные проблемы, хотя люди реагируют на потенциал жестокого обращения с животными, а также на многие аспекты такой проблемы, возникающей в реальной жизни, например, аэродинамическое сопротивление, гравитация - ускорение и другие подобные параметры реальной жизни. проблемы. так что, возможно, это должно было быть задано совершенно по-другому.
источник