Kabarcık sıralamasında beklenen takas sayısı


14

tamsayılarından oluşan dizisi verildiğinde, dizideki her öğe, bazı olasılıklar , olan sabit bir sayı ile arttırılabilir . Kabarcık sıralaması kullanarak diziyi sıralamak için gerçekleşecek takas beklenen sayısını bulmak zorunda .ANbp[i]0i<n

Aşağıdakileri denedim:

  1. Bir öğe için olasılık için verilen olasılıklar kolayca hesaplanabilir.A[i]>A[j]i<j

  2. Yukarıdakileri kullanarak, beklenen takas sayısını şu şekilde hesapladım:

    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.
    

Temelde bu fikre geldim çünkü beklenen takas sayısı dizinin ters çevrilme sayısı ile hesaplanabilir. Dolayısıyla, verilen olasılıktan yararlanarak sayısının sayısıyla değiştirilip değiştirilmeyeceğini hesaplıyorum .A[i]A[j]

İlk dizi öğelerinin herhangi bir sırada olabileceğini, sıralanabileceğini veya ayrılmayabileceğini unutmayın. Sonra her sayı bir olasılıkla değişebilir. Bundan sonra beklenen takas sayısını hesaplamalıyım.

Daha önce benzer bir soru yayınladım ama tüm kısıtlamaları yoktu.

Doğru yolda olup olmadığım konusunda iyi ipuçları alamadım, bu yüzden tüm kısıtlamaları burada listeledim. Sorunu yanlış bir şekilde düşünürsem lütfen bana bazı ipuçları verin.


6
Yine de başlıkta sevimli tpyo.
JeffE

Yani, her bir eleman için sıralı bir N tamsayı dizisi verin ... Ayrıca, ilk dizideki sayıların aralığı ve b'ye göre aralarındaki farklar eksik gibi görünüyor.
Danny Varod

Bu tür bir analiz için, Bubblesort fikrini düşündüğünüzde hangi "uygulama" yı çok net bir şekilde belirtmeniz gerektiğini unutmayın. Algoritmayı sahte kodda vermeniz en iyisi olacaktır.
Raphael

Bu sorun codechef sitesinde devam eden bir yarışmadan kaynaklanmaktadır codechef.com/JULY12/problems/LEBOBBLE Yarışmadan sonra yaklaşımımı yayınlamaktan mutluluk duyarım .
rizwanhudda

Yanıtlar:


11

Let Aşağıdakilerden olarak tanımlanabilir: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)

Bazı permütasyon , bazı için ise bir tersinme meydana geldiği un her bir çift için bir ters çevirme kontrolü yaptığını ve eğer öyleyse bir takas gerçekleştirdiğini görüyoruz . , takas sayısı olsun . En kötü durumda yapılan olası takasların olduğunu görmek zor değildir . Ancak , içindeki ters çevirmeler açısından tanımlayarak hesaplayabileceğimiz beklenen durumla ilgileniyoruz .x1,,xnxj<xii<j.BubbleSortXX=(n2)XBubbleSort

Şimdi burada bazı çiftler için tersinme olduğunu gösteren gösterge değişkendir . Beklenti . Şimdi belirlememiz gerekiyor .X=ji<jIijIij(i,j)E[X]=E[ji<jIij]=ji<jE[Iij]P{Iij}

Her biri tekdüze olasılıklı herhangi bir olası permütasyon varsayıldığında, . Bunun ardındaki mantık, olası herhangi bir permütasyon altında, zamanının yarısı ve için zamanının .P{Iij}=12xj<xixi<xjij

Beklenti hesaplamamıza dönersek,E[X]=ji<jE[Iij]=ji<j12=(n2)12=n(n1)4

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.