в ряду из n элементов арифметической прогрессии меняется [n/2] элементов. Найдите разницу в начальной арифметической прогрессии

У меня есть список размера n, который содержит n последовательных элементов арифметической прогрессии, которые расположены не по порядку. Я изменил менее половины элементов в этом списке на какое-то случайное целое число. Как из этого нового списка найти разность начальной арифметической прогрессии?

Я много думал об этом, но кроме грубой силы ничего другого придумать не смог :(

Спасибо, что подумали об этом :)


person Ranger    schedule 27.01.2011    source источник


Ответы (2)


Невозможно решить это вообще и быть на 100% уверенным в правильности своего ответа. Допустим, исходный список представляет собой следующую арифметическую прогрессию (не по порядку):

1 3 2 4

Измените менее половины элементов случайным образом... скажем, например, что мы изменили 2 на 5:

1 3 5 4

Если мы сможем сначала выяснить, какие числа нам нужно изменить, чтобы получить правильную перетасованную арифметическую последовательность, то мы сможем легко решить проблему, указанную в вопросе. Однако мы видим, что существует несколько возможных ответов в зависимости от того, какой номер мы решим изменить:

  • 6, 3, 5, 4 (разница 1)
  • 1, 3, 2, 4 (разница 1)
  • 1, 3, 5, 7 (разница 2)

Невозможно узнать, какая из этих возможных последовательностей является исходной последовательностью, поэтому вы не можете быть уверены, в чем заключалась исходная разница.

person Mark Byers    schedule 27.01.2011
comment
@Mark Byers. В этой настройке вы изменили половину целых чисел, но в ОП упоминается, что вам нужно изменить меньше, чем половину. Сохраняется ли это, если было изменено менее половины значений? - person templatetypedef; 28.01.2011
comment
@Марк Байерс - моя ошибка; Я неправильно прочитал ваш пост. Извини за это! +1. :-) - person templatetypedef; 28.01.2011
comment
@templatetypedef: я думаю, что вы один из самых умных пользователей здесь, поэтому, если вы неправильно поняли это, вероятно, большинство других людей тоже - это проблема с моим ответом, а не с вами. Я немного переписал свой ответ - надеюсь, теперь он немного понятнее. Спасибо за комментарий. :) - person Mark Byers; 28.01.2011
comment
Почему 1 3 5 7 неверно? Вы не знаете, какой была исходная последовательность (нет доступа к 1 3 2 4), поэтому, насколько вам известно, она может быть правильной. Кроме того, почему нужно смотреть только на первые три элемента? Если вы посмотрите на все из них, нет никаких причин, по которым вы не можете придумать и 1 2 3 4. Я бы сказал, что есть несколько возможных ответов, а не то, что это невозможно. - person IVlad; 28.01.2011
comment
@IVlad: Вашу интерпретацию вопроса можно было бы написать намного проще: Дав список из n произвольных целых чисел, найдите все способы, которыми вы можете изменить менее половины из них, а затем переупорядочите их, чтобы сформировать арифметический ряд. > Но он не об этом спрашивает, ИМХО. - person Mark Byers; 28.01.2011
comment
Я думаю, что его интересует только один возможный ответ, поэтому он упомянул, что не хочет решения грубой силы. Возможно, нужны уточнения. - person IVlad; 28.01.2011

Поскольку детерминированного решения проблемы не существует (как заявил @Mark Byers), вы можете попробовать вероятностный подход.

Трудно получить исходную прогрессию, но ее скорость можно легко получить, сравнив различия между элементами. Отличие от исходных будет кратно скорости.

Предположим, вы берете 2 элемента из списка (вероятность того, что они оба принадлежат исходной последовательности, равна 1/4) и вычисляете разницу. Эта разница с вероятностью 1/4 будет кратна курсу. Разложите его на простые множители и посчитайте их (например, 12 = 2^^2 * 3 добавит 2 к счетчику 2 и увеличит счетчик 3).

После многих таких итераций (выглядит как хорошая задача для вероятностных методов, таких как Монте-Карло), вы может анализировать счетчики.

Если простой множитель принадлежит ставке, его счетчик будет не менее num_iteartions/4 (или num_iterations/2, если он встречается дважды).

Основная проблема заключается в том, что небольшие факторы будут иметь большую вероятность при случайном вводе (например, разница между двумя случайными числами будет с вероятностью 50% делиться на 2). Таким образом, вам придется это компенсировать: поскольку 3/4 ваших различий были случайными, вам придется учитывать, что (3/8)*num_iterations счетчика 2 следует игнорировать. Поскольку это также относится ко всем степеням двойки, самый простой способ - предварительно сгенерировать «маску белого шума», взяв различия только между случайными числами.

РЕДАКТИРОВАТЬ: давайте продолжим этот подход. Учтите, что вы создаете эту «маску белого шума» (назовем ее спектр) для случайных чисел и считаете, что это спектр по основанию 1, поскольку их наименьший «наибольший общий множитель» равен 1. Вычислив его для разностей арифметической последовательности вы получите спектр с основанием R, где R — скорость, и он будет эквивалентен смещенной версии спектра с основанием 1. Итак, вам нужно найти такое значение R, что

your_spectrum ~= spectrum(1)*3/4 + spectrum(R)*1/4

Вы также можете проверить наибольшее число R, чтобы по крайней мере половина элементов была равна по модулю R.

person ruslik    schedule 27.01.2011