Masalah ini diambil dari interviewstreet.com
Kita diberi sebuah array bilangan bulat yang mewakili segmen garis sedemikian rupa sehingga titik akhir segmen adalah dan . 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, , di mana sama dengan panjang tembakan ray dari bagian atas segmen . Kami mendefinisikan .
Sebagai contoh, jika kita memiliki , kemudian , seperti yang ditunjukkan pada gambar di bawah ini:
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 p?
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?
sumber
Jawaban:
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 + 1k n 0 n+1 karena adak+1celah agar sesuai dengan panjangnyan+1.n+1k+1 k+1 n+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
memberikan nilai dalam output sampel dalam masalah aslinya
sumber
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 ii≤j Xij=1 Yj=max{Yi,...,Yj} Xij=0 Y Xij=1 Yj .){Yi,…,Yj−1}
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 .j vj=∑ji=1Xij
sumber
Seperti yang disebutkan dalam komentar, Anda dapat menggunakan Linearity of Expectation.
Anda mungkin dapat membuatnya lebih cepat dengan benar-benar melakukan matematika dan mendapatkan formula (meskipun saya belum mencobanya sendiri).
Semoga itu bisa membantu.
sumber
Memperluas jawaban @Aryabhata:
Setelah ini dihitung (di sepanjang baris ini ), kita dapat mengikuti baris jawaban @ Aryabhata.
sumber
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.
sumber