Cómo abordar el desafío Vertical Sticks


23

Este problema está tomado de interviewstreet.com

Se nos da una matriz de enteros Y={y1,...,yn} que representa n segmentos de línea de modo que los puntos finales del segmento son ( i , 0 ) y ( i , y i ) . Imagine que desde la parte superior de cada segmento se dispara un rayo horizontal hacia la izquierda, y este rayo se detiene cuando toca otro segmento o golpea el eje y. Construimos un conjunto de n enteros, v 1 , . . . , vv i i V ( y 1 , . . . , Y n ) = v 1 + . . . + v ni(i,0)(i,yi)v1,...,vn , dondees igual a la longitud del disparo de rayos desde la parte superior del segmento. Definimos.viiV(y1,...,yn)=v1+...+vn

Por ejemplo, si tenemos , entonces , como se muestra en la imagen a continuación:Y=[3,2,5 5,3,3,4 4,1,2][v1,...,v8]=[1,1,3,1,1,3,1,2]

ingrese la descripción de la imagen aquí

Para cada permutación de , podemos calcular . Si elegimos una permutación uniformemente aleatoria de , ¿cuál es el valor esperado 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 resolvemos este problema usando el enfoque ingenuo, no será eficiente y se ejecutará prácticamente para siempre para . Creo que podemos abordar este problema calculando de forma independiente el valor esperado de para cada palo, pero aún necesito saber si existe otro enfoque eficiente para este problema. ¿Sobre qué base podemos calcular el valor esperado para cada barra de forma independiente?v in=50vi


Puede usar la linealidad de la expectativa. Esta pregunta es probablemente más apropiada en matemáticas

Respuestas:


23

Imagine un problema diferente: si tuviera que colocar palos de igual altura en n ranuras, entonces la distancia esperada entre los palos (y la distancia esperada entre el primer palo y una ranura nocional 0 , y la distancia esperada entre el último palo y un nocional ranura n + 1 ) es n + 1kn0n+1 ya que hayespacios dek+1para caber en una longitudn+1.n+1k+1k+1n+1

Volviendo a este problema, un palo en particular está interesado en cuántos palos (incluido él mismo) son tan altos o más altos. Si este número es , entonces la brecha esperada a su izquierda también es n + 1k .n+1k+1

Entonces, el algoritmo es simplemente encontrar este valor para cada palo y sumar las expectativas. Por ejemplo, comenzando con alturas de , el número de palos con una altura mayor o igual es [ 5 , 7 , 1 , 5 , 5 , 2 , 8 , 7 ] entonces la expectativa es 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

Esto es fácil de programar: por ejemplo, una sola línea en R

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

da los valores en la salida de muestra en el problema original

> 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

1
Muy interesante. ¿Puede explicar amablemente por qué la distancia esperada entre palos es ; ya que no está claro (al menos para mí) cómo se calculó. Gracias. (n+1)/(k+1)
M. Alaggan

En mi primer caso de palos de igual altura, hay una longitud n + 1 que debe rellenarse con k + 1 espacios, por lo que el espacio promedio proviene de dividir uno por el otro. Esta es la brecha esperada (o rayo horizontal) antes de cualquier barra en particular (y desde la última barra hasta n + 1 ). Se transfiere a la pregunta original, teniendo en cuenta palos que son tan altos o más altos que cualquier palo en particular. kn+1k+1n+1
Henry

Muy agradable. Esto subsume completamente mi solución; si todas las alturas son distintas, entonces . E[V]=k=1nn+1k+1=(n+1)(Hn+11)=(n+1)Hnn
JeffE

2
@Henry: Para el problema de k sticks de igual altura, n slots, ¿cuál fue su razonamiento para la longitud promedio = (n + 1) / (k + 1)? Si tengo k palos y quiero saber la longitud de rayo promedio de uno de esos palos en cada permutación de esos k palos en n ranuras, de hecho es igual a su resultado, pero no entiendo por qué. ¿Hay lógica o la dedujiste matemáticamente al hacer lo que describí para 1 stick yn slots, luego 2 sticks yn, slots, ... k sticks, n slots, y notar que era igual a (n + 1) / ( k + 1)? Menciona agregar una ranura n + 1. Eso parece muy contrario a la intuición.
Alexandre

3
Es una pregunta que he tratado antes. Comience con una mesa redonda con asientos yk + 1 personas y asiéntelos al azar. Las distancias entre individuos son obviamente iid con media ( n + 1 ) / ( k + 1 ) . Ahora romper la mesa en el n + 1 ª persona, eliminar esa persona y su asiento, y enderezar la tabla. Ahora tiene la pregunta aquí con n asientos yk personas pero la misma propiedad iid y la misma media. (Encuentra la rima rara por mes )n+1k+1(n+1)/(k+1)n+1thnk
Henry

11

¡La solución de Henry es más simple y más general que esta!


es aproximadamente la mitad del número esperado de comparaciones realizadas por el ordenamiento rápido aleatorio.E[V]

Suponiendo que los palos tienen alturas distintas , podemos derivar una solución de forma cerrada para siguiente manera.E[Y]

Para cualquier índice , dejar que X i j = 1 si Y j = max { Y i , . . . , Y j } y X i j = 0 de lo contrario. (Si los elementos de Y no son distintos, entonces X i j = 1 significa que Y j es estrictamente mayor que cada elemento de { Y iijXij=1Yj=max{Yi,...,Yj}Xij=0YXij=1Yj .){Yi,,Yj1}

Entonces, para cualquier índice , tenemos v j = j i = 1 X i j (¿Ves por qué?) Y por lo tanto 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 linealidad de la expectativa implica inmediatamente que

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

Como es 0 o 1 , tenemos E [ X i j ] = Pr [ X i j = 1 ] .Xij01E[Xij]=Pr[Xij=1]

Y{Yi,...,Yj}Pr[Xij=1]=1ji+1YPr[Xij=1]1ji+1.)

And now we just have some math.

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
where Hn denotes the nth harmonic number.

Now it should be trivial to compute E[V] (up to floating point precision) in O(n) time.


Does this assume that the sticks are of distinct height?
Aryabhata

Yes, it does assume distinct heights. (Apparently, I misread the question.) The equivalence with randomized quicksort still stands when there are ties, but not the closed-form solution.
JeffE

4

As mentioned in the comments, you can use Linearity of Expectation.

Sort the y: y1y2yn.

For each yi consider the expected value of vi=E[vi].

Then E[i=1nvi]=i=1nE[vi]

One straight-forward and naive way to compute E[vi] would be first fix a position for yi. Say j.

Now compute the probability that at position j1 you have a value yi.

Then the probability that at j1 you have a value <yi and at j2 you have a value yi

and so on which will allow you to compute E[vi].

You can probably make it faster by actually doing the math and getting a formula (I haven't tried it myself, though).

Hope that helps.


3

Expanding on the answer of @Aryabhata:

Fix an i, and assume the item yi is at position j. The exact value of the height is immaterial, what matters is whether the items are greater than or equal to yi or not. Therefore consider the set of items Z(i), where zk(i) is 1 if ykyi, and zk(i) is 0 otherwise.

A permutation on the set Z(i) induces an corresponding permutation on the set Y. Consider for instance the following permuation of the set Z(i): "01000(1)". The item zi(i) is the one is brackets, at position j, and the items denoted by "" don't matter.

The value of vi is then 1 plus the length of the run of consective zeros just to the left of zi(i). It follows that E(vi) is actually 1 plus the expected length of consecutive zeors, until the first "1" is met, if we pick at most j1 bits from the set Z(i)zi(i)(without replacement). This is reminiscent of the geometric distribution, except that it would be without replacement (and bounded number of draws). The expectation is to be taken on j as well, as a uniform choice on the set of positions {1,,n}.

Once this is computed (along these lines), we can follow the lines of @Aryabhata's answer.


-2

I dont really understand what do you demend, from tags it seems you are looking for an algorithm.

if so, what is the expected time complexity? by saying: "If we solve this problem using the naive approach it will not be efficient and run practically forever for n=50." it seems to me that your naive approach solves it in exponential time.

i do have a O(n^2) algorithm in mind tho.

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]++;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.