É possível que você tenha lembrado os detalhes específicos incorretamente ou interpretado mal a pergunta?
Em sua descrição, elemento de na posição b é restrito a um - b ≠ ± M .
Mas se eles apenas quiseram dizer que a diferença era restrita: a - b ≠ M ,
então o problema parece tratável.aba−b≠±M
a−b≠M
Eu elaborei esse problema mais simples e tentei generalizar de uma maneira que esperava dar alguma liberdade para resolver o problema maior. Mas isso me esclareceu por que é improvável que uma abordagem recursiva funcione, que discuto no final.
Considere a função que fornece o número de permutações de uma lista de elementos rotulados de 1 a N , onde o elemento a na posição b (a primeira posição é 1) satisfaz a - b ≠ M e b - um ≠ P .f(N,M,P)Naba−b≠Mb−a≠P
Para visualizar isso, separá-lo em duas restrições permite que e P alterem essas restrições separadamente.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
Por conveniência, quando para que não imponha restrições às permutações, defina g ( N , M ) = f ( N , M , P ) . Da mesma forma, g ( N , P ) = f ( N , M , P ) quando M ≥ N, de forma que não restrinja as permutações.P≥Ng(N,M)=f(N,M,P)g(N,P)=f(N,M,P)M≥N
No caso especial a restrição de M e P é equivalente, pelo que se pode ignorar, permitindo escrever f em termos de g :
f ( N , 0 , 0 ) = g ( N , 0 ) .M=P=0MPfg
f(N,0,0)=g(N,0).
A partir da simetria do problema:
f(N,M,P)=f(N,P,M)
Vamos primeiro resolver para e depois abordar f mais geral ( N , M , P )g(N,M)f(N,M,P) .
Para , cada elemento possui uma restrição de posicionamento (e as restrições são distintas). Então, escolhendo um elemento i , vamos colocá-lo em alguma posição j . Existem N - 1 possibilidades diferentes para a escolha de jM=0ijN−1j .
Essa seleção removeu a posição restrita do elemento , enquanto os outros elementos ( N - 2 ) ainda possuem uma restrição. Podemos dividir o posicionamento de j em duas opções:j(N−2)j
Coloque em . Isso deixa todos os outros elementos com uma restrição; portanto, o problema de posicionamento restante agora é reduzido para g ( N - 2 , 0 ) .ig(N−2,0)
Coloque em uma posição . Agora, isso fornece uma restrição de posicionamento para j , de modo que cada elemento possui uma restrição e o problema de posicionamento restante é reduzido para g ( N - 1 , 0 )≠ijg(N−1,0)
Portanto, isso fornece a fórmula recursiva:
g(N,0)=(N−1)[g(N−2,0)+g(N−1,0)]
E, olhando as situações simples à mão, pode obter os casos básicos.
g(1,0)=0, g(2,0)=1
Essa é a fórmula recursiva do desarranjo usual.
Embora eu não possa imaginar alguém apresentando isso no local, também há uma solução de formulário fechado para isso (consulte o artigo wiki do desarranjo para obter detalhes).
g(N,0)=⌊n!e+12⌋
Para , não há restrições para nenhum dos canais:M≥N
(M≥N)⟹g(N,M)=N!
Com , os primeiros elementos M não terão restrições e os elementos restantes terão uma restrição de posicionamento. É termos das posições, o último M0<M<NMM posições permitirão todos os números.
Para a última posição, selecione um elemento . Existem duas possibilidades para a aparência do canal restante:i
Se , então eu não tinha restrições de colocação, portanto, usando i não altera as restrições sobre qualquer posição. Também removemos uma posição sem restrição; portanto, o posicionamento restante se parece com g ( N - 1 , M - 1 ) .i<Miig(N−1,M−1)
Se , então eu tinha uma restrição de posicionamento e removemos uma posição sem restrição. Como i é colocado, a posição em que foi restringida a partir de agora pode aceitar qualquer um dos números restantes. Portanto, o posicionamento restante se parece com g ( N - 1 , M ) .i>=Miig(N−1,M)
Portanto, isso fornece a fórmula recursiva:
(0<M<N)⟹g(N,M)=(M−1)g(N−1,M−1)+(N−M+1)g(N−1,M)
Isso finaliza a solução recursiva para g .
Quando , as primeiras posições N - M têm uma restrição de número único, as últimas posições N - P têm uma restrição de número único e as posições médias M + P - N não têm restrições. É exatamente como o 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)
Atualmente, lidamos com todos os casos, exceto e 0 < P < N, de modo que M + P < N . É aqui que alguns elementos têm várias restrições. Devido à simetria em f , podemos considerar 0 < M ≤ P < N sem perda de generalidade.0<M<N0<P<NM+P<Nf0<M≤P<N
As primeiras posições terão uma única restrição, depois as posições N - M - P com duas restrições, e a última MPN−M−PM posições terão uma única restrição.
Observando os elementos, os primeiros elementos terão uma única restrição, os elementos N - M - P terão duas restrições e, em seguida, o último PMN−M−PP elementos terão uma única restrição.
No entanto, é aqui que devemos terminar. Como não há caminho a seguir com esse método.
a - b ≠ ± M .
f( N, M, P) .
To visualize these constraints on the permutation, consider a directed graph with 2 N nodes, one set of N labeled { A1, A2, . . . , AN} e outro rotulado { B1, B2, . . . , BN}. Uma borda direcionada( AEu, Bj) existe se i - j = Me borda direcionada ( Bj, AEu) existe se j - i = M e M≠ 0.
O conjunto de UMA nós podem ser considerados os números que estamos permutando em alguma lista e 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).