Jumlah swap yang diharapkan dalam jenis gelembung

14

Diberikan array dari bilangan bulat N , setiap elemen dalam array dapat ditingkatkan dengan angka tetap b dengan beberapa probabilitas p [ i ] , 0 i < n . Saya harus menemukan jumlah swap yang diharapkan yang akan terjadi untuk mengurutkan array menggunakan bubble sort .ANbp[i]0i<n

Saya sudah mencoba yang berikut ini:

  1. Probabilitas untuk elemen untuk i < j dapat dihitung dengan mudah dari probabilitas yang diberikan.A[i]>A[j]i<j

  2. Dengan menggunakan di atas, saya telah menghitung jumlah swap yang diharapkan sebagai:

    double ans = 0.0;
    for ( int i = 0; i < N-1; i++ ){
        for ( int j = i+1; j < N; j++ ) {
            ans += get_prob(A[i], A[j]); // Computes the probability of A[i]>A[j] for i < j.
    

Pada dasarnya saya sampai pada ide ini karena jumlah swap yang diharapkan dapat dihitung dengan jumlah inversi array. Jadi dengan memanfaatkan probabilitas yang diberikan saya menghitung apakah nomor akan ditukar dengan nomor A [ j ] .A[i]A[j]

Perhatikan bahwa elemen array awal dapat dalam urutan apa pun, diurutkan atau tidak disortir. Kemudian setiap angka dapat berubah dengan beberapa probabilitas. Setelah ini saya harus menghitung jumlah swap yang diharapkan.

Saya telah memposting pertanyaan serupa sebelumnya tetapi tidak memiliki semua kendala.

Saya tidak mendapatkan petunjuk yang baik apakah saya berada di jalur yang benar atau tidak, jadi saya mendaftarkan semua kendala di sini. Tolong beri saya beberapa petunjuk jika saya memikirkan masalah dengan cara yang salah.

Komunitas
sumber
6
Tapi tpyo lucu di judulnya.
JeffE
Jangan maksud Anda, berikan array yang diurutkan dari N integer, masing-masing elemen ... Juga kisaran angka dalam array awal dan perbedaan di antara mereka, relatif terhadap b tampaknya hilang.
Danny Varod
Ingatlah bahwa untuk analisis semacam ini, Anda harus memperjelas "implementasi" tertentu jika ide Bubblesort yang Anda pertimbangkan. Akan lebih baik jika Anda memberikan algoritma dalam kode pseudo.
Raphael
Masalah ini berasal dari kontes yang sedang berlangsung di situs codechef codechef.com/JULY12/problems/LEBOBBLE Saya akan dengan senang hati mengirimkan pendekatan saya setelah kontes.
rizwanhudda

Jawaban:

11

Biarkan didefinisikan sebagai berikut:BubbleSort

for (j = A.length; j > 1; j--)
    for (i = 0; i < j - 1; i++)
        if (A[i] > A[i + 1])
            swap(i, i + 1, A)

Diberikan beberapa permutasi , inversi dikatakan terjadi jika x j < x i untuk beberapa i < j . Kita melihat bahwa B u b b l e S o r t melakukan cek inversi untuk setiap pasangan, dan jika demikian, melakukan swap. Biarkan X menjadi jumlah swap. Tidak sulit untuk melihat dalam kasus terburuk ada X = ( nx1,,xnxj<xii<j.BubbleSortX kemungkinan swap dibuat. Tapi kami tertarik dalam kasus diharapkan, yang kita dapat menghitung dengan mendefinisikanXdalam hal inversi diBubbleSort.X=(n2)XBubbleSort

Sekarang mari mana saya i j adalah variabel indikator bahwa ada inversi untuk beberapa pasangan ( i , j ) . Harapan didefinisikan sebagai E [ X ] = E [ Σ j Σ i < j Saya i j ] = Σ j Σ i < j E [ I i j ]X=ji<jIijIij(i,j)E[X]=E[ji<jIij]=ji<jE[Iij]. Kita sekarang perlu menentukan .P{Iij}

Ketika mengasumsikan setiap permutasi yang mungkin sebagai input, masing-masing dengan probabilitas seragam, dapat ditunjukkan bahwa . Alasan di balik ini adalah bahwa di bawah permutasi yang mungkin, setengah dari waktuxj<xidan setengah dari waktuxi<xjuntukij.P{Iij}=12xj<xixi<xjij

E[X]=ji<jE[Iij]=ji<j12=(n2)12=n(n1)4

Nicholas Mancuso
sumber