Вот ответ, который детализирует алгоритм из статьи, на которую ссылается Джо: http://arxiv.org/abs/0805.1598
Сначала рассмотрим Θ ( п журналн ) алгоритм , который использует разделяй и властвуй.
1) Разделяй и властвуй
Нам дают
a1,2, … , Б1, б2, … БN
Теперь, чтобы использовать разделяй и властвуй, для некоторого m = Θ ( n ) мы пытаемся получить массив
[ а1,2,…,am,b1,b2,…,bm],[am+1,…,aN, бм + 1, … БN]
и рекурсировать.
Обратите внимание, что часть б1, б2, … Бм,м + 1, ...N
является циклическим сдвигом
aм + 1, ...N, б1, … Бм
по м местам.
Это классика, и ее можно сделать на месте тремя разворотами и за O (n) раз.
Таким образом, «разделяй и властвуй» дает вам алгоритм Θ ( п журналн ) с рекурсией, аналогичной T( n ) = 2 Тл( n / 2 ) + Θ ( n ) .
2) Перестановочные циклы
Теперь другим подходом к проблеме является рассмотрение перестановки как множества непересекающихся циклов.
Перестановка дается (при условии, начиная с 1 )
j ↦ 2 jмодификация2 н + 1
Если бы мы каким-то образом точно знали, что это за циклы, используя постоянное дополнительное пространство, мы могли бы реализовать перестановку, выбрав элемент , определить, куда идет этот элемент (используя приведенную выше формулу), поместить элемент в целевое местоположение во временное пространство, поместить элемент в это целевое местоположение и продолжить вдоль цикла. Как только мы закончим с одним циклом, мы переходим к элементу следующего цикла и следуем этому циклу и так далее.AA
Это дало бы нам алгоритм времени , но предполагает, что мы «каким-то образом знали, какими были точные циклы», и пытались вести этот бухгалтерский учет в пределах ограничения пространства это то, что делает эту проблему сложной.O (n)O (1)
Здесь статья использует теорию чисел.
Можно показать, что в случае, когда , элементы в позициях , находятся в разных циклах, и каждый цикл содержит элемент в позиции .2 n + 1 = 3К13 , 32, … , 3к - 13м, м ≥ 0
При этом используется тот факт, что является генератором .2( Z / 3К)*
Таким образом, когда , подход, основанный на цикле, дает нам алгоритм времени, поскольку для каждого цикла мы точно знаем, с чего начать: степени (включая ) (те, может быть вычислено в пространстве ).2 n + 1 = 3kO (n)31O (1)
3) Конечный алгоритм
Теперь мы объединяем два вышеупомянутых: делить и завоевывать + циклы перестановок.
Делаем и разделяем, но выбираем так, чтобы была степенью и .м2 м + 13m = Θ ( n )
Таким образом, вместо рекурсии на обеих «половинках» мы рекурсируем только на одной и делаем дополнительную работу.Θ ( н )
Это дает нам рекуррентность (для некоторого ) и, таким образом, дает нам время, космический алгоритм!T( n ) = T( c n ) + Θ ( n )0 < с < 1O (n)O (1)