Contagem de permutações cujos elementos não são exatamente seus índices ± M


13

Recentemente, fui questionado sobre esse problema em uma entrevista algorítmica e não consegui resolvê-lo.

Dados dois valores N e M, é necessário contar o número de permutações de comprimento N (usando números de 1 a N), de modo que a diferença absoluta entre qualquer número na permutação e sua posição na permutação não seja igual a M.

Exemplo - Se N = 3 e M = 1, 1 2 3 e 3 2 1 são permutações válidas, mas 1 3 2 é inválido, pois o número 3 está na posição 2 e a diferença é = M.

Tentei a programação dinâmica do NxM, mas não consegui formar uma recorrência que não conta repetições.


Talvez você possa obter uma fórmula usando inclusão-exclusão. O caso é classicamente conhecido como desarranjo . M=0
Yuval Filmus

1
Este é um exemplo particular de contagem de combinações perfeitas em gráficos bipartidos, um problema que é completo. Obviamente, esse caso em particular poderia ser mais fácil. #P
Yuval Filmus

Eu já tentei a exclusão de inclusão, mas não fiz nenhum progresso.
Gena

Você pode tentar adaptar os métodos para contar desarranjos . Não sei se isso o levará a lugar algum. Você também pode tentar fixar M = 1 (digamos), calcular o número para pequenos valores de N (N = 1,2,3,4,5,6,7,8) por força bruta e, em seguida, procurar a sequência correspondente na OEIS, na esperança de encontrar algo útil.
DW

Qual é a recursão que você configurou? O que você quer dizer com "contar repetições"?
Raphael

Respostas:


2

A primeira coisa que eu faria quando recebesse essa pergunta seria

Você quer um algoritmo de tempo polinomial?

e então espero que a resposta seja 'não'. Suspeito que esse problema seja NP-difícil, pelo seguinte motivo:

A abordagem natural para esse problema é considerar a colocação do primeiro número e derivar uma fórmula recursiva para colocar os outros. Isso funciona bem para o caso (ou seja, contando o número de perturbações), pois não importa em qual posição você colocou o primeiro número, pois existe apenas uma posição 'ilegal' de cada número. Em outras palavras, essa abordagem leva a subproblemas independentes.M=0

Para , isso não é tão simples, pois agora podemos ter duas posições ilegais para alguns números. Qual dessas posições permanece no subproblema agora é relevante para a solução do subproblema. Apenas considerar o número de posições 'ilegais' não é suficiente, pois as 'cadeias' de números que compartilham uma posição ilegal são necessárias para determinar a estrutura dos subproblemas desse subproblema. Portanto, essa abordagem leva essencialmente ao seguinte subproblema:M>02

Dado um conjunto , um conjunto B N com tamanho máximo de N e um número natural M , conte o número de combinações perfeitas no gráfico bipartido ( A , B , E ) , onde ( a , b ) E se e somente se | a - b | M .ANBNNM(A,B,E)(a,b)E|ab|M

Esse problema parece difícil. A única abordagem para esse problema que vejo é a inclusão / exclusão, que não levará a um algoritmo de tempo polinomial.

Podemos considerar abordagens que não dependem do posicionamento iterativo dos números, mas não tenho idéia de como você faria isso. (especialmente durante uma entrevista!)

Claro, tudo isso é mera especulação e ainda é possível que um truque inteligente possa dar uma solução polinomial no tempo, mas espero ter apresentado argumentos convincentes de que esse truque deve ser muito inteligente.

Talvez seja possível mostrar dureza NP reduzindo esse problema para # 2-SAT (as 'cadeias' de números que compartilham posições ilegais parecem uma escolha não trivial que pode ser combinada com a seleção de um valor de verdade), mas Eu não vi uma maneira óbvia de fazer isso a partir de agora.


Caso o entrevistador realmente se satisfaça com um algoritmo de tempo exponencial, eu simplesmente geraria todas as soluções possíveis, adaptando um algoritmo de retorno recursivo para gerar uma permutação para excluir esse caso em particular.


Eu disse que eu possa dar um algoritmo de tempo exponencial, mas foi convidado para uma solução de tempo polinomial que funciona quando N é <= 1000.
Gena

1
Bem, a menos que você tenha lembrado / interpretado mal a pergunta, como sugere a resposta do PPenguin, acho que essa pergunta é feita por entrevistadores muito exigentes, entrevistadores que não entenderam a pergunta ou talvez até como uma pergunta que eles não esperam que alguém resolva. . Mesmo que essa questão não seja computacionalmente difícil, é mais provável que seja uma entrevista difícil.
Lagarto discreto

Parece que M = 1 provavelmente é factível (e, portanto, possivelmente os outros), então há algo que perdemos. Você pode me ajudar a entender / avaliar o caso M = 1? Eu fiz uma pergunta separada para ele cs.stackexchange.com/questions/74674/...
PPenguin

2

É 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.abab±M
abM


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)NababMbaP

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.PNg(N,M)=f(N,M,P)g(N,P)=f(N,M,P)MN

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=0ijN1j .

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(N2)j

  1. 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(N2,0)

  2. 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(N1,0)

Portanto, isso fornece a fórmula recursiva:

g(N,0)=(N1)[g(N2,0)+g(N1,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:MN

(MN)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

  1. 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(N1,M1)

  2. 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(N1,M)

Portanto, isso fornece a fórmula recursiva:

(0<M<N)g(N,M)=(M1)g(N1,M1)+(NM+1)g(N1,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+PNNMNPM+PNg(N,M+PN)

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

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<MP<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 MPNMPM 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 PMNMPP elementos terão uma única restrição.

No entanto, é aqui que devemos terminar. Como não há caminho a seguir com esse método.


uma-b±M .

f(N,M,P) .

To visualize these constraints on the permutation, consider a directed graph with 2N nodes, one set of N labeled {UMA1,UMA2,...,UMAN} e outro rotulado {B1,B2,...,BN}. Uma borda direcionada(UMAEu,Bj) existe se Eu-j=Me borda direcionada (Bj,UMAEu) existe se j-Eu=M e M0 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+PN, 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<MP<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).


Por que o gráfico de restrição é direcionado? O que significam as instruções?
Lagarto discreto

@Discretelizard As duas direções (a-> b vs b-> a) distinguem entre a origem da restrição (a versão '+' ou '-' da restrição). Não é realmente necessário, porque não importa a origem da restrição, apenas facilitou a visualização do que estava acontecendo.
PPenguin
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.