Question intéressante.
Je pense que la réponse est 1/N, mais je n'ai pas de preuve. Quand je trouverai une preuve, je modifierai ma réponse.
Ce que j'ai eu jusqu'à maintenant :
Si m == n, vous ne changerez pas le tableau. La probabilité d'obtenir m == n est de 1/N, car il y a N^2 possibilités, et seule N convient ((i,i) pour chaque 0 <= i <= N-1).
Ainsi, nous obtenons N/N^2 = 1/N.
Dénote Pk la probabilité qu'après k itérations de permutations, le tableau de taille N reste le même.
P1 = 1/N. (Comme nous l'avons vu ci-dessous)
P2 = (1/N) P1 + (N-1/N) (2/N^2) = 1/N^2 + 2(N-1) / N^3.
Explanation for P2:
We want to calculate the probability that after 2 iterations, the array with
N elements won't change. We have 2 options :
- in the 2 iteration we got m == n (Probability of 1/N)
- in the 2 iteration we got m != n (Probability of N-1/N)
If m == n, we need that the array will remain after the 1 iteration = P1.
If m != n, we need that in the 1 iteration to choose the same n and m
(order is not important). So we get 2/N^2.
Because those events are independent we get - P2 = (1/N)*P1 + (N-1/N)*(2/N^2).
Pk = (1/N)*Pk-1 + (N-1/N)*X. (la première pour m == n, la seconde pour m != n)
Je dois réfléchir davantage à ce que X représente. (X est juste un remplacement pour la formule réelle, pas une constante ou autre chose)
Example for N = 2.
All possible swaps:
(1 1 | 1 1),(1 1 | 1 2),(1 1 | 2 1),(1 1 | 2 2),(1 2 | 1 1),(1 2 | 1 2)
(1 2 | 2 1),(1 2 | 2 2),(2 1 | 1 1),(2 1 | 1 2),(2 1 | 2 1),(2 1 | 2 2)
(2 2 | 1 1),(2 2 | 1 2),(2 2 | 2 1),(2 1 | 1 1).
Total = 16. Exactly 8 of them remain the array the same.
Thus, for N = 2, the answer is 1/2.
EDIT : Je souhaite introduire une autre approche :
Nous pouvons classer les échanges en trois groupes : les échanges constructifs, les échanges destructeurs et les échanges inoffensifs.
L'échange constructif est défini comme un échange qui permet à au moins un élément de se déplacer à sa place.
Un échange destructif est défini comme un échange qui fait bouger au moins un élément de sa position correcte.
Un échange inoffensif est défini comme un échange qui n'appartient pas aux autres groupes.
Il est facile de voir qu'il s'agit d'une partition de tous les échanges possibles. (intersection = ensemble vide).
Maintenant, l'affirmation que je veux prouver :
The array will remain the same if and only if
the number of Destructive swap == Constructive swap in the iterations.
Si quelqu'un a un contre-exemple, veuillez le noter en commentaire.
Si cette affirmation est correcte, nous pouvons prendre toutes les combinaisons et les additionner - 0 échange inoffensif, 1 échange inoffensif, ,N échanges inoffensifs.
Et pour chaque échange inoffensif k possible, nous vérifions si N-k est pair, si non, nous sautons. Si oui, on prend (N-k)/2 pour destructeur, et (N-k) pour constructif. Et on regarde toutes les possibilités.
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 ?