MAXimal | |
добавлено: 11 Jun 2008 11:25 Содержание [скрыть] Задача ИосифаУсловие задачи. Даны натуральные Задача была поставлена Иосифом Флавием (Flavius Josephus) ещё в 1 веке (правда, в несколько более узкой формулировке: при Решать эту задачу можно моделированием. Простейшее моделирование будет работать Решение за Попытаемся найти закономерность, выражающую ответ для задачи С помощью моделирования построим таблицу значений, например, такую: И здесь достаточно отчётливо видна следующая закономерность: Здесь 1-индексация несколько портит элегантность формулы, если нумеровать позиции с нуля, то получится очень наглядная формула: Итак, мы нашли решение задачи Иосифа, работающее за Простая рекурсивная реализация (в 1-индексации): int joseph (int n, int k) { return n>1 ? (joseph (n-1, k) + k - 1) % n + 1 : 1; } Нерекурсивная форма: int joseph (int n, int k) { int res = 0; for (int i=1; i<=n; ++i) res = (res + k) % i; return res + 1; } Решение за Для сравнительно небольших Небольшая возникающая при этом сложность заключается в том, что после удаления этих чисел у нас получится задача с меньшим Также отдельно надо разбирать случай, когда Реализация (для удобства в 0-индексации): int joseph (int n, int k) { if (n == 1) return 0; if (k == 1) return n-1; if (k > n) return (joseph (n-1, k) + k) % n; int cnt = n / k; int res = joseph (n - cnt, k); res -= n % k; if (res < 0) res += n; else res += res / (k - 1); return res; } Оценим асимптотику этого алгоритма. Сразу заметим, что случай Таким образом, асимптотика алгоритма действительно Аналитическое решение для В этом частном случае (в котором и была поставлена эта задача Иосифом Флавием) задача решается значительно проще. В случае чётного Аналогично, в случае нечётного При реализации можно непосредственно использовать эту рекуррентную зависимость. Можно эту закономерность перевести в другую форму: Аналитическое решение для Несмотря на простой вид задачи и большое количество статей по этой и смежным задачам, простого аналитического представления решения задачи Иосифа до сих пор не найдено. Для небольших
|