Comptage des permutations dont les éléments ne sont pas exactement leur indice ± M


13

On m'a récemment posé ce problème dans une interview algorithmique et je n'ai pas réussi à le résoudre.

Étant donné deux valeurs N et M, vous devez compter le nombre de permutations de longueur N (en utilisant des nombres de 1 à N) de sorte que la différence absolue entre tout nombre dans la permutation et sa position dans la permutation ne soit pas égale à M.

Exemple - Si N = 3 et M = 1, alors 1 2 3 et 3 2 1 sont des permutations valides mais 1 3 2 est invalide car le nombre 3 est en position 2 et leur différence est = M.

J'ai essayé la programmation dynamique NxM mais je n'ai pas réussi à former une récurrence qui ne compte pas les répétitions.


Vous pouvez peut-être obtenir une formule utilisant l'inclusion-exclusion. Le cas est classiquement connu sous le nom de dérangements . M=0
Yuval Filmus

1
Il s'agit d'une instance particulière de comptage des correspondances parfaites dans les graphes bipartites, un problème qui est -complet. Bien sûr, ce cas particulier pourrait être plus facile. #P
Yuval Filmus

J'ai déjà essayé l'inclusion-exclusion mais je n'ai fait aucun progrès.
Gena

Vous pouvez essayer d'adapter les méthodes de comptage des dérangements . Je ne sais pas si cela vous mènera quelque part. Vous pouvez également essayer de fixer M = 1 (par exemple), calculer le nombre de petites valeurs de N (N = 1,2,3,4,5,6,7,8) par force brute, puis rechercher la séquence correspondante dans OEIS dans l'espoir que vous trouverez quelque chose d'utile.
DW

Quelle est la récursivité que vous avez configurée? Qu'entendez-vous par «compter les répétitions»?
Raphael

Réponses:


2

La première chose que je demanderais une fois cette question posée serait

Voulez-vous un algorithme de temps polynomial?

et puis j'espère que la réponse est «non». Je soupçonne que ce problème est NP-difficile, pour la raison suivante:

L'approche naturelle de ce problème consiste à considérer le placement du premier nombre et à dériver une formule récursive pour placer les autres. Cela fonctionne bien pour le cas (c'est-à-dire compter le nombre de dérangements), car peu importe la position que vous avez placée le premier nombre, car il n'y a qu'une seule position «illégale» de chaque nombre. En d'autres termes, cette approche conduit à des sous-problèmes indépendants.M=0

Pour , ce n'est pas si simple, car nous pouvons maintenant avoir positions illégales pour certains nombres. Laquelle de ces positions reste dans le sous-problème est maintenant pertinente pour la solution du sous-problème. Il ne suffit pas de considérer le nombre de positions «illégales», car les «chaînes» de nombres qui partagent une position illégale sont nécessaires pour déterminer la structure des sous-problèmes de ce sous-problème. Cette approche conduit donc essentiellement au sous-problème suivant:M>02

Étant donné un ensemble , un ensemble fois de taille au plus N et un nombre naturel M , comptez le nombre de correspondances parfaites sur le graphique bipartite ( A , B , E ) , où ( a , b ) E si et seulement si | a - b | M . B NANBNNM(A,B,E)(a,b)E|ab|M

Ce problème semble difficile. La seule approche de ce problème que je vois est l'inclusion / exclusion, qui ne conduira pas à un algorithme de temps polynomial.

Nous pouvons envisager des approches qui ne reposent pas sur le placement itératif des nombres, mais je n'ai aucune idée de la façon dont vous procéderiez. (surtout lors d'une interview!)

Bien sûr, tout cela n'est que de la spéculation et il est toujours possible qu'une astuce intelligente puisse donner une solution temporelle polynomiale, mais j'espère avoir avancé un argument convaincant selon lequel cette astuce doit être très intelligente.

Il est peut-être possible de montrer la dureté NP en réduisant ce problème à # 2-SAT (les `` chaînes '' de nombres qui partagent des positions illégales semblent un choix non trivial qui pourrait être associé à la sélection d'une valeur de vérité), mais Je n'ai pas vu de façon évidente de le faire pour l'instant.


Dans le cas où l'intervieweur serait réellement satisfait d'un algorithme de temps exponentiel, je générerais simplement toutes les solutions possibles en adaptant un algorithme de retour en arrière récursif pour générer une permutation pour exclure ce cas particulier.


J'ai dit que je pouvais donner un algorithme à temps exponentiel, mais on m'a demandé une solution temporelle polynomiale qui fonctionne lorsque N est <= 1000.
Gena

1
Eh bien, à moins que vous ne vous souveniez pas mal / avez mal interprété la question comme le suggère la réponse de PPenguin, je pense que cette question est soit posée par des enquêteurs très exigeants, des enquêteurs qui eux-mêmes ont mal compris la question ou peut-être même comme une question qu'ils ne s'attendent à ce que personne ne résolve . Même si cette question s'avérait ne pas être difficile à calculer, elle est très probablement difficile à interviewer.
Lézard discret

Il semble que M = 1 soit probablement faisable (et donc peut-être les autres), donc il y a quelque chose que nous avons manqué. Pouvez-vous m'aider à comprendre / évaluer le cas M = 1? J'ai fait une question distincte pour cela cs.stackexchange.com/questions/74674/…
PPenguin

2

Est-il possible que vous vous souveniez mal des détails spécifiques ou avez mal interprété la question?

Dans votre description, l' élément en position b est limitée à un - b ± M . Mais s'ils signifiaient simplement que la différence était limitée: a - b M , alors le problème semble traitable.abab±M
abM


J'ai résolu ce problème plus simple et j'ai essayé de généraliser d'une manière qui, je l'espérais, donnerait une certaine liberté pour résoudre le problème plus large. Mais cela vient de clarifier pour moi pourquoi une approche récursive est très peu susceptible de fonctionner, ce dont je discute à la fin.

Considérons la fonction qui donne le nombre de permutations d'une liste d'éléments étiquetés de 1 à N , où l'élément a en position b (la première position est 1) satisfait a - b M , et b - un P .f(N,M,P)NababMbaP

Pour visualiser cela, le séparer en deux contraintes permet à et P de déplacer ces restrictions séparément.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

Par commodité, lorsque pour ne pas imposer de restrictions sur les permutations, définissez g ( N , M ) = f ( N , M , P ) . De même, g ( N , P ) = f ( N , M , P ) lorsque M N de sorte qu'il n'impose aucune restriction sur les permutations.PNg(N,M)=f(N,M,P)g(N,P)=f(N,M,P)MN

Dans le cas particulier les contraintes de M et P sont équivalentes, donc on peut être ignoré, ce qui nous permet d'écrire f en termes de g : f ( N , 0 , 0 ) = g ( N , 0 ) .M=P=0MPfg

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

De la symétrie du problème:

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

Résolvons d'abord pour , puis abordons le f plus général ( N , M , P ) .g(N,M)f(N,M,P)

Pour , chaque élément a une restriction de placement (et les restrictions sont distinctes). Donc, en choisissant un élément i , nous le placerons dans une position j . Il existe N - 1 possibilités différentes pour le choix de j .M=0ijN1j

Cette sélection a supprimé la position restreinte de l'élément , tandis que les autres éléments ( N - 2 ) ont toujours une restriction. Nous pouvons diviser le placement de j en deux options:j(N2)j

  1. Placer dans . Cela laisse tous les autres éléments avec une restriction, donc le problème de placement restant est maintenant réduit à g ( N - 2 , 0 ) .ig(N2,0)

  2. Placer dans une position . Cela donne maintenant une restriction de placement pour j , et donc chaque élément a une restriction, et le problème de placement restant est réduit à g ( N - 1 , 0 )ijg(N1,0)

Donc, cela donne la formule récursive:

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

Et en regardant les situations simples à la main, vous pouvez obtenir les cas de base.

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

Il s'agit de la formule récursive de dérangement habituelle.

Bien que je ne puisse pas imaginer que quelqu'un vienne avec cela sur le vif, il s'avère également qu'il existe une solution sous forme fermée pour cela (voir l' article wiki de dérangement pour plus de détails).

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

Pour , il n'y a aucune restriction sur aucun des stages:MN

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

Avec , les premiers éléments M n'auront aucune restriction et les éléments restants auront une restriction de placement. En termes de positions, les dernières positions M permettront tous les nombres.0<M<NMM

Pour la dernière position, sélectionnez un élément . Il y a deux possibilités à quoi ressemble l'emplacement restant:i

  1. Si , alors je n'avais aucune restriction de placement, donc l'utilisation de i ne modifie pas les restrictions sur aucune position. Nous avons également supprimé une position sans restriction, de sorte que le placement restant ressemble à g ( N - 1 , M - 1 ) .i<Miig(N1,M1)

  2. Si , alors j'ai eu une restriction de placement et nous avons supprimé une position sans restriction. Parce que i est placé, la position dans laquelle il a été restreint à partir de maintenant peut accepter n'importe quel nombre restant. Le placement restant ressemble donc à g ( N - 1 , M ) .i>=Miig(N1,M)

Cela donne donc la formule récursive:

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

Ceci termine la solution récursive pour .g

Lorsque , les premières positions N - M ont une restriction de numéro unique, les dernières positions N - P ont une restriction de numéro unique et les positions M + P - N intermédiaires n'ont pas de restriction. C'est comme le cas g ( N , M + P - N ) .M+PNNMNPM+PNg(N,M+PN)

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

Nous avons traité tous les cas actuellement sauf et 0 < P < N tels que M + P < N . C'est là que certains éléments ont de multiples restrictions. Du fait de la symétrie en f , on peut considérer 0 < M P < N sans perte de généralité.0<M<N0<P<NM+P<Nf0<MP<N

Les premières positions auront une seule restriction, puis les positions N - M - P avec deux restrictions, puis les dernières positions M auront une seule restriction.PNMPM

En regardant les éléments, les premiers éléments auront une seule restriction, puis les éléments N - M - P auront deux restrictions, puis les derniers éléments P auront une seule restriction.MNMPP

Mais c'est là que nous devons finir. Comme il n'y a aucun moyen de progresser avec cette méthode.


Je choisis les deux contraintes parce que je pouvais voir que placer un numéro dans une position choisie pourrait déséquilibrer le nombre de positions individuelles sous contraintes , il y avait de la contrainte « + » et « - » contrainte d' .ab±M

Mais dans le problème plus général, supprimer une position en y plaçant un nombre, n'entraîne pas toujours un sous-problème décrit avec .f(N,M,P)

Pour visualiser ces contraintes sur la permutation, considérons un graphe orienté avec noeuds, un ensemble de N étiqueté { A 1 , A 2 , . . . , A N } et un autre marqué { B 1 , B 2 , . . . , B N } . Un bord dirigé ( A i , B j ) existe si i - j = M2NN{A1,A2,...,AN}{B1,B2,...,BN}(Ai,Bj)ij=M, et le bord dirigé existe si j - i = M et M 0 .(Bj,Ai)ji=MM0

L'ensemble des nœuds peut être considéré comme les nombres que nous permutons dans une liste, et les nœuds B leurs positions possibles. Ce graphique représente les contraintes. Il n'y aura pas de cycles dans le graphique. Ce seront toujours des nœuds disjoints ou des chaînes de longueur un ou plusieurs.AB

Nous voulons donc une fonction qui prend en entrée ce graphe de contraintes, et génère le nombre de permutations qui satisfont les contraintes.

Dans le cas où , le graphe n'est que des nœuds disjoints et des arêtes simples. Ainsi, la suppression d'un nœud A et B donnera un sous-graphique qui est également des nœuds disjoints et des bords simples.M+PN

Cependant pour , le graphe peut avoir de longues chaînes. Pour placer un nombre dans une position disponible, que nous fixions le nœud ou la position, nous devons considérer tous les sous-graphiques des façons possibles de le construire. Toutes les différentes façons de briser les chaînes se traduiront par une "récursivité" qui est de l'ordre de N pièces à chaque tour, et ne peut donc pas s'attendre à beaucoup ou pas d'économies par rapport à la vérification de tous les N ! permutations.0<MP<NNN!

Parce qu'il y a tellement de sous-graphiques possibles une fois que les chaînes sont autorisées, je ne vois vraiment pas comment cela peut être résolu avec les méthodes récursives habituelles à moins qu'il n'y ait une relation intelligente disant comment les graphiques de contraintes non isomorphes sont en quelque sorte équivalents au nombre de permutations.

Je pense que très probablement, la question a été mal interprétée. Peut-être même par l'intervieweur (qui peut avoir lui-même oublié les détails de la réponse).


Pourquoi votre graphique de contraintes est-il dirigé? Que signifient les directions?
Lézard discret

@Discretelizard Les deux directions (a-> b vs b-> a) distinguent l'origine de la contrainte (la version '+' ou '-' de la contrainte). Ce n'est pas vraiment nécessaire, car peu importe l'origine de la contrainte, cela m'a simplement permis de visualiser ce qui se passait.
PPenguin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.