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.aba−b≠±M
a−b≠M
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)Naba−b≠Mb−a≠P
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.P≥Ng(N,M)=f(N,M,P)g(N,P)=f(N,M,P)M≥N
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=0ijN−1j
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(N−2)j
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(N−2,0)
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(N−1,0)
Donc, cela donne la formule récursive:
g(N,0)=(N−1)[g(N−2,0)+g(N−1,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:M≥N
(M≥N)⟹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
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(N−1,M−1)
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(N−1,M)
Cela donne donc la formule récursive:
(0<M<N)⟹g(N,M)=(M−1)g(N−1,M−1)+(N−M+1)g(N−1,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+P≥NN−MN−PM+P−Ng(N,M+P−N)
(M+P)≥N⟹f(N,M,P)=g(N,M+P−N)
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<M≤P<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.PN−M−PM
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.MN−M−PP
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' .a−b≠±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)i−j=M, et le bord dirigé existe si j - i = M et M ≠ 0 .(Bj,Ai)j−i=MM≠0
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+P≥N
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<M≤P<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).