Zählen von Permutationen, deren Elemente nicht genau ihrem Index ± M entsprechen


13

Ich wurde kürzlich in einem algorithmischen Interview nach diesem Problem gefragt und konnte es nicht lösen.

Bei zwei gegebenen Werten N und M müssen Sie die Anzahl der Permutationen der Länge N (unter Verwendung von Zahlen von 1 bis N) so zählen, dass die absolute Differenz zwischen einer beliebigen Zahl in der Permutation und ihrer Position in der Permutation ungleich M ist.

Beispiel - Wenn N = 3 und M = 1, dann sind 1 2 3 und 3 2 1 gültige Permutationen, aber 1 3 2 ist ungültig, da sich die Zahl 3 auf Position 2 befindet und ihre Differenz = M ist.

Ich habe versucht, NxM Dynamic zu programmieren, aber es ist mir nicht gelungen, eine Wiederholung zu bilden, bei der Wiederholungen nicht berücksichtigt werden.


Sie können eine Formel möglicherweise erhalten, indem Sie Einschluss-Ausschluss verwenden. Der Fall ist klassisch als Störungen bekannt . M=0
Yuval Filmus

1
Dies ist ein besonderer Fall, in dem perfekte Übereinstimmungen in zweigeteilten Diagrammen gezählt werden. Dieses Problem ist -vollständig. Natürlich könnte dieser spezielle Fall einfacher sein. #P
Yuval Filmus

Ich habe bereits Einschluss-Ausschluss versucht, aber keine Fortschritte erzielt.
Gena

Sie können versuchen, die Methoden zum Zählen von Störungen anzupassen . Ich weiß nicht, ob dich das irgendwohin bringt. Sie können auch versuchen, M = 1 (sagen wir) zu korrigieren, die Zahl für kleine Werte von N (N = 1,2,3,4,5,6,7,8) durch rohe Gewalt zu berechnen und dann die entsprechende Sequenz nachzuschlagen in OEIS in der Hoffnung, dass Sie etwas Nützliches finden.
DW

Was ist die Rekursion, die Sie eingerichtet haben? Was meinst du mit "Wiederholungen zählen"?
Raphael

Antworten:


2

Das erste, was ich fragen würde, wenn mir diese Frage gestellt würde, wäre

Möchten Sie einen polynomialen Zeitalgorithmus?

und dann würde ich hoffen, dass die Antwort "nein" ist. Ich vermute, dass dieses Problem NP-schwer ist, aus folgendem Grund:

Die natürliche Herangehensweise an dieses Problem besteht darin, die Platzierung der ersten Zahl zu berücksichtigen und eine rekursive Formel abzuleiten, um die anderen zu platzieren. Dies funktioniert gut für den Fall (dh das Zählen der Anzahl der Störungen), da es keine Rolle spielt, an welcher Position Sie die erste Zahl platziert haben, da es nur eine "unzulässige" Position von jeder Zahl gibt. Mit anderen Worten führt dieser Ansatz zu eigenständigen Teilproblemen.M=0

Für ist dies nicht so einfach, da wir jetzt für einige Zahlen 2 unzulässige Positionen haben können. Welche dieser Positionen im Teilproblem verbleiben, ist nun für die Lösung des Teilproblems relevant. Es reicht nicht aus, nur die Anzahl der "illegalen" Positionen zu berücksichtigen, da die "Ketten" von Nummern, die eine illegale Position teilen, erforderlich sind, um die Struktur der Teilprobleme dieses Teilproblems zu bestimmen. Dieser Ansatz führt also im Wesentlichen zu dem folgenden Unterproblem:M>02

Bei einer Menge , einer Menge B N mit einer Größe von höchstens N und einer natürlichen Zahl M wird die Anzahl der perfekten Übereinstimmungen auf dem zweigliedrigen Graphen ( A , B , E ) gezählt , wobei ( a , b ) E ist wenn und nur wenn | a - b | M .ANBNNM(A,B,E)(a,b)E|ab|M

Dieses Problem sieht schwer aus. Der einzige Ansatz für dieses Problem, den ich sehe, ist das Einschließen / Ausschließen, was nicht zu einem polynomiellen Zeitalgorithmus führt.

Wir können Ansätze in Betracht ziehen, die sich nicht auf die iterative Platzierung der Zahlen stützen, aber ich habe keine Ahnung, wie Sie dies tun würden. (vor allem während eines Interviews!)

Natürlich ist das alles nur Spekulation und es ist immer noch möglich, dass ein cleverer Trick eine polynomielle Zeitlösung liefert, aber ich hoffe, ich habe überzeugend argumentiert, dass dieser Trick in der Tat sehr clever sein muss.

Vielleicht ist es möglich, NP-Härte zu zeigen, indem dieses Problem auf # 2-SAT reduziert wird (die 'Ketten' von Zahlen, die illegale Positionen teilen, scheinen eine nicht triviale Wahl zu sein, die mit der Auswahl eines Wahrheitswertes verglichen werden könnte), aber Ich habe bis jetzt noch keinen offensichtlichen Weg gesehen, dies zu tun.


Für den Fall, dass der Interviewer tatsächlich mit einem exponentiellen Zeitalgorithmus zufrieden wäre, würde ich einfach alle möglichen Lösungen generieren, indem ich einen rekursiven Rückverfolgungsalgorithmus anpasse, um eine Permutation zu generieren, um diesen speziellen Fall auszuschließen.


Ich habe gesagt, dass ich einen Exponential-Zeit-Algorithmus angeben kann, wurde aber nach einer Polynom-Zeit-Lösung gefragt, die funktioniert, wenn N <= 1000 ist.
Gena

1
Nun, es sei denn, Sie haben die Frage falsch verstanden / falsch interpretiert, wie die Antwort von PPenguin nahe legt. Ich denke, dass diese Frage entweder von sehr anspruchsvollen Interviewern gestellt wird, von Interviewern, die die Frage selbst falsch verstanden haben, oder vielleicht sogar als eine Frage, die sie von niemandem erwarten, dass sie gelöst wird . Auch wenn sich diese Frage nicht als rechenintensiv herausstellen würde, ist sie höchstwahrscheinlich interviewintensiv.
Diskrete Eidechse

Es scheint, dass M = 1 wahrscheinlich machbar ist (und daher möglicherweise auch die anderen), also haben wir etwas übersehen. Können Sie mir helfen, den Fall M = 1 zu verstehen / zu bewerten? Ich habe eine separate Frage dazu gestellt. Cs.stackexchange.com/questions/74674/…
PPenguin

2

Ist es möglich, dass Sie sich an die genauen Details erinnern oder die Frage falsch interpretiert haben?

In Ihrer Beschreibung ist Element in Position b auf a - b ± M beschränkt . Aber wenn sie nur bedeuteten, dass der Unterschied begrenzt war: a - b M , dann scheint das Problem auffindbar zu sein.abab±M
abM


Ich arbeitete dieses einfachere Problem aus und versuchte es so zu verallgemeinern, dass ich hoffte, etwas Freiheit bei der Lösung des größeren Problems zu haben. Aber das hat für mich nur klargestellt, warum ein rekursiver Ansatz sehr unwahrscheinlich ist, worüber ich am Ende spreche.

Betrachten Sie die Funktion die die Anzahl der Permutationen einer Liste von Elementen mit der Bezeichnung 1 bis N angibt , wobei das Element a in Position b (erste Position ist 1) a - b M erfüllt und b - a P .f(N,M,P)NababMbaP

Um dies zu veranschaulichen, können und P diese Einschränkungen separat verschieben , indem sie sie in zwei Abhängigkeiten unterteilen .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

Wenn der Einfachheit halber damit die Permutationen nicht eingeschränkt werden, definieren Sie g ( N , M ) = f ( N , M , P ) . In ähnlicher Weise ist g ( N , P ) = f ( N , M , P ), wenn M N ist, so dass die Permutationen nicht eingeschränkt werden.PNg(N,M)=f(N,M,P)g(N,P)=f(N,M,P)MN

In dem speziellen Fall die Bedingungen von M und P äquivalent, so dass man sie ignorieren kann, so dass wir f in Form von g schreiben können : f ( N , 0 , 0 ) = g ( N , 0 ) .M=P=0MPfg

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

Aus der Symmetrie des Problems:

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

Lösen wir zuerst nach und packen dann das allgemeinere f ( N , M , P ) an .g(N,M)f(N,M,P)

Für hat jedes Element eine Platzierungsbeschränkung (und die Einschränkungen sind unterschiedlich). Wenn Sie also ein Element i auswählen , platzieren Sie es an einer Position j . Es gibt N - 1 verschiedene Möglichkeiten für die Wahl von j .M=0ijN1j

Diese Auswahl hob die eingeschränkte Position für Element , während die anderen ( N - 2 ) Elemente immer noch eine Einschränkung aufweisen. Wir können die Platzierung von j in zwei Optionen aufteilen:j(N2)j

  1. Platziere in . Dies lässt alle anderen Elemente mit einer Einschränkung, so dass das verbleibende Platzierungsproblem jetzt auf g ( N - 2 , 0 ) reduziert wird .ig(N2,0)

  2. Platzieren Sie in einer Position . Dies ergibt nun eine Platzierungsbeschränkung für j , und so hat jedes Element eine Einschränkung, und das verbleibende Platzierungsproblem wird auf g ( N - 1 , 0 ) reduziert.ijg(N1,0)

Das ergibt also die rekursive Formel:

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

Und durch Betrachten der einfachen Situationen von Hand, können die Basisfälle erhalten.

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

Dies ist die übliche derangement-rekursive Formel.

Ich kann mir zwar nicht vorstellen, dass jemand vor Ort darauf kommt, aber es stellt sich heraus, dass es dafür eine geschlossene Lösung gibt (siehe den Wiki-Artikel zur Störung für Details).

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

Für gibt es keine Beschränkung für eine der Platzierungen:MN

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

Mit haben die ersten M Elemente keine Einschränkungen und die verbleibenden Elemente haben eine Platzierungsbeschränkung. In Bezug auf die Positionen lassen die letzten M Positionen alle Zahlen zu.0<M<NMM

Wählen Sie für die letzte Position ein Element . Es gibt zwei Möglichkeiten, wie die verbleibende Platzierung aussieht:i

  1. Wenn , dann hatte ich keine Platzierungsbeschränkungen. Wenn ich also i benutze , werden die Beschränkungen für keine Position geändert. Wir haben auch eine Position ohne Einschränkung entfernt, sodass die verbleibende Platzierung wie folgt aussieht: g ( N - 1 , M - 1 ) .i<Miig(N1,M1)

  2. Wenn , dann hatte ich eine Platzierungsbeschränkung und wir haben eine Position ohne Einschränkung entfernt. Da ich platziert wurde, kann die Position, auf die sie von jetzt an beschränkt war, jede der verbleibenden Zahlen akzeptieren. Die verbleibende Position sieht also wie folgt aus: g ( N - 1 , M ) .i>=Miig(N1,M)

Das ergibt also die rekursive Formel:

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

Damit ist die rekursive Lösung für .g

Wenn , unterliegen die ersten N - M Positionen einer Beschränkung für eine einzelne Zahl, die letzten N - P Positionen einer Beschränkung für eine einzelne Zahl und die mittleren M + P - N Positionen keiner Beschränkung. Dies ist genau wie der Fall g ( N , M + P - N ) .M+PNNMNPM+PNg(N,M+PN)

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

Wir haben derzeit alle Fälle mit Ausnahme von und 0 < P < N so behandelt, dass M + P < N . Hier gelten für einige Elemente mehrere Einschränkungen. Aufgrund der Symmetrie in f können wir 0 < M P < N ohne Verlust der Allgemeinheit betrachten.0<M<N0<P<NM+P<Nf0<MP<N

Die ersten Positionen haben eine einzige Einschränkung, dann N - M - P- Positionen mit zwei Einschränkungen, dann haben die letzten M- Positionen eine einzige Einschränkung.PNMPM

Betrachtet man die Elemente, haben die ersten Elemente eine einzige Einschränkung, dann haben die N - M - P Elemente zwei Einschränkungen, dann haben die letzten P Elemente eine einzige Einschränkung.MNMPP

Hier müssen wir jedoch aufhören. Da gibt es mit dieser Methode keinen Ausweg.


Ich habe die beiden Bedingungen getrennt, weil ich sah, dass das Platzieren einer Zahl an einer ausgewählten Position die Anzahl der einzelnen Bedingungen für die Bedingung "+" und die Bedingung "-" von Gleichgewicht bringen kann .ab±M

Bei dem allgemeineren Problem führt das Entfernen einer Position durch Einfügen einer Zahl jedoch nicht immer zu einem Unterproblem, das mit .f(N,M,P)

Um diese Einschränkungen für die Permutation zu visualisieren, betrachtet einen gerichteten Graphen mit Knoten, eine Gruppe von N markierten { A 1 , A 2 , . . . , A N } und ein anderer markierter { B 1 , B 2 , . . . , B N } . Eine gerichtete Kante ( A i , B j ) existiert, wenn i - j = M ist2NN{EIN1,EIN2,...,EINN}{B1,B2,...,BN}(EINich,Bj)ich-j=Mund eine gerichtete Kante existiert, wenn j - i = M und M 0 ist .(Bj,EINich)j-ich=MM0

Die Menge der Knoten kann als die Nummern angesehen werden, die wir in einer Liste permutieren, und die der B- Knoten als ihre möglichen Positionen. Dieses Diagramm zeigt die Einschränkungen. In der Grafik werden keine Zyklen angezeigt. Es werden immer ein oder mehrere nicht zusammenhängende Knoten oder Ketten der Länge sein.EINB

Wir wollen also eine Funktion, die diesen Beschränkungsgraphen als Eingabe verwendet und die Anzahl der Permutationen ausgibt, die die Beschränkungen erfüllen.

M+PN

0<MP<NNN!

Da es so viele mögliche Untergraphen gibt, wenn Ketten erlaubt sind, sehe ich wirklich nicht, wie dies mit den üblichen rekursiven Methoden gelöst werden kann, es sei denn, es gibt eine kluge Beziehung, die besagt, wie nicht-isomorphe Beschränkungsgraphen für die Anzahl der Permutationen irgendwie äquivalent sind.

Ich denke höchstwahrscheinlich wurde die Frage falsch interpretiert. Möglicherweise sogar vom Interviewer (der die Antwortdetails selbst vergessen hat).


Warum ist Ihr Abhängigkeitsgraph ausgerichtet? Was bedeuten die Anweisungen?
Diskrete Eidechse

@Discretelizard Die beiden Richtungen (a-> b vs b-> a) unterscheiden, woher die Einschränkung stammt (die '+' oder die '-' Version der Einschränkung). Es wird nicht wirklich benötigt, da es nicht auf den Ursprung der Einschränkung ankommt. Es hat mir nur die Visualisierung der Vorgänge erleichtert.
PPenguin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.