Conteggio delle permutazioni i cui elementi non sono esattamente il loro indice ± M


13

Recentemente mi è stato chiesto questo problema in un'intervista algoritmica e non sono riuscito a risolverlo.

Dati due valori N e M, devi contare il numero di permutazioni di lunghezza N (usando numeri da 1 a N) in modo tale che la differenza assoluta tra qualsiasi numero nella permutazione e la sua posizione nella permutazione non sia uguale a M.

Esempio - Se N = 3 e M = 1, 1 2 3 e 3 2 1 sono permutazioni valide ma 1 3 2 non è valido poiché il numero 3 è nella posizione 2 e la loro differenza è = M.

Ho provato la programmazione dinamica di NxM ma non sono riuscito a formare una ricorrenza che non conta le ripetizioni.


Puoi forse ottenere una formula usando l'inclusione-esclusione. Il caso è classicamente noto come derangements . M=0
Yuval Filmus

1
Questa è un'istanza particolare del conteggio di corrispondenze perfette nei grafici bipartiti, un problema che è -completo. Naturalmente, questo caso particolare potrebbe essere più semplice. #P
Yuval Filmus

Ho già provato l'inclusione-esclusione ma non ho fatto progressi.
Gena,

Potresti provare ad adattare i metodi per contare gli squilibri . Non so se questo ti porterà ovunque. Potresti anche provare a fissare M = 1 (diciamo), calcolando il numero per piccoli valori di N (N = 1,2,3,4,5,6,7,8) con la forza bruta e quindi guardando la sequenza corrispondente in OEIS nella speranza di trovare qualcosa di utile.
DW

Qual è la ricorsione che hai impostato? Cosa intendi con "conta ripetizioni"?
Raffaello

Risposte:


2

La prima cosa che vorrei porre quando viene data questa domanda sarebbe

Vuoi un algoritmo temporale polinomiale?

e quindi spero che la risposta sia "no". Sospetto che questo problema sia NP-difficile, per il seguente motivo:

L'approccio naturale a questo problema è considerare il posizionamento del primo numero e derivare una formula ricorsiva per posizionare gli altri. Questo funziona bene per il caso (cioè contando il numero di disallineamenti), poiché non importa in quale posizione hai inserito il primo numero, poiché esiste solo una posizione "illegale" per ogni numero. In altre parole, questo approccio porta a sottoproblemi indipendenti.M=0

Per , questo non è così semplice, poiché ora possiamo avere 2 posizioni illegali per alcuni numeri. Quale di queste posizioni rimangono nel sottoproblema è ora rilevante per la soluzione del sottoproblema. Considerare solo il numero di posizioni "illegali" non è sufficiente, poiché le "catene" di numeri che condividono una posizione illegale sono necessarie per determinare la struttura dei sottoproblemi di quel sottoproblema. Quindi, questo approccio porta essenzialmente al seguente sottoproblema:M>02

Dato un set , un set B N entrambi di dimensione al massimo N e un numero naturale M , conta il numero di corrispondenze perfette sul grafico bipartito ( A , B , E ) , dove ( a , b ) E se e solo se | a - b | M .ANBNNM(A,B,E)(a,b)E|ab|M

Questo problema sembra difficile. L'unico approccio a questo problema che vedo è l'inclusione / esclusione, che non porterà a un algoritmo temporale polinomiale.

Possiamo considerare approcci che non si basano sul posizionamento iterativo dei numeri, ma non ho idea di come lo faresti. (specialmente durante un'intervista!)

Ovviamente, tutto ciò è semplice speculazione ed è ancora possibile che un trucco intelligente possa fornire una soluzione temporale polinomiale, ma spero di aver argomentato in modo convincente che questo trucco deve essere davvero molto intelligente.

Forse è possibile mostrare la durezza NP riducendo questo problema a # 2-SAT (le "catene" di numeri che condividono posizioni illegali sembrano una scelta non banale che potrebbe essere abbinata alla selezione di un valore di verità), ma Non ho visto un modo ovvio per farlo da ora.


Nel caso in cui l'intervistatore fosse effettivamente soddisfatto di un algoritmo temporale esponenziale, genererei semplicemente tutte le possibili soluzioni adattando un algoritmo ricorsivo di backtracking per generare una permutazione per escludere questo caso particolare.


Ho detto che posso dare un algoritmo del tempo esponenziale, ma mi è stata chiesta una soluzione temporale polinomiale che funziona quando N è <= 1000.
Gena,

1
Bene, a meno che tu non abbia ricordato / interpretato male la domanda come suggerisce la risposta di PPenguin, penso che questa domanda sia posta da intervistatori molto esigenti, intervistatori che a loro volta hanno frainteso la domanda o forse anche come una domanda che non si aspettano che qualcuno risolva . Anche se questa domanda non risulterà complicata dal punto di vista computazionale, molto probabilmente è difficile da intervistare.
Lucertola discreta

Sembra che M = 1 sia probabilmente fattibile (e quindi probabilmente gli altri), quindi c'è qualcosa che ci è sfuggito. Potete aiutarmi a capire / valutare il caso M = 1? Ho fatto una domanda separata per questo cs.stackexchange.com/questions/74674/…
PPenguin

2

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


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

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

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

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

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

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

Quindi questo dà la formula ricorsiva:

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

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

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

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

Quindi questo dà la formula ricorsiva:

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

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

0<M<N0<P<NM+P<Nf0<MP<N

PNMPM

MNMP 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 ab±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 ij=M, and directed edge (Bj,Ai) exists if ji=M and M0.

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+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).


Why is your constraint graph directed? What do the directions mean?
Discrete lizard

@Discretelizard The two directions (a->b vs b->a) distinguish between where the constraint came from (the '+' or the '-' version of the constraint). It's not really needed, because it doesn't matter the origin of the constraint, it just made it easier for me to visualize what was going on.
PPenguin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.