Ce problème est tiré de interviewstreet.com
On nous donne un tableau d'entiers qui représente segments de ligne tels que les extrémités du segment sont et . Imaginez que du haut de chaque segment un rayon horizontal soit tourné vers la gauche, et ce rayon s'arrête lorsqu'il touche un autre segment ou qu'il frappe l'axe des y. Nous construisons un tableau de n entiers, , où est égal à la longueur du rayon tiré depuis le haut du segment . On définit .
Par exemple, si nous avons , alors , comme indiqué dans l'image ci-dessous:
Pour chaque permutation de , on peut calculer . Si nous choisissons une permutation uniformément aléatoire de , quelle est la valeur attendue de ?[ 1 , . . . , N ] V ( y p 1 , . . . , Y p n ) p [ 1 , . . . , N ] V ( y p 1 , . . . , Y p n )
Si nous résolvons ce problème en utilisant l'approche naïve, il ne sera pas efficace et fonctionnera pratiquement indéfiniment pour . Je crois que nous pouvons aborder ce problème en calculant indépendamment la valeur attendue de pour chaque bâton, mais j'ai encore besoin de savoir s'il existe une autre approche efficace pour ce problème. Sur quelle base peut-on calculer la valeur attendue pour chaque bâton indépendamment?v i
la source
Réponses:
Imaginez un problème différent: si vous deviez placer bâtons de hauteurs égales dans n emplacements, la distance attendue entre les bâtons (et la distance attendue entre le premier bâton et un emplacement notionnel 0 , et la distance attendue entre le dernier bâton et un notionnel l'emplacement n + 1 ) est n + 1k n 0 n+1 car il y ak+1espaces pour s'adapter à une longueurn+1.n+1k+1 k+1 n+1
Pour en revenir à ce problème, un bâton particulier s'intéresse au nombre de bâtons (y compris lui-même) qui sont aussi élevés ou plus élevés. Si ce nombre est , alors l'écart attendu à sa gauche est également n + 1k .n+1k+1
Donc, l'algorithme consiste simplement à trouver cette valeur pour chaque bâton et à additionner l'attente. Par exemple, en commençant par des hauteurs de , le nombre de bâtons de hauteur supérieure ou égale est [ 5 , 7 , 1 , 5 , 5 , 2 , 8 , 7 ] donc l'espérance est de 9[3,2,5,3,3,4,1,2] [ 5 , 7 , 1 , 5 , 5 , 2 , 8 , 7 ] .96+ 98+ 92+ 96+ 96+ 93+ 99+ 98= 15,25
C'est facile à programmer: par exemple une seule ligne en R
donne les valeurs dans l' exemple de sortie dans le problème d'origine
la source
La solution d'Henry est à la fois plus simple et plus générale que celle-ci!
représente environ la moitié du nombre attendu de comparaisons effectuées par tri rapide aléatoire.E[V]
En supposant que les bâtons ont des hauteurs distinctes , nous pouvons dériver une solution de forme fermée pour comme suit.E[Y]
Alors pour tout indice , on a (voyez-vous pourquoi?) Et donc v j = ∑ j i = 1 X i j V = n ∑ j = 1 v j = n ∑ j = 1 j ∑ i = 1 X i j .j vj=∑ji=1Xij
La linéarité de l'attente implique immédiatement que
Parce que vaut ou , nous avons . 0 1 E [ X i j ] = Pr [ X i j = 1 ]Xij 0 1 E[Xij]=Pr[Xij=1]
Enfin - et c'est le bit important - parce que les valeurs de sont distinctes et permutées uniformément, chaque élément du sous-ensemble est également susceptible d'être le plus grand élément de ce sous-ensemble. Ainsi, . (Si les éléments de ne sont pas distincts, nous avons toujours .)Y {Yi,...,Yj} Pr[Xij=1]=1j−i+1 Y Pr[Xij=1]≤1j−i+1
Et maintenant, nous avons juste quelques calculs. où désigne le ème nombre harmonique .
Maintenant, il devrait être trivial de calculer (jusqu'à la précision en virgule flottante) en temps .E[V] O(n)
la source
Comme mentionné dans les commentaires, vous pouvez utiliser la linéarité des attentes.
Triez le : .y y1≤y2≤⋯≤yn
Pour chaque considérons la valeur attendue de .yi vi=E[vi]
AlorsE[∑ni=1vi]=∑ni=1E[vi]
Une façon simple et naïve de calculer serait tout d'abord de fixer une position pour . Dis .E[vi] yi j
Calculez maintenant la probabilité qu'à la position vous ayez une valeur .j−1 ≥yi
Alors la probabilité qu'à vous ayez une valeur et à vous ayez une valeurj−1 <yi j−2 ≥yi
et ainsi de suite qui vous permettra de calculer .E[vi]
Vous pouvez probablement l'accélérer en faisant le calcul et en obtenant une formule (je ne l'ai pas essayé moi-même, cependant).
J'espère que ça t'as aidé.
la source
Développant la réponse de @Aryabhata:
Fixez un et supposez que l'élément est à la position . La valeur exacte de la hauteur est sans importance, ce qui importe est de savoir si les éléments sont supérieurs ou égaux à ou non. Considérez donc l'ensemble des éléments , où vaut 1 si et vaut 0 sinon.i yi j yi Z(i) z(i)k yk≥yi z(i)k
Une permutation sur l'ensemble induit une permutation correspondante sur l'ensemble . Considérons par exemple la permutation suivante de l'ensemble : "01000 (1) ". L'élément est celui qui est entre parenthèses, à la position , et les éléments indiqués par " " n'ont pas d'importance.Z(i) Y Z(i) … z(i)i j …
La valeur de est alors 1 plus la longueur de la série de zéros conspectifs juste à gauche de . Il s'ensuit que est en fait 1 plus la longueur attendue des zeors consécutifs, jusqu'à ce que le premier "1" soit atteint, si nous prenons au plus bits dans l'ensemble (sans remplacement). Cela rappelle la distribution géométrique, sauf qu'elle serait sans remplacement (et nombre limité de tirages). L'attente est à prendre sur ainsi , comme un choix uniforme sur l'ensemble des positions .vi z(i)i E(vi) j−1 Z(i)∖z(i)i { 1 , … , n }j {1,…,n}
Une fois que cela est calculé (le long de ces lignes ), nous pouvons suivre les lignes de la réponse de @ Aryabhata.
la source
Je ne comprends pas vraiment ce que vous attendez, des balises, il semble que vous cherchiez un algorithme.
si oui, quelle est la complexité temporelle attendue? en disant: "Si nous résolvons ce problème en utilisant l'approche naïve, il ne sera pas efficace et fonctionnera pratiquement indéfiniment pour n = 50". il me semble que votre approche naïve le résout en temps exponentiel.
j'ai un algorithme O (n ^ 2) à l'esprit.
la source