วิธีการเข้าหา Vertical Sticks ที่ท้าทาย


23

ปัญหานี้มาจากinterviewstreet.com

เราจะได้รับอาร์เรย์ของจำนวนเต็มY={y1,...,yn}ที่แสดงถึงnกลุ่มสายดังกล่าวที่จุดปลายของส่วนiเป็น(i,0)และ(i,yi) ) ลองจินตนาการว่าจากด้านบนของแต่ละส่วนรังสีแนวนอนจะถูกยิงไปทางซ้ายและรังสีนี้จะหยุดเมื่อสัมผัสกับส่วนอื่นหรือกระทบกับแกน y เราสร้างอาร์เรย์ของจำนวนเต็ม n เป็นv1,...,vnที่viเท่ากับความยาวของการยิงเรย์จากด้านบนของส่วนที่ฉันiเรากำหนดV(y1,...,yn)=v1+...+vn n

ตัวอย่างเช่นถ้าเรามี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)?

ถ้าเราแก้ปัญหานี้โดยใช้วิธีการที่ไร้เดียงสามันจะไม่เป็นที่มีประสิทธิภาพและทำงานจริงตลอดไปสำหรับn=50 50 ฉันเชื่อว่าเราสามารถแก้ไขปัญหานี้ได้โดยการคำนวณค่าviสำหรับแต่ละคันอย่างอิสระ แต่ฉันยังต้องรู้ว่ามีวิธีอื่นที่มีประสิทธิภาพสำหรับปัญหานี้ บนพื้นฐานของสิ่งที่เราสามารถคำนวณค่าที่คาดหวังสำหรับแต่ละคันเป็นอิสระ?


คุณสามารถใช้เส้นตรงของความคาดหวัง คำถามนี้น่าจะเหมาะสมกว่าที่ math.SE

คำตอบ:


23

ลองจินตนาการถึงปัญหาที่แตกต่างกัน: ถ้าคุณมีไปยังสถานที่แท่งของความสูงเท่ากันในnช่องแล้วระยะทางที่คาดว่าระหว่างแท่ง (และระยะทางที่คาดว่าระหว่างติดครั้งแรกและช่องเสียบประมาณ0และระยะทางที่คาดว่าระหว่างติดที่ผ่านมาและสัญญา slot n + 1 ) คือn + 1kn0n+1เนื่องจากมีk+1ช่องว่างให้พอดีกับความยาวn+1n+1k+1k+1n+1

เมื่อย้อนกลับไปที่ปัญหานี้แท่งไม้หนึ่งด้ามสนใจว่าแท่งไม้กี่อัน (รวมทั้งตัวมันเอง) จะสูงหรือสูงกว่า หากจำนวนนี้คือแสดงว่าช่องว่างที่คาดไว้ทางซ้ายคือ n + 1k 1n+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]15.2596+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)
M. Alaggan

ในกรณีแรกของฉันที่มีความสูงเท่ากันมีความยาวn + 1ที่จะเต็มไปด้วยk + 1ช่องว่างดังนั้นช่องว่างเฉลี่ยมาจากการหารทีละอัน นี่คือช่องว่างที่คาดหวัง (หรือรังสีแนวนอน) ก่อนไม้ใด ๆ ที่เฉพาะเจาะจง (และจากแท่งสุดท้ายถึงn + 1 ) มันโอนไปยังคำถามเดิมโดยคำนึงถึงไม้ที่สูงหรือสูงกว่าไม้ใด ๆ โดยเฉพาะ kn+1k+1n+1
Henry

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}.)

Then for any index j, we have vj=i=1jXij (Do you see why?) and therefore

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]++;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.