Come affrontare la sfida dei bastoncini verticali


23

Questo problema è stato preso da intervistastreet.com

Ci viene data una matrice di numeri interi che rappresenta segmenti di linea in modo tale che gli endpoint del segmento siano e . Immagina che dalla cima di ogni segmento un raggio orizzontale sia sparato a sinistra, e questo raggio si ferma quando tocca un altro segmento o colpisce l'asse y. Costruiamo una matrice di n numeri interi, , dove è uguale alla lunghezza del raggio di raggio dalla parte superiore del segmento . Definiamo .Y={y1,...,yn}ni(i,0)(i,yi)v1,...,vnviiV(y1,...,yn)=v1+...+vn

Ad esempio, se abbiamo Y=[3,2,5,3,3,4,1,2] , quindi [v1,...,v8]=[1,1,3,1,1,3,1,2] , come mostrato nell'immagine seguente:

inserisci qui la descrizione dell'immagine

Per ogni permutazione di , possiamo calcolare . Se scegliamo una permutazione uniformemente casuale di , qual è il valore atteso di ?p[1,...,n]V(yp1,...,ypn)p[1,...,n]V(yp1,...,ypn)

Se risolviamo questo problema usando l'approccio ingenuo, non sarà efficiente e funzionerà praticamente per sempre per . Credo che possiamo affrontare questo problema calcolando in modo indipendente il valore atteso di per ogni stick, ma devo ancora sapere se esiste un altro approccio efficace per questo problema. Su quale base possiamo calcolare il valore atteso per ogni stick in modo indipendente?n=50vi


È possibile utilizzare la linearità delle aspettative. Questa domanda è probabilmente più appropriata su math.SE

Risposte:


23

Immagina un problema diverso: se dovessi posizionare stick di uguale altezza in n slot allora la distanza prevista tra stick (e la distanza prevista tra il primo stick e uno slot nozionale 0 e la distanza prevista tra l'ultimo stick e un nozionale slot n + 1 ) è n + 1kn0n+1 poiché ci sonok+1spazi vuoti per adattarsi a una lunghezzan+1.n+1k+1k+1n+1

Tornando a questo problema, un particolare stick è interessato a quanti stick (incluso se stesso) sono più alti o più alti. Se questo numero è , anche il divario previsto alla sua sinistra è n + 1k .n+1k+1

Quindi l'algoritmo è semplicemente quello di trovare questo valore per ogni stick e sommare le aspettative. Ad esempio, a partire da altezze di , il numero di stick con un'altezza maggiore o uguale è [ 5 , 7 , 1 , 5 , 5 , 2 , 8 , 7 ] quindi l'aspettativa è 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

Questo è facile da programmare: ad esempio una singola riga in R

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

fornisce i valori nell'output di esempio nel problema originale

> 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
Molto interessante. Puoi gentilmente elaborare un po 'il motivo per cui la distanza prevista tra le levette è ; in quanto non è chiaro (almeno per me) come è stato calcolato. Grazie. (n+1)/(k+1)
M. Alaggan,

Nel mio primo caso di stick di uguale altezza, c'è una lunghezza n + 1 da riempire con k + 1 spazi vuoti in modo che lo spazio medio provenga dalla divisione dell'uno dall'altro. Questo è lo spazio atteso (o raggio orizzontale) prima di ogni particolare stick (e dall'ultimo stick a n + 1 ). Passa alla domanda originale, tenendo conto dei bastoncini che sono più alti o più alti di qualsiasi bastoncino particolare. kn+1k+1n+1
Henry,

Molto bella. Questo completa completamente la mia soluzione; se tutte le altezze sono distinte, allora . E[V]=k=1nn+1k+1=(n+1)(Hn+11)=(n+1)Hnn
JeffE,

2
@Henry: per k stick di uguale altezza, n problema di slot, qual è stato il tuo ragionamento per la lunghezza media = (n + 1) / (k + 1)? Se ho k stick e voglio conoscere la lunghezza media del raggio di uno di quegli stick in ogni permutazione di quegli stick k in n slot, in realtà equivale al tuo risultato, ma non capisco perché. C'è una logica o l'hai dedotta matematicamente dal fare ciò che ho descritto per 1 stick e n slot, quindi 2 stick e n, slot, ... k stick, n slot e notando che era uguale (n + 1) / ( k + 1)? Hai menzionato l'aggiunta di uno slot n + 1. Sembra molto controintuitivo.
Alexandre,

3
È una domanda che ho affrontato prima. Inizia con una tavola rotonda con posti e k + 1 persone e posizionali a caso. Le distanze tra gli individui sono ovviamente identificate con la media ( n + 1 ) / ( k + 1 ) . Ora rompere il tavolo al n + 1 ° persona, rimuovere quella persona e la loro sede, e raddrizzare la tavola. Ora hai la domanda qui con n posti e k persone ma la stessa proprietà iid e la stessa media. (Trova la rima rara per mese )n+1k+1(n+1)/(k+1)n+1thnk
Henry,

11

La soluzione di Henry è sia più semplice che più generale di questa!


è circa la metà del numero previsto di confronti effettuati da quicksort randomizzato.E[V]

Supponendo che i bastoncini abbiano altezze distinte , possiamo ricavare una soluzione a forma chiusa per come segue.E[Y]

Per qualsiasi indice , lasciate X i j = 1 se Y j = max { Y i , . . . , Y j } e X i j = 0 altrimenti. (Se gli elementi di Y non sono distinti, allora X i j = 1 significa che Y j è strettamente maggiore di ogni elemento di { Y iijXij=1Yj=max{Yi,...,Yj}Xij=0YXij=1Yj .){Yi,,Yj1}

Quindi per ogni indice , abbiamo v j = j i = 1 X i j (vedi perché?) E quindi 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 linearità di aspettativa implica immediatamente che

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

Poiché è 0 o 1 , abbiamo E [ X i j ] = Pr [ X i j = 1 ] .Xij01E[Xij]=Pr[Xij=1]

Infine, e questo è il bit importante perché i valori di sono distinti e permutato uniforme, ciascun elemento del sottoinsieme { Y i , . . . , Y j } è altrettanto probabile che sia l' elemento più grande in quel sottoinsieme. Pertanto, Pr [ X i j = 1 ] = 1Y{Yi,...,Yj} . (Se gli elementi diYnon sono distinti, abbiamo ancoraPr[Xij=1]1Pr[Xij=1]=1ji+1Y )Pr[Xij=1]1ji+1

E ora abbiamo solo un po 'di matematica. doveHnindica ilnesimonumero armonico.

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

Ora dovrebbe essere banale calcolare (fino alla precisione in virgola mobile) in O ( n ) tempo.E[V]O(n)


Questo presuppone che i bastoncini abbiano un'altezza distinta?
Aryabhata,

Sì, assume altezze distinte. (Apparentemente, ho letto male la domanda.) L'equivalenza con quicksort randomizzato rimane valida quando ci sono legami, ma non la soluzione a forma chiusa.
JeffE,

4

Come menzionato nei commenti, è possibile utilizzare Linearity of Expectation.

yy1y2yn

yivi=E[vi]

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

E[vi]yij

j1yi

j1<yij2yi

E[vi]

Probabilmente puoi renderlo più veloce facendo effettivamente la matematica e ottenendo una formula (non l'ho provato io stesso).

Spero che sia d'aiuto.


3

Espandendo la risposta di @Aryabhata:

iyijyiZ(i)zk(i)ykyizk(i)

Z(i)YZ(i)zi(i)j

vizi(i)E(vi)j1Z(i)zi(i)j {1,,n}

Una volta calcolato (lungo queste linee ), possiamo seguire le linee della risposta di @ Aryabhata.


-2

Non capisco davvero cosa pretendi, dai tag sembra che tu stia cercando un algoritmo.

in tal caso, qual è la complessità temporale prevista? dicendo: "Se risolviamo questo problema usando l'approccio ingenuo, non sarà efficiente e funzionerà praticamente per sempre per n = 50". mi sembra che il tuo approccio ingenuo lo risolva in tempo esponenziale.

ho in mente un algoritmo O (n ^ 2).

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]++;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.