Як підійти до виклику вертикальних паличок


23

Ця проблема взята з інтерв'юstrestreet.com

Нам дано масив цілих чисел Y={y1,...,yn} що представляє n сегментів рядка таким, що кінцевими точками сегмента i є (i,0) та (i,yi) . Уявіть, що зверху кожного сегмента горизонтальний промінь знімається зліва, і цей промінь зупиняється, коли він торкається іншого сегмента або потрапляє на вісь y. Побудуємо масив з цілих чисел п, v1,...,vn , дедорівнює довжині вистріленого променя вгорі відрізкаvii . ВизначимоV(y1,...,yn)=v1+...+vn .

Наприклад, якщо ми маємо Y=[3,2,5,3,3,4,1,2] , то [v1,...,v8]=[1,1,3,1,1,3,1,2] , як показано на малюнку нижче:

введіть тут опис зображення

Для кожної перестановки p з [1,...,n] , ми можемо обчислити V(yp1,...,ypn) . Якщо ми виберемо рівномірно випадкову перестановку p з [1,...,n] , то, що очікуване значення V(yp1,...,ypn)?

Якщо ми вирішимо цю проблему за допомогою наївного підходу, вона не буде ефективною і працюватиме назавжди протягом . Я вважаю, що ми можемо підійти до цієї проблеми, незалежно обчисливши очікувану величину v i для кожної палички, але мені все одно потрібно знати, чим існує інший ефективний підхід до цієї проблеми. На основі якої можна самостійно обчислити очікувану величину для кожної палички?n=50vi


Можна використовувати лінійність очікування. Це питання, ймовірно, більш доречне на math.SE

Відповіді:


23

Уявіть собі іншу проблему: якщо вам довелося розміщувати палиць однакової висоти в n прорізах, тоді очікувана відстань між палицями (і очікувана відстань між першою палицею та умовним прорізом 0 , і очікувана відстань між останньою палицею та умовною проріз n + 1 ) дорівнює n + 1kn0n+1 оскільки єk+1прогалини для розміщення довжиниn+1.n+1k+1k+1n+1

Повертаючись до цієї проблеми, конкретну паличку цікавить, скільки паличок (включаючи і саму) на висоту чи вище. Якщо це число , то очікуваний проміжок ліворуч також n + 1k .n+1k+1

Тож алгоритм - просто знайти це значення для кожної палички і скласти очікування. Наприклад, починаючи з висот , кількість палиць з більшою або рівною висотою становить [ 5 , 7 , 1 , 5 , 5 , 2 , 8 , 7 ], тож очікування 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

Це легко запрограмувати: наприклад, один рядок у R

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

дає значення у вибірі вибірки у вихідній задачі

> 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
Дуже цікаво. Чи можете ви трохи розібратися, чому очікувана відстань між палицями дорівнює ; як не зрозуміло (принаймні мені), як це було обчислено. Дякую. (n+1)/(k+1)
М. Алагон

У моєму першому випадку палиць однакової висоти, довжина n + 1 повинна бути заповнена пробілами k + 1, тому середній проміжок походить від ділення одна на іншу. Це очікуваний проміжок (або горизонтальний промінь) перед будь-якою конкретною палицею (і від останньої палиці до n + 1 ). Він переходить до оригінального питання, беручи до уваги палички, які є настільки ж високими або вищими, ніж будь-яка конкретна палиця. kn+1k+1n+1
Генрі

Very nice. This completely subsumes my solution; if all heights are distinct, then E[V]=k=1nn+1k+1=(n+1)(Hn+11)=(n+1)Hnn.
JeffE

2
@Henry: For the k sticks equal height, n slots problem, what was your reasoning for average length = (n + 1) / (k + 1)? If I have k sticks and I want to know the average ray length of one of those sticks in every permutation of those k sticks in n slots, it does in fact equal your result, but I don't understand why. Is there logic or did you deduce it mathematically from doing what I described for 1 stick and n slots, then 2 sticks and n, slots, ... k sticks, n slots, and noticing that it equaled (n + 1) / (k + 1)? You mention adding an n + 1 slot. That seems very counter-intuitive.
Alexandre

3
It is a question I have dealt with before. Start with a round table with n+1 seats and k+1 people and seat them at random. Distances between individuals are obviously i.i.d. with mean (n+1)/(k+1). Now break the table at the n+1th person, remove that person and their seat, and straighten the table. Now you have the question here with n seats and k people but the same i.i.d. property and same mean. (Spot the rare rhyme for month)
Henry

11

Henry's solution is both simpler and more general than this one!


E[V] is roughly half the expected number of comparisons performed by randomized quicksort.

Assuming the sticks have distinct heights, we can derive a closed-form solution for E[Y] as follows.

For any indices ij, let Xij=1 if Yj=max{Yi,...,Yj} and Xij=0 otherwise. (If the elements of Y are not distinct, then Xij=1 means that Yj is strictly greater than every element of {Yi,,Yj1}

jvj=i=1jXij

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

Linearity of expectation immediately implies that

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

Because Xij is either 0 or 1, we have E[Xij]=Pr[Xij=1].

Finally—and this is the important bit—because the values in Y are distinct and permuted uniformly, each element of the subset {Yi,...,Yj} is equally likely to be the largest element in that subset. Thus, Pr[Xij=1]=1ji+1. (If the elements of Y are not distinct, we still have Pr[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]++;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.