<em>Je me suis un peu amusé avec celui-ci. La première chose à laquelle j'ai pensé en lisant le problème est la théorie des groupes (le groupe symétrique S n en particulier). La boucle for construit simplement une permutation dans S n en composant des transpositions (c'est-à-dire des échanges) à chaque itération. Mes mathématiques ne sont pas très spectaculaires et je suis un peu rouillé, donc si ma notation est erronée, soyez indulgent avec moi.</em>
Vue d'ensemble
Soit A
soit le cas où notre tableau est inchangé après permutation. On nous demande finalement de trouver la probabilité de l'événement A
, Pr(A)
.
Ma solution tente de suivre la procédure suivante :
- Considérer toutes les permutations possibles (c'est-à-dire les réorganisations de notre tableau).
- Répartissez ces permutations en disjoint en fonction du nombre de ce que l'on appelle transpositions d'identité ils contiennent. Cela permet de réduire le problème à même permutations uniquement.
- Déterminez la probabilité d'obtenir la permutation d'identité étant donné que la permutation est paire (et d'une longueur particulière).
- Additionnez ces probabilités pour obtenir la probabilité globale que le tableau soit inchangé.
1) Résultats possibles
Remarquez que chaque itération de la boucle for crée un swap (ou transposition ) qui aboutit à l'une des deux choses suivantes (mais jamais aux deux) :
- Deux éléments sont échangés.
- Un élément est échangé avec lui-même. Pour nos besoins, le tableau reste inchangé.
Nous étiquetons le deuxième cas. Définissons un transposition d'identité comme suit :
Un transposition d'identité se produit lorsqu'un nombre est échangé avec lui-même. C'est-à-dire, lorsque n == m dans la boucle for ci-dessus.
Pour toute exécution donnée du code listé, nous composons N
transpositions. Il peut y avoir 0, 1, 2, ... , N
des transpositions d'identité apparaissant dans cette "chaîne".
Par exemple, considérons un N = 3
cas :
Given our input [0, 1, 2].
Swap (0 1) and get [1, 0, 2].
Swap (1 1) and get [1, 0, 2]. ** Here is an identity **
Swap (2 2) and get [1, 0, 2]. ** And another **
Notez qu'il y a un nombre impair de transpositions non identiques (1) et que le tableau est modifié.
2) Partitionnement basé sur le nombre de transpositions d'identité
Soit K_i
soit l'événement qui i
transpositions d'identité apparaissent dans une permutation donnée. Notez que cela constitue une partition exhaustive de tous les résultats possibles :
- Aucune permutation ne peut avoir simultanément deux quantités différentes de transpositions d'identité, et
- Toutes les permutations possibles doivent avoir entre
0
y N
transpositions d'identité.
Ainsi, nous pouvons appliquer le Loi de la probabilité totale :

Maintenant, nous pouvons enfin profiter de la partition. Notez que lorsque le nombre de non-identité transpositions est étrange, il n'y a aucune chance que le tableau reste inchangé*. Ainsi :

* En théorie des groupes, une permutation est paire ou impaire, mais jamais les deux. Par conséquent, une permutation impaire ne peut pas être la permutation d'identité (puisque la permutation d'identité est paire).
3) Déterminer les probabilités
Donc nous devons maintenant déterminer deux probabilités pour N-i
même :
![Pr(K_i)]()
![Pr(A|K_i)]()
Le premier mandat
Le premier terme,
représente la probabilité d'obtenir une permutation avec i
transpositions d'identité. Cela s'avère être binomial puisque pour chaque itération de la boucle for :
- Le résultat est indépendant des résultats qui le précèdent, et
- La probabilité de créer une transposition d'identité est la même, à savoir
1/N
.
Ainsi, pour N
essais, la probabilité d'obtenir i
les transpositions d'identité est :

Le deuxième mandat
Donc, si vous êtes arrivés jusqu'ici, nous avons réduit le problème à trouver
para N - i
même. Cela représente la probabilité d'obtenir une permutation d'identité étant donné i
des transpositions sont des identités. J'utilise une approche de comptage naïve pour déterminer le nombre de façons d'obtenir la permutation d'identité sur le nombre de permutations possibles.
Considérons d'abord les permutations (n, m)
y (m, n)
équivalent. Alors, soit M
soit le nombre de permutations non-identiques possibles. Nous utiliserons fréquemment cette quantité.

Le but ici est de déterminer le nombre de façons dont une collection de transpositions peut être combinée pour former la permutation d'identité. Je vais essayer de construire la solution générale à côté d'un exemple de N = 4
.
Considérons le N = 4
cas avec toutes les transpositions d'identité ( c'est-à-dire i = N = 4
). Soit X
représentent une transposition d'identité. Pour chaque X
il y a N
possibilités (elles sont : n = m = 0, 1, 2, ... , N - 1
). Il existe donc N^i = 4^4
possibilités pour réaliser la permutation d'identité. Pour être complet, nous ajoutons le coefficient binomial, C(N, i)
pour considérer l'ordre des transpositions d'identité (ici, il est juste égal à 1). J'ai essayé de représenter cela ci-dessous avec la disposition physique des éléments en haut et le nombre de possibilités en bas :
I = _X_ _X_ _X_ _X_
N * N * N * N * C(4, 4) => N^N * C(N, N) possibilities
Maintenant, sans substituer explicitement N = 4
y i = 4
nous pouvons examiner le cas général. En combinant ce qui précède avec le dénominateur trouvé précédemment, nous trouvons :

C'est intuitif. En fait, toute autre valeur que 1
devrait probablement vous alarmer. Réfléchissez-y : on nous donne la situation dans laquelle tous les membres de la famille N
Les transpositions sont dites identitaires. Quelle est la probabilité que le tableau soit inchangé dans cette situation ? Clairement, 1
.
Maintenant, encore une fois pour N = 4
considérons 2 transpositions d'identité ( c'est-à-dire i = N - 2 = 2
). Par convention, nous placerons les deux identités à la fin (et tiendrons compte de l'ordre plus tard). Nous savons maintenant que nous devons choisir deux transpositions qui, une fois composées, deviendront la permutation d'identité. Plaçons un élément quelconque au premier emplacement, appelons-le t1
. Comme indiqué ci-dessus, il existe M
possibilités en supposant t1
n'est pas une identité (elle ne peut pas l'être puisque nous en avons déjà placé deux).
I = _t1_ ___ _X_ _X_
M * ? * N * N
Le seul élément restant qui pourrait être placé en deuxième position est l'inverse de t1
qui est en fait t1
(et c'est la seule par l'unicité de l'inverse). Nous incluons à nouveau le coefficient binomial : dans ce cas, nous avons 4 emplacements ouverts et nous cherchons à placer 2 permutations d'identité. De combien de façons pouvons-nous le faire ? 4 choisir 2.
I = _t1_ _t1_ _X_ _X_
M * 1 * N * N * C(4, 2) => C(N, N-2) * M * N^(N-2) possibilities
En regardant à nouveau le cas général, tout cela correspond à :

Enfin, nous avons le N = 4
cas sans transposition d'identité ( c'est-à-dire i = N - 4 = 0
). Comme il y a beaucoup de possibilités, cela commence à devenir délicat et nous devons faire attention à ne pas compter deux fois. Nous commençons de la même manière en plaçant un seul élément au premier endroit et en travaillant sur les combinaisons possibles. Prenons d'abord la plus facile : la même transposition 4 fois.
I = _t1_ _t1_ _t1_ _t1_
M * 1 * 1 * 1 => M possibilities
Considérons maintenant deux éléments uniques t1
y t2
. Hay M
possibilités pour t1
et seulement M-1
possibilités pour t2
(depuis t2
ne peut être égal à t1
). Si nous épuisons tous les arrangements, il nous reste les modèles suivants :
I = _t1_ _t1_ _t2_ _t2_
M * 1 * M-1 * 1 => M * (M - 1) possibilities (1)st
= _t1_ _t2_ _t1_ _t2_
M * M-1 * 1 * 1 => M * (M - 1) possibilities (2)nd
= _t1_ _t2_ _t2_ _t1_
M * M-1 * 1 * 1 => M * (M - 1) possibilities (3)rd
Considérons maintenant trois éléments uniques, t1
, t2
, t3
. Plaçons t1
d'abord et ensuite t2
. Comme d'habitude, nous avons :
I = _t1_ _t2_ ___ ___
M * ? * ? * ?
Nous ne pouvons pas encore dire combien de possibles t2
Il n'y en a pas encore, et nous verrons pourquoi dans une minute.
Nous plaçons maintenant t1
en troisième position. Avis, t1
doit aller là, car si nous devions aller au dernier endroit, nous ne ferions que recréer la (3)rd
arrangement ci-dessus. Le double comptage est mauvais ! Il reste donc le troisième élément unique t3
à la position finale.
I = _t1_ _t2_ _t1_ _t3_
M * ? * 1 * ?
Alors pourquoi avons-nous dû prendre une minute pour considérer le nombre de t2
de plus près ? Les transpositions t1
y t2
ne peut pas sont des permutations disjointes ( c'est-à-dire ils doivent partager un (et un seul puisqu'ils ne peuvent pas non plus être égaux) de leurs n
o m
). La raison en est que si elles étaient disjointes, nous pourrions intervertir l'ordre des permutations. Cela signifie que nous compterions deux fois les (1)st
arrangement.
Dites t1 = (n, m)
. t2
doit être de la forme (n, x)
o (y, m)
pour certains x
y y
afin d'être non disjoints. Notez que x
ne peut pas être n
o m
y y
beaucoup ne sont pas n
o m
. Ainsi, le nombre de permutations possibles qui t2
pourrait être est en fait 2 * (N - 2)
.
Donc, revenons à notre mise en page :
I = _t1_ _t2_ _t1_ _t3_
M * 2(N-2) * 1 * ?
Ahora t3
doit être l'inverse de la composition de t1 t2 t1
. Faisons-le manuellement :
(n, m)(n, x)(n, m) = (m, x)
Ainsi, t3
doit être (m, x)
. Notez que c'est no disjoint de t1
et n'est pas égal à l'un ou l'autre t1
o t2
il n'y a donc pas de double compte pour ce cas.
I = _t1_ _t2_ _t1_ _t3_
M * 2(N-2) * 1 * 1 => M * 2(N - 2) possibilities
Enfin, en mettant tout ça ensemble :

4) Mettre tout en place
Alors c'est tout. Travaillez à l'envers, en substituant ce que nous avons trouvé dans la somme originale donnée à l'étape 2. J'ai calculé la réponse à la question N = 4
le cas ci-dessous. Il correspond très bien au nombre empirique trouvé dans une autre réponse !
N = 4
M = 6 \_\_\_\_\_\_\_\_\_ \_\_\_\_\_\_\_\_\_\_\_\_\_ \_\_\_\_\_\_\_\_\_
| Pr(K\_i) | Pr(A | K\_i) | Product |
\_\_\_\_\_\_\_\_\_|\_\_\_\_\_\_\_\_\_|\_\_\_\_\_\_\_\_\_\_\_\_\_|\_\_\_\_\_\_\_\_\_|
| | | | |
| i = 0 | 0.316 | 120 / 1296 | 0.029 |
|\_\_\_\_\_\_\_\_\_|\_\_\_\_\_\_\_\_\_|\_\_\_\_\_\_\_\_\_\_\_\_\_|\_\_\_\_\_\_\_\_\_|
| | | | |
| i = 2 | 0.211 | 6 / 36 | 0.035 |
|\_\_\_\_\_\_\_\_\_|\_\_\_\_\_\_\_\_\_|\_\_\_\_\_\_\_\_\_\_\_\_\_|\_\_\_\_\_\_\_\_\_|
| | | | |
| i = 4 | 0.004 | 1 / 1 | 0.004 |
|\_\_\_\_\_\_\_\_\_|\_\_\_\_\_\_\_\_\_|\_\_\_\_\_\_\_\_\_\_\_\_\_|\_\_\_\_\_\_\_\_\_|
| | |
| Sum: | 0.068 |
|\_\_\_\_\_\_\_\_\_\_\_\_\_|\_\_\_\_\_\_\_\_\_|
Correctness
Ce serait cool s'il y avait un résultat dans la théorie des groupes à appliquer ici - et peut-être qu'il y en a un ! Cela permettrait certainement de faire disparaître complètement tout ce comptage fastidieux (et de raccourcir le problème en quelque chose de beaucoup plus élégant). J'ai arrêté de travailler à N = 4
. Pour N > 5
ce qui est donné ne donne qu'une approximation (à quel point, je n'en suis pas sûr). La raison en est assez claire si l'on y réfléchit : par exemple, étant donné que N = 8
transpositions, il existe clairement des moyens de créer l'identité avec cuatro des éléments uniques qui ne sont pas comptabilisés ci-dessus. Le nombre de façons devient apparemment plus difficile à compter à mesure que la permutation s'allonge (pour autant que je puisse le dire...).
Quoi qu'il en soit, je ne pourrais certainement pas faire quelque chose comme ça dans le cadre d'un entretien. J'irais jusqu'à l'étape du dénominateur si j'avais de la chance. Au-delà de ça, ça semble assez méchant.
9 votes
Pour un
N
et une graine fixe, la probabilité est soit0
o1
parce que ce n'est pas du tout aléatoire.1 votes
Est-ce la réponse qu'ils attendent ? Ou veulent-ils une analyse mathématique supposant de "vraies" variables aléatoires ?
0 votes
@Mysticial : Je suis presque sûr que la graine n'est pas supposée être fixée...
0 votes
Ou peut-être voulaient-ils juste voir si vous étiez capable de penser différemment...
0 votes
@Aashish : Pouvez-vous supposer
N
est égale, juste pour des raisons de simplicité ? (Mais peut-être que cela n'aidera pas du tout, je ne suis pas sûr...)0 votes
@Mehrdad, Pourquoi même ? Est-ce que le fait de supposer que N est pair va nous aider à résoudre le problème ?
1 votes
Quelle est l'implémentation pour
swap()
? Cela pourrait être un exercice pour ne pas se fier aux noms pour leur valeur nominale.0 votes
Postez votre idée sur le N pair. Nous la généraliserons.
1 votes
(Je travaille sur l'idée, je la posterai ici si j'ai quelque chose d'utile.) Au fait, vous pouvez regarder sur Fisher-Yates Je pense que c'est ce qu'ils ont essayé d'obtenir, c'est-à-dire qu'ils ne s'attendaient pas à ce que vous obteniez la probabilité exacte, mais que vous reconnaissiez le fait qu'il s'agit d'un algorithme de brassage biaisé.
0 votes
Ici, à chaque fois, les numéros sont générés de 0 à N-1. Le mélange de Fischer Yates est différent.
0 votes
@Aashish : Je connaître Fisher-Yates est différent, c'est exactement pourquoi je l'ai mentionné ! "Ils ne s'attendaient peut-être pas à ce que vous obteniez la probabilité exacte, mais à ce que vous reconnaissiez le fait qu'il s'agit d'un algorithme de brassage biaisé."
1 votes
Ils posent cette question parce qu'ils ne veulent pas cette chose de se reproduire.
0 votes
Je veux savoir ce que le fait de connaître cette réponse a à voir avec le travail pour lequel vous avez postulé.
25 votes
S'il s'agit bien d'un programme C (comme le suggèrent les balises), la probabilité est de 1. Les éléments du tableau sont passés par valeur (il n'y a pas de passage par référence en C), donc la fonction
swap
ne peut pas modifier le contenu deA
. \edit : Eh bien,swap
pourrait être une macro aussi bien espérons que ce n'est pas le cas :)13 votes
@reima : c'est peut-être une macro.
1 votes
@reima : écrire une fonction C avec le prototype "swap(int, int)" est un mauvais style de codage puisqu'une telle fonction ne peut pas faire ce que l'on attend de son nom. Nous pouvons donc multiplier la probabilité que le tableau change par la probabilité d'avoir une macro ici (qui est quelque chose comme 99% :)
0 votes
@Aashish, le fait que N soit pair ou impair est important, non ? Disons que N est pair = 4 . Si vous m=1, n=3 pour i=0, il devrait y avoir un n=1, m=3 dans l'un des i=1,2,3. ce qui implique que vous voulez que N soit pair pour cette connexion, Si N est impair, vous devez ajouter la probabilité que pour i=k, k étant 0 à N-1, m=n, le reste de la logique étant la même que pour N est pair.
0 votes
Est-ce que nous supposons que
rand()
est censé être une distribution uniforme ? Est-elle mise en œuvre en utilisant%
et ne souffre-t-il pas d'un léger biais en faveur des petits nombres ?0 votes
Je pense que nous avons supposé que rand() choisissait chaque nombre avec une probabilité uniforme.
1 votes
Je pense que les réponses sont trop éloignées d'une solution analytique même pour le cas uniforme, donc je préfère ne pas être trop fantaisiste.
0 votes
J'ai enlevé le tag c parce qu'il n'y a absolument rien dans le problème lui-même qui dit que ça doit être en C.
0 votes
@BurhanKhalid voir ma réponse, répondre à cette question montre que le candidat est capable de pensez à .
4 votes
Pensez à demander sur math.stackexchange.com. Une reformulation : étant donné a_i, b_i aléatoires, quelle est la probabilité que la permutation (a_1 b_1) (a_2 b_2) ... (a_n b_n) = identité dans le groupe symétrique S_n ?
1 votes
Vous pourriez trouver cela intéressant : code.google.com/codejam/contest/dashboard?c=975485#s=a&a=3
1 votes
Tout d'abord, il faut se demander ce que signifie "rester le même". Le calcul le plus simple concerne le cas où aucune modification n'est apportée à aucun moment. Cela devient plus compliqué si l'on se soucie uniquement de savoir si le tableau est dans le même ordre à la fin qu'au début,
11 votes
Euh... personne n'a relevé le fait que A n'est JAMAIS INITIALISÉ ?
0 votes
@KenBeckett C'est exactement ce que je pensais, en supposant qu'il ne s'agit pas simplement d'un code simplifié.
0 votes
Je n'ai pas le temps de l'analyser pour le moment, mais cela pourrait-il être résolu par Induction mathématique sur N ?