Головоломка

Apr 14, 2010 10:37

На той неделе сушил мозги над очень простой (с виду) задачей: одномерный массив размерностью N сдвинуть циклически право на i элементов.

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

Если вы никогда раньше не сталкивались с этой задачей -- очень советую, прямо сейчас взять листик бумаги, ручку и попытаться ее решить. А потом продолжить чтение дальше...


В общем, хоть какое-то решение я смог получить только через несколько дней.
Проблема в том, что интуитивно я понимал, что должно быть решение со сложностью, близкой к O(N), бился над ним и мозг даже не пытался пойти по самому очевидному пути: выполнить i раз сдвиг на один элемент вправо.

После получения такого вот ужасно не оптимального способа, я естественным образом пришел к выводу, что если дать дополнительный буфер на i элементов, я смогу выполнить задачу довольно оптимальным способом.

Ничего лучше я так и не придумал -- полез в интернет и изучил материалы по теме.

В сторону т.н последовательного способа я двигался, однако путь показался мне слишком сложным и я не смог докрутить его до конца.

Перестановка блоков -- тоже довольно не тривиальная вещь.

Ну и решение на основе переворотов -- фантастически красивое, но встает вопрос: а может ли простой смертный "вдруг" открыть такое вот решение?

В общем, мой тотальный fail хорошо уложился в рамки моей же теории, что такие вот еб@нные шарады есть чистая математика, к программированию имеющая весьма и весьма опосредованное отношение. И очень вряд ли я стал бы давать подобную штуку на собеседовании. Ну разве что для того, чтобы помучать человека.

Решение -- http://codelab.ru/task/cycle_shift/

programming

Previous post Next post
Up