Сложность применения перестановки на месте

27

К моему удивлению, я не смог найти статьи об этом - вероятно, искал не те ключевые слова.

Итак, у нас есть массив чего угодно и функция по его индексам; - перестановка.фее

Как переупорядочить массив в соответствии с с памятью и временем выполнения, максимально приближенными к и ?O ( 1 ) O ( n )еО(1)O(n)

Существуют ли дополнительные условия, когда эта задача становится легче? Например, когда мы явно знаем, что функция является обратной к ?фgf

Я знаю алгоритм, который следует за циклами и проходит цикл для каждого индекса, чтобы проверить, является ли он наименьшим в своем цикле, но опять же, он имеет время выполнения худшем случае , хотя в среднем он, кажется, ведет себя лучше ...O(n2)

jkff
источник
Простое наблюдение: если не только массив элементов, но и массив, содержащий функцию f, доступен для записи, то задачу легко выполнить за O (n) время, используя O (1) целочисленных регистров (каждый из которых длиной O ( log n) биты) и дополнительное место для одного элемента, просто следуя каждому циклу. Но это не работает, если функция f дана в хранилище только для чтения (или f дана только как оракул), что я считаю предположением в этом вопросе.
Цуёси Ито
23
Fich et al. 1995 : время, O ( log n ) пространство. Также обсуждаются некоторые особые случаи. O(nlogn)O(logn)
Юкка Суомела
Да, я предполагаю, что у нас есть оракул.
JKFF
3
@JukkaSuomela, вы должны превратить это в ответ. Кроме того, учитывая, что - произвольная перестановка, простой аргумент энтропии дает O ( n log n ) пространства и / или времени, поэтому я был бы удивлен, если бы вы могли сделать лучше, чем O ( n log n ) во времени и пространстве. fO(nlogn)O(nlogn)
user834

Ответы:

4

Вариант 0: Перестановка на месте (1995) Фейт Э. Фич, Дж. Ян Мунро, Патрисио В. Поблете время O ( log 2 n ) пространство.О(NжурналN)О(журнал2N)

Вариант 1. Обман, сжимая вашу перестановку в краткую структуру данных, см. Munro http://www.itu.dk/people/ssrao/icalp03-a.pdf .

Вариант 2. Используйте разложение по простому циклу для краткого хранения перми и используйте это дополнительное место для обмана http://oeis.org/A186202

Вариант 3: отслеживание наибольшего индекса каждого цикла манипулирования. Для каждой итерации используйте самый большой невидимый индекс, чтобы переместить все в своем цикле на единицу. Если он попадает в видимый индекс, отмените всю эту работу, потому что цикл уже был изменен. время, O ( # циклов * log n ) пространство.О(N2)О(#циклы*журналN)

Вариант 4. Отслеживайте наибольший индекс каждого манипулируемого цикла, но делайте это только партиями с различной длиной цикла. Для каждой итерации используйте самый большой невидимый индекс, чтобы переместить все в цикле на единицу. Если он попадает в видимый индекс, отмените всю эту работу, потому что цикл уже был изменен. времени, O ( ( # циклов _ с _ одинаковым _ размером ) log n ) пробел.О(N2*отчетливый_цикл_длины)О((#циклы_с_одно и тоже_размер)*журналN)

Вариант 5: из той же бумаги Munro, что и вариант 0, для поверните цикл p ( i ), если i - самый большой индекс в этом цикле. O ( n 2 ) время и O ( log n ) пространство.язнак равно1,,Nп(я)яО(N2)О(журналN)

Чад Brewbaker
источник
методы сжатия могут вообще не экономить пространство: в худшем случае пространство для хранения перестановки равно . 3, 4 и 5 кажутся в целом такими же плохими, как либо уже известное решение OP, либо решение Fich, Munro и Poblete. И на это решение уже указал @JukkaNжурналN
Сашо Николов
# 5 использует меньше места, чем # 0, по коэффициенту log (n).
Чад Brewbaker
1

Если вы используете представление циклов перестановки, вам потребуется 1 дополнительный элемент массива для хранения переставляемого элемента, и вы можете выполнять циклы в худших операциях O (N).

Фил
источник
2
jkff уже сказал, что знает алгоритм следования за циклом, поэтому он явно хочет, чтобы сама перестановка рассматривалась как (близко) к черному ящику. Как он указывает в вопросе, преобразование из (почти) черного ящика в представление цикла может занять O (n ^ 2) времени.
Джошуа Грохов
Черный ящик p (i) в порядке. Вы просто идете по циклу, пока не вернетесь к мне. Проблема заключается в том, что Коломогорову сложно сохранять список элементов, которые были обновлены, чтобы вы не циклически повторяли их несколько раз. Мунро имеет границы в этом. itu.dk/people/ssrao/icalp03-a.pdf
Чад Брюбейкер
-2

Любая перестановка из N элементов может быть преобразована в любую другую перестановку с использованием N-1 или менее обменов. В худшем случае для этого метода может потребоваться O (n ^ 2) вызовов вашего оракула, F (). Начните с наименьшей позиции. Позвольте x быть позицией, которую мы в настоящее время меняем.

Если F (x)> = x, то поменяйте местами позиции x и F (x). Иначе, мы должны найти, где элемент, который находился в позиции F (x), в настоящее время находится в списке. Мы можем сделать это с помощью следующей итерации. Пусть у = F (х). Do до y> = x: y = F (y): Конец Do. Теперь поменяйте позиции x и y.

Рассел Истерли
источник
3
ОП уже сказал, что знает, как это сделать за раз. О(N2)
Юкка Суомела
Сожалею. Я новичок в этой группе. Мне нравится этот метод из-за его простоты. Иногда я нахожу простоту быстрее, чем эффективность. Я знаю другой метод, который требует O (n) шагов, но O (nlogn) место.
Рассел Истерли
1
Рассел, даже выделение и обнуление пространства O (n log n) - это уже O (n log n), вы имели в виду в другом направлении?
JKFF
Вы действительно не имеете выделить и ноль места. Основная идея заключается в том, что, когда F (x)> x, мы должны помнить, куда мы помещаем элемент в положение x. Для действительно больших n я бы использовал базу данных и просто вел бы запись, куда перемещается элемент x. Запись может быть удалена, когда x достигнет своего окончательного местоположения.
Рассел Истерли
1
Но почему вы тогда говорите, что это требует O (n log n) пространства?
JKFF
-2

Этот метод использует инверсию F и требует n бит памяти. Если x - это позиция элемента в исходном массиве, пусть G (x) - это позиция элемента в отсортированном массиве. Пусть B будет n-битным массивом. Установите все n битов B в 0.

FOR x = 1 до n-1: ЕСЛИ B (x) == 0 ТО: y = G (x): DO ДО x == y: поменять местами позиции x и y: B (y) = 1: y = G ( y): ЦИКЛ: ENDIF: ДАЛЕЕ X

Этот метод позволяет поменять элемент, находящийся в данный момент в позиции x, на конечную позицию элемента. Внутренний цикл заканчивается, когда правильный элемент переводится в положение x. Поскольку каждый своп перемещает по крайней мере один элемент в конечную позицию элемента, внутренний цикл Do не может выполнить более n-1 раз за цикл. Я думаю, что этот метод O (N) время и пространство.

Рассел Истерли
источник
2
Вы смотрели на бумагу? Два алгоритма, которые вы перечислите здесь, являются двумя «очевидными». В статье есть менее очевидные из них с различными компромиссами во времени и пространстве, в частности, гораздо меньше места.
Юваль Фильмус