È possibile che tu abbia ricordato i dettagli specifici in modo errato o abbia frainteso la domanda?
Nella descrizione, elemento in posizione b è limitata ad un - b ≠ ± M .
Ma se intendevano solo che la differenza era limitata: a - b ≠ M ,
allora il problema appare trattabile.aba−b≠±M
a−b≠M
Ho risolto quel problema più semplice e ho cercato di generalizzare in un modo che speravo potesse dare un po 'di libertà nel risolvere il problema più grande. Ma questo mi ha appena chiarito il motivo per cui è improbabile che funzioni un approccio ricorsivo, che discuterò alla fine.
Considera la funzione che fornisce il numero di permutazioni di un elenco di elementi etichettati da 1 a N , dove l'elemento a in posizione b (la prima posizione è 1) soddisfa a - b ≠ M , e b - un ≠ P .f(N,M,P)Naba−b≠Mb−a≠P
Per visualizzarlo, separandolo in due vincoli consente a e P di spostare tali restrizioni separatamente.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
Per comodità, quando modo che non ponga restrizioni sulle permutazioni, definire g ( N , M ) = f ( N , M , P ) . Allo stesso modo, g ( N , P ) = f ( N , M , P ) quando M ≥ N in modo che non ponga restrizioni sulle permutazioni.P≥Ng(N,M)=f(N,M,P)g(N,P)=f(N,M,P)M≥N
Nel caso speciale i vincoli di M e P sono equivalenti, quindi uno può essere ignorato, permettendoci di scrivere f in termini di g :
f ( N , 0 , 0 ) = g ( N , 0 ) .M=P=0MPfg
f(N,0,0)=g(N,0).
Dalla simmetria del problema:
f(N,M,P)=f(N,P,M)
Prima risolviamo per , quindi affrontiamo la f più generale ( N , M , P ) .g(N,M)f(N,M,P)
Per , ogni elemento ha una restrizione di posizionamento (e le restrizioni sono distinte). Quindi, scegliendo qualche elemento i , lo posizioneremo in una posizione j . Ci sono N - 1 diverse possibilità per la scelta di j .M=0ijN−1j
Questa selezione ha rimosso la posizione limitata per l'elemento , mentre gli altri ( N - 2 ) hanno ancora una restrizione. Possiamo suddividere il posizionamento di j in due opzioni:j(N−2)j
Posizionare in . Questo lascia tutti gli altri elementi con una limitazione, quindi il problema di posizionamento rimanente è ora ridotto a g ( N - 2 , 0 ) .ig(N−2,0)
Mettere in posizione . Questo ora fornisce una restrizione di posizionamento per j , quindi ogni elemento ha una restrizione e il problema di posizionamento rimanente viene ridotto a g ( N - 1 , 0 )≠ijg(N−1,0)
Quindi questo dà la formula ricorsiva:
g(N,0)=(N−1)[g(N−2,0)+g(N−1,0)]
E guardando le semplici situazioni a mano, è possibile ottenere i casi di base.
g(1,0)=0, g(2,0)=1
Questa è la solita formula ricorsiva di derangement.
Anche se non riesco a immaginare che qualcuno stia uscendo con questo sul posto, si scopre anche che esiste una soluzione a forma chiusa per questo (vedi l' articolo wiki sul disordine per i dettagli).
g(N,0)=⌊n!e+12⌋
Per , non vi sono restrizioni per nessuno dei posizionamenti:M≥N
(M≥N)⟹g(N,M)=N!
Con , i primi elementi M non avranno restrizioni e gli elementi rimanenti avranno una limitazione di posizionamento. Termini delle posizioni, le ultime posizioni M consentiranno tutti i numeri.0<M<NMM
Per l'ultima posizione, selezionare un elemento . Esistono due possibilità per l'aspetto del posizionamento rimanente:i
Se , poi ho avuto nessuna restrizione di collocamento, in modo da utilizzare i non cambia le restrizioni qualsiasi posizione. Abbiamo anche rimosso una posizione senza restrizioni, quindi il posizionamento rimanente appare come g ( N - 1 , M - 1 ) .i<Miig(N−1,M−1)
Se , ho avuto una limitazione di posizionamento e abbiamo rimosso una posizione senza alcuna restrizione. Poiché i è posto, la posizione è stato limitato da ora può accettare uno qualsiasi dei numeri rimanenti. Quindi il posizionamento rimanente sembra g ( N - 1 , M ) .i>=Miig(N−1,M)
Quindi questo dà la formula ricorsiva:
(0<M<N)⟹g(N,M)=(M−1)g(N−1,M−1)+(N−M+1)g(N−1,M)
Questo completa la soluzione ricorsiva per .g
Quando , le prime posizioni N - M hanno una limitazione di numero singolo su di esse, le ultime posizioni N - P hanno una limitazione di numero singolo su di esse e le posizioni centrali M + P - N non hanno restrizioni. Questo è proprio come il caso g ( N , M + P - N ) .M+P≥NN−MN−PM+P−Ng(N,M+P−N)
(M+P)≥N⟹f(N,M,P)=g(N,M+P−N)
0<M<N0<P<NM+P<Nf0<M≤P<N
PN−M−PM
MN−M−P elements have two restrictions, then the last P elements have a single restriction.
However this is where we must end. As there is no way forward with this method.
I separated the two constraints because I could see that placing a number in a selected position could unbalance how many single constrained positions there were for the "+" constraint and the "-" constraint of a−b≠±M.
But in the more general problem, removing a position by placing a number in it, does not always result in a subproblem that is described with f(N,M,P).
To visualize these constraints on the permutation, consider a directed graph with 2N nodes, one set of N labeled {A1,A2,...,AN} and another labelled {B1,B2,...,BN}. A directed edge (Ai,Bj) exists if i−j=M, and directed edge (Bj,Ai) exists if j−i=M and M≠0.
The set of A nodes can be considered the numbers we are permuting in some list, and B nodes their possible positions. This graph represents the constraints. There will be no cycles in the graph. It will always be disjoint nodes or chains of length one or more.
So we want a function which takes as input this constraint graph, and outputs the number of permutations that satisfy the constraints.
In the case where M+P≥N, the graph is just disjoint nodes and single edges. So removing an A and B node will give a subgraph that is also disjoint nodes and single edges.
However for 0<M≤P<N, the graph can have long chains. To place a number in an available position, regardless of whether we fix the node or the position, we need to consider all the subgraphs of possible ways to build that. All the different ways of breaking up the chains will result in a "recursion" that is on the order of N parts each round, and thus can't expect much if any savings compared to checking all N! permutations.
Because there are so many possible subgraphs once chains are allowed, I really don't see how this can be solved with the usual recursive methods unless there is a clever relation saying how non-isomorphic constraint graphs are somehow equivalent for the number of permutations.
I think most likely, the question was misinterpreted. Possibly even by the interviewer (who may have forgotten the answer details themselves).