Cara mendekati tantangan Tongkat Vertikal

23

Masalah ini diambil dari interviewstreet.com

Kita diberi sebuah array bilangan bulat Y={y1,...,yn} yang mewakili n segmen garis sedemikian rupa sehingga titik akhir segmen i adalah (i,0) dan (i,yi) . Bayangkan bahwa dari atas setiap segmen sinar horizontal ditembak ke kiri, dan sinar ini berhenti ketika menyentuh segmen lain atau menyentuh sumbu y. Kami membangun sebuah array dari n bilangan bulat, v1,...,vn , di manavi sama dengan panjang tembakan ray dari bagian atas segmeni . Kami mendefinisikanV(y1,...,yn)=v1+...+vn .

Sebagai contoh, jika kita memiliki Y=[3,2,5,3,3,4,1,2] , kemudian [v1,...,v8]=[1,1,3,1,1,3,1,2] , seperti yang ditunjukkan pada gambar di bawah ini:

masukkan deskripsi gambar di sini

Untuk setiap permutasi dari [ 1 , . . . , N ] , kita dapat menghitung V ( y p 1 , . . . , Y p n ) . Jika kita memilih permutasi seragam acak p dari [ 1 , . . . , N ] , apa nilai yang diharapkan dari V ( y p 1 , . . . , Y pp[1,...,n]V(yp1,...,ypn)p[1,...,n]?V(yp1,...,ypn)

Jika kita memecahkan masalah ini menggunakan pendekatan naif itu tidak akan efisien dan berjalan praktis selamanya untuk . Saya percaya kita bisa mendekati masalah ini dengan menghitung dengan bebas nilai yang diharapkan dari v i untuk setiap tongkat, tetapi saya masih perlu tahu apakah ada pendekatan lain yang efisien untuk masalah ini. Atas dasar apa kita dapat menghitung nilai yang diharapkan untuk setiap batang secara mandiri?n=50vi

Raphael
sumber
Anda dapat menggunakan linearitas harapan. Pertanyaan ini mungkin lebih tepat di math.SE

Jawaban:

23

Bayangkan masalah yang berbeda: jika Anda harus menempatkan stick dengan ketinggian yang sama dalam n slot maka jarak yang diharapkan antara stick (dan jarak yang diharapkan antara stick pertama dan slot nosional 0 , dan jarak yang diharapkan antara tongkat terakhir dan notasi Slot n + 1 ) adalah n + 1kn0n+1 karena adak+1celah agar sesuai dengan panjangnyan+1.n+1k+1k+1n+1

Kembali ke masalah ini, batang tertentu tertarik pada berapa banyak batang (termasuk dirinya sendiri) setinggi atau lebih tinggi. Jika angka ini , maka kesenjangan diharapkan kiri juga n + 1k .n+1k+1

Jadi algoritma ini hanya untuk menemukan nilai ini untuk setiap tongkat dan menjumlahkan harapan. Misalnya, dimulai dengan ketinggian , jumlah batang dengan tinggi yang lebih besar atau sama adalah [ 5 , 7 , 1 , 5 , 5 , 2 , 8 , 7 ] jadi harapannya adalah 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

Ini mudah diprogram: misalnya satu baris dalam R

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

memberikan nilai dalam output sampel dalam masalah aslinya

> 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
Henry
sumber
1
Sangat menarik. Dapat Anda ramah menjelaskan sedikit tentang mengapa jarak diharapkan antara tongkat adalah ; karena tidak jelas (setidaknya bagi saya) bagaimana itu dihitung. Terima kasih. (n+1)/(k+1)
M. Alaggan
Dalam kasus pertama saya dari sama dengan tinggi tongkat, ada panjang n + 1 untuk diisi dengan celah k + 1 sehingga celah rata-rata berasal dari membagi satu dengan yang lain. Ini adalah kesenjangan diharapkan (atau sinar horizontal) sebelum tongkat tertentu (dan dari tongkat terakhir untuk n + 1 ). Ini transfer ke pertanyaan awal, dengan mempertimbangkan tongkat yang setinggi atau lebih tinggi dari tongkat tertentu. kn+1k+1n+1
Henry
Sangat bagus. Ini sepenuhnya melengkapi solusi saya; jika semua ketinggian berbeda, maka . E[V]=k=1nn+1k+1=(n+1)(Hn+11)=(n+1)Hnn
JeffE
2
@ Henry: Untuk k stick sama dengan tinggi, masalah n slot, apa alasan Anda untuk panjang rata-rata = (n +1) / (k +1)? Jika saya memiliki k stick dan saya ingin tahu panjang sinar rata-rata dari salah satu stick itu di setiap permutasi dari k stick di n slot, itu sebenarnya sama dengan hasil Anda, tetapi saya tidak mengerti mengapa. Apakah ada logika atau apakah Anda menyimpulkan secara matematis dari melakukan apa yang saya jelaskan untuk 1 stick dan n slot, kemudian 2 stick dan n, slot, ... k stick, n slot, dan memperhatikan bahwa itu sama dengan (n +1) / ( k +1)? Anda menyebutkan menambahkan slot n +1. Tampaknya sangat kontra-intuitif.
Alexandre
3
Ini adalah pertanyaan yang telah saya bahas sebelumnya. Mulailah dengan meja bundar dengan kursi dan k + 1 orang dan tempatkan mereka secara acak. Jarak antara individu jelas IID dengan mean ( n + 1 ) / ( k + 1 ) . Sekarang istirahat meja di n + 1 th orang, menghapus orang dan tempat duduk mereka, dan meluruskan meja. Sekarang Anda memiliki pertanyaan di sini dengan n kursi dan orang k tetapi properti iid yang sama dan rata-rata yang sama. (Tempatkan sajak langka untuk bulan )n+1k+1(n+1)/(k+1)n+1thnk
Henry
11

Solusi Henry lebih sederhana dan lebih umum daripada yang ini!


kira-kira setengah dari jumlah perbandingan yang diharapkan yang dilakukan oleh quicksort acak.E[V]

Dengan asumsi tongkat memiliki ketinggian yang berbeda , kita dapat memperoleh solusi bentuk-tertutup untuk sebagai berikut.E[Y]

Untuk setiap indeks , biarkan X i j = 1 jika Y j = max { Y i , . . . , Y j } dan X i j = 0 sebaliknya. (Jika unsur-unsur Y yang tidak berbeda, maka X i j = 1 berarti bahwa Y j adalah ketat lebih besar dari setiap elemen { Y iijXij=1Yj=max{Yi,...,Yj}Xij=0YXij=1Yj .){Yi,,Yj1}

Kemudian untuk setiap indeks , kita memiliki v j = Σ j i = 1 X i j (Apakah Anda melihat mengapa?) Dan karena itu V = n Σ j = 1 v j = n Σ j = 1 j Σ i = 1 X i j .jvj=i=1jXij

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

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

Xij01E[Xij]=Pr[Xij=1]

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

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

E[V]O(n)

JeffE
sumber
Apakah ini mengasumsikan bahwa tongkat memiliki ketinggian yang berbeda?
Aryabhata
Ya, itu memang mengasumsikan ketinggian yang berbeda. (Rupanya, saya salah membaca pertanyaan.) Kesetaraan dengan quicksort acak masih berdiri ketika ada ikatan, tetapi bukan solusi bentuk-tertutup.
JeffE
4

Seperti yang disebutkan dalam komentar, Anda dapat menggunakan Linearity of Expectation.

yy1y2yn

yivi=E[vi]

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

E[vi]yij

j1yi

j1<yij2yi

E[vi]

Anda mungkin dapat membuatnya lebih cepat dengan benar-benar melakukan matematika dan mendapatkan formula (meskipun saya belum mencobanya sendiri).

Semoga itu bisa membantu.

Aryabhata
sumber
3

Memperluas jawaban @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}

Setelah ini dihitung (di sepanjang baris ini ), kita dapat mengikuti baris jawaban @ Aryabhata.

M. Alaggan
sumber
-2

Saya benar-benar tidak mengerti apa yang Anda tuntut, dari tag tampaknya Anda mencari suatu algoritma.

jika demikian, apa kompleksitas waktu yang diharapkan? dengan mengatakan: "Jika kita memecahkan masalah ini menggunakan pendekatan naif itu tidak akan efisien dan berjalan praktis selamanya untuk n = 50." menurut saya pendekatan naif Anda menyelesaikannya dalam waktu yang eksponensial.

saya punya algoritma O (n ^ 2) dalam pikiran 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]++;

sumber