Подсчет перестановок, элементы которых не являются точно их индексом ± M


13

Недавно мне задали эту проблему в алгоритмическом интервью, и я не смог ее решить.

Учитывая два значения N и M, вы должны посчитать количество перестановок длины N (используя числа от 1 до N) так, что абсолютная разница между любым числом в перестановке и его положением в перестановке не равна М.

Пример. Если N = 3 и M = 1, то 1 2 3 и 3 2 1 являются действительными перестановками, но 1 3 2 недопустим, поскольку число 3 находится в положении 2, а их разность = M.

Я попробовал динамическое программирование NxM, но не смог сформировать повторение, которое не учитывает повторения.


Возможно, вы можете получить формулу, используя включение-исключение. Случай M=0 классически известен как расстройства .
Юваль

1
Это частный случай подсчета идеальных совпадений в двудольных графах, проблема с -завершением. Конечно, этот конкретный случай может быть проще. #P
Юваль

Я уже пробовал включение-исключение, но безуспешно.
Гена

Вы можете попробовать адаптировать методы подсчета неисправностей . Я не знаю, приведет ли это вас куда-нибудь. Вы также можете попробовать исправить M = 1 (скажем), вычислить число для небольших значений N (N = 1,2,3,4,5,6,7,8) методом грубой силы, а затем найти соответствующую последовательность в OEIS в надежде, что вы найдете что-то полезное.
DW

Какую рекурсию вы настроили? Что вы подразумеваете под «подсчет повторений»?
Рафаэль

Ответы:


2

Первое, что я хотел бы спросить, когда задали этот вопрос будет

Вы хотите алгоритм полиномиального времени?

и тогда я надеюсь, что ответ «нет». Я подозреваю, что эта проблема является NP-трудной, по следующей причине:

Естественный подход к этой проблеме - рассмотреть размещение первого числа и вывести рекурсивную формулу для размещения других. Это хорошо работает для случая (т. Е. Подсчета количества отклонений), так как не имеет значения, на какую позицию вы поместили первое число, поскольку существует только одна «недопустимая» позиция на каждое число. Другими словами, этот подход приводит к независимым подзадачам.Mзнак равно0

Для это не так просто, так как теперь мы можем иметь 2 недопустимых позиции для некоторых чисел. Какая из этих позиций остается в подзадаче, теперь имеет отношение к решению подзадачи. Только рассмотрение количества «незаконных» позиций недостаточно, поскольку «цепочки» чисел, которые разделяют незаконную позицию, необходимы для определения структуры подзадач этой подзадачи. Таким образом, этот подход по существу приводит к следующей подзадаче:M>02

Для заданного множества , множества B N размером не более N и натуральным числом M подсчитайте количество совершенных совпадений на двудольном графе ( A , B , E ) , где ( a , b ) E если и только если | а - б | M .ANBNNM(A,В,Е)(a,b)E|ab|M

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

Мы можем рассмотреть подходы, которые не полагаются на итеративное размещение чисел, но я понятия не имею, как вы это сделаете. (особенно во время интервью!)

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

Возможно, можно показать NP-твердость, сократив эту проблему до # 2-SAT («цепочки» чисел, которые разделяют недопустимые позиции, кажутся нетривиальным выбором, который можно сопоставить с выбором истинностного значения), но Я не видел очевидного способа сделать это на данный момент.


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


Я сказал, что могу дать алгоритм экспоненциального времени, но меня спросили о решении за полиномиальное время, которое работает, когда N <= 1000.
Гена,

1
Ну, если вы неправильно запомнили / неверно истолковали вопрос, как предполагает ответ П.П. Пингуина, я думаю, что этот вопрос задают очень требовательные интервьюеры, интервьюеры, которые сами неправильно поняли вопрос, или, возможно, даже как вопрос, который никто не ожидает решить , Даже если этот вопрос окажется не сложным в вычислительном отношении, он, скорее всего, сложный для интервью.
Дискретная ящерица

Похоже, что M = 1, вероятно, выполнимо (и, следовательно, возможно, другие), поэтому мы кое-что упустили. Можете ли вы помочь мне понять / оценить случай М = 1? Я сделал отдельный вопрос для этого cs.stackexchange.com/questions/74674/…
PPenguin

2

Возможно, вы запомнили конкретные детали неправильно или неверно истолковали вопрос?

В описании, элемент в положении б ограничено в - Ь ± M . Но если они просто имели в виду, что разница была ограничена: a - b M , тогда проблема кажется решаемой.abab±M
abM


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

Рассмотрим функцию которая дает число перестановок списка элементов, помеченных от 1 до N , где элемент a в позиции b (первая позиция равен 1) удовлетворяет a - b M , а b - P .f(N,M,P)NababMbaP

Чтобы визуализировать это, разделение на два ограничения позволяет и P сдвигать эти ограничения по отдельности.MP

1 2 3 4 5  M=0, restricted values for each position
. . . . .  (positions in list)
1 2 3 4 5  P=0, restricted values for each position

3 4 5      M=2, restricted values for each position
. . . . .  (positions in list)
  1 2 3 4  P=1, restricted values for each position

Для удобства, когда чтобы не накладывать ограничений на перестановки, определим g ( N , M ) = f ( N , M , P ) . Аналогично, g ( N , P ) = f ( N , M , P ), когда M N, так что это не накладывает ограничений на перестановки.PNg(N,M)=f(N,M,P)g(N,P)=f(N,M,P)MN

В частном случае ограничения из M и P эквивалентны, поэтому можно игнорировать, что позволяет нам записать f в терминах g : f ( N , 0 , 0 ) = g ( N , 0 ) .M=P=0MPfg

f(N,0,0)=g(N,0).

Из симметрии задачи:

f(N,M,P)=f(N,P,M)

Давайте сначала решим для , а затем займемся более общим f ( N , M , P ) .g(N,M)f(N,M,P)

Для каждый элемент имеет одно ограничение размещения (и ограничения различны). Таким образом, выбрав некоторый элемент i , мы поместим его в какую-то позицию j . Есть N - 1 различных возможностей для выбора j .M=0ijN1j

Этот выбор удалил ограниченную позицию для элемента , в то время как другие ( N - 2 ) элементы все еще имеют одно ограничение. Мы можем разбить размещение j на два варианта:j(N2)j

  1. Место в . Это оставляет все остальные элементы с одним ограничением, поэтому оставшаяся проблема размещения теперь сводится к g ( N - 2 , 0 ) .ig(N2,0)

  2. Поместите в положение . Теперь это дает одно ограничение размещения для j , и поэтому у каждого элемента есть одно ограничение, а оставшаяся проблема размещения уменьшается до g ( N - 1 , 0 )ijg(N1,0)

Таким образом, это дает рекурсивную формулу:

g(N,0)=(N1)[g(N2,0)+g(N1,0)]

И, взглянув на простые ситуации вручную, можно получить базовые случаи.

g(1,0)=0,  g(2,0)=1

Это обычная рекурсивная формула расстройства.

Хотя я не могу себе представить, чтобы кто-то придумал это на месте, оказалось также, что для этого есть решение в закрытой форме (подробности см. В вики-статье о расстройствах ).

g(N,0)=n!e+12

Для нет ограничений на размещение:MN

(MN)g(N,M)=N!

При первые M элементов не будут иметь ограничений, а остальные элементы будут иметь одно ограничение размещения. Это сроки позиций, последние M позиций позволят все номера.0<M<NMM

Для последней позиции выберите элемент . Есть две возможности для того, как выглядит оставшееся место размещения:i

  1. Если , то у меня не было ограничений на размещение, поэтому использование i не меняет ограничений на любую позицию. Мы также удалили одну позицию без ограничений, поэтому оставшаяся позиция выглядит как g ( N - 1 , M - 1 ) .i<Miig(N1,M1)

  2. Если , то у меня было ограничение размещения, и мы удалили одну позицию без ограничений. Поскольку я помещен, позиция, с которой он был ограничен, может принять любое из оставшихся номеров. Таким образом, оставшееся размещение выглядит как g ( N - 1 , M ) .i>=Miig(N1,M)

Таким образом, это дает рекурсивную формулу:

(0<M<N)g(N,M)=(M1)g(N1,M1)+(NM+1)g(N1,M)

Это заканчивает рекурсивное решение для .g

Когда , первые позиции N - M имеют ограничение по одному номеру, последние позиции N - P имеют ограничение по одному номеру, а средние позиции M + P - N не имеют ограничений. Это похоже на случай g ( N , M + P - N ) .M+PNNMNPM+PNg(N,M+PN)

(M+P)Nf(N,M,P)=g(N,M+PN)

В настоящее время мы обработали все случаи, кроме и 0 < P < N, таких что M + P < N . Здесь некоторые элементы имеют несколько ограничений. Из-за симметрии по f мы можем рассмотреть 0 < M P < N без ограничения общности.0<M<N0<P<NM+P<Nf0<MP<N

Первые позиции будут иметь одно ограничение, затем N - M - позиции P с двумя ограничениями, затем последние позиции M имеют одно ограничение.PNMPM

Глядя на элементах, первые элементы будут иметь один ограничение, то Н - М - Р элементы имеет два ограничения, то последние P элементы имеют одну ограничения.MNMPP

Однако на этом мы должны покончить. Как нет пути вперед с этим методом.


Я отделил два ограничения , потому что я мог видеть , что размещение числа в выбранном положении может разбалансировать , сколько одиночные стесненных позиций были для «+» ограничения и «-» скованности .ab±M

Но в более общей проблеме удаление позиции путем помещения в нее числа не всегда приводит к подзадаче, которая описывается с помощью .f(N,M,P)

2NN{A1,A2,...,AN}{B1,B2,...,BN}(Ai,Bj)ij=M(Bj,Ai)ji=MM0

AB

Итак, нам нужна функция, которая принимает в качестве входных данных этот граф ограничений и выводит количество перестановок, которые удовлетворяют ограничениям.

M+PN

0<MP<NNN!

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

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


Почему ваш график ограничений направлен? Что означают направления?
Дискретная ящерица

@Discretelizard Два направления (a-> b против b-> a) различают, откуда появилось ограничение (версия ограничения «+» или «-»). Это на самом деле не нужно, потому что не имеет значения происхождение ограничения, мне просто стало проще визуализировать происходящее.
PPenguin
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.