Comment aborder le défi Vertical Sticks

23

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 .Y={y1,...,yn}ni(i,0)(i,yi)v1,...,vnviiV(y1,...,yn)=v1+...+vn

Par exemple, si nous avons , alors , comme indiqué dans l'image ci-dessous:Y=[3,2,5,3,3,4,1,2][v1,...,v8]=[1,1,3,1,1,3,1,2]

entrez la description de l'image ici

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 )p[1,...,n]V(yp1,...,ypn)p[1,...,n]V(yp1,...,ypn)

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 in=50vi

Raphael
la source
Vous pouvez utiliser la linéarité de l'attente. Cette question est probablement plus appropriée en mathématiques.SE

Réponses:

23

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 + 1kn0n+1 car il y ak+1espaces pour s'adapter à une longueurn+1.n+1k+1k+1n+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

V <- function(Y){ (length(Y) + 1) * sum( 1 / (rowSums(outer(Y, Y, "<=")) + 1) ) }

donne les valeurs dans l' exemple de sortie dans le problème d'origine

> V(c(1,2,3))
[1] 4.333333
> V(c(3,3,3))
[1] 3
> V(c(2,2,3))
[1] 4
> V(c(10,2,4,4))
[1] 6
> V(c(10,10,10,5,10))
[1] 5.8
> V(c(1,2,3,4,5,6))
[1] 11.15
Henri
la source
1
Très intéressant. Pouvez-vous nous expliquer un peu pourquoi la distance attendue entre les bâtons est ; car il n'est pas clair (du moins pour moi) comment il a été calculé. Merci. (n+1)/(k+1)
M. Alaggan
Dans mon premier cas de bâtons de hauteur égale, il y a une longueur n + 1 à remplir avec k + 1 espaces de sorte que l'écart moyen provient de la division l'un par l'autre. Il s'agit de l'écart attendu (ou rayon horizontal) avant un bâton particulier (et du dernier bâton à n + 1 ). Il revient à la question d'origine, en tenant compte des bâtons qui sont aussi hauts ou plus élevés que n'importe quel bâton particulier. kn+1k+1n+1
Henry
Très agréable. Cela résume complètement ma solution; si toutes les hauteurs sont distinctes, alors . E[V]=k=1nn+1k+1=(n+1)(Hn+11)=(n+1)Hnn
JeffE
2
@Henry: Pour les k bâtons de hauteur égale, problème de n fentes, quel était votre raisonnement pour la longueur moyenne = (n + 1) / (k + 1)? Si j'ai k sticks et que je veux connaître la longueur de rayon moyenne de l'un de ces sticks dans chaque permutation de ces k sticks dans n emplacements, cela équivaut en fait à votre résultat, mais je ne comprends pas pourquoi. Y a-t-il une logique ou l'avez-vous déduit mathématiquement de faire ce que j'ai décrit pour 1 bâton et n emplacements, puis 2 bâtons et n, emplacements, ... k bâtons, n emplacements, et en remarquant que cela égalait (n + 1) / ( k + 1)? Vous mentionnez l'ajout d'un emplacement n + 1. Cela semble très contre-intuitif.
Alexandre
3
C'est une question que j'ai déjà traitée. Commencez par une table ronde avec sièges et k + 1 personnes et assoyez-les au hasard. Les distances entre les individus sont évidemment iid avec la moyenne ( n + 1 ) / ( k + 1 ) . Maintenant, cassez la table à la n + 1 e personne, retirez cette personne et son siège, et redressez la table. Maintenant, vous avez la question ici avec n sièges et k personnes, mais la même propriété iid et la même moyenne. (Repérez la rime rare du mois )n+1k+1(n+1)/(k+1)n+1thnk
Henry
11

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]

ijXij=1X i j = 0 Y X i j = 1 Y j { Y i , , Y j - 1 }Yj=max{Yi,...,Yj}Xij=0YXij=1Yj{Yi,,Yj1}

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 .jvj=i=1jXij

V=j=1nvj=j=1ni=1jXij.

La linéarité de l'attente implique immédiatement que

E[V]=E[1ijnXij]=1ijnE[Xij].

Parce que vaut ou , nous avons . 0 1 E [ X i j ] = Pr [ X i j = 1 ]Xij01E[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]=1ji+1YPr[Xij=1]1ji+1

Et maintenant, nous avons juste quelques calculs. où désigne le ème nombre harmonique .

E[V]=j=1ni=1jE[Xij][linearity]=j=1ni=1j1ji+1[uniformity]=j=1nh=1j1h[h=ji+1]=h=1nj=hn1h[1hjn]=h=1nnh+1h=((n+1)h=1n1h)(h=1n1)=(n+1)Hnn
Hnn

Maintenant, il devrait être trivial de calculer (jusqu'à la précision en virgule flottante) en temps .E[V]O(n)

JeffE
la source
Cela suppose-t-il que les bâtons sont de hauteur distincte?
Aryabhata
Oui, il prend des hauteurs distinctes. (Apparemment, j'ai mal lu la question.) L'équivalence avec le tri rapide aléatoire existe toujours lorsqu'il y a des liens, mais pas la solution de forme fermée.
JeffE
4

Comme mentionné dans les commentaires, vous pouvez utiliser la linéarité des attentes.

Triez le : .yy1y2yn

Pour chaque considérons la valeur attendue de .yivi=E[vi]

AlorsE[i=1nvi]=i=1nE[vi]

Une façon simple et naïve de calculer serait tout d'abord de fixer une position pour . Dis .E[vi]yij

Calculez maintenant la probabilité qu'à la position vous ayez une valeur .j1yi

Alors la probabilité qu'à vous ayez une valeur et à vous ayez une valeurj1<yij2yi

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é.

Aryabhata
la source
3

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.iyijyiZ(i)zk(i)ykyizk(i)

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)YZ(i)zi(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 .vizi(i)E(vi)j1Z(i)zi(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.

M. Alaggan
la source
-2

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.

assume int y[n], v[n] where v[i] initialized with 1; as described in the question
for (i=1;i<n;i++) 
   for ( j=i-1 ; j>=0 && y[j]<y[i] ; j--) v[i]++;

la source