Oczekiwana liczba zamian w sortowaniu bąbelkowym

14

Biorąc pod uwagę tablicy z N liczb całkowitych, do każdego elementu w szyku może być zwiększona przez ustaloną ilość b z pewnym prawdopodobieństwem p [ i ] , 0 i < n . Muszę znaleźć oczekiwaną liczbę zamian, które będą miały miejsce w celu posortowania tablicy za pomocą sortowania bąbelkowego .ANbp[i]0i<n

Próbowałem następujące:

  1. Prawdopodobieństwo dla elementu dla i < j można łatwo obliczyć na podstawie podanych prawdopodobieństw.A[i]>A[j]i<j

  2. Korzystając z powyższego, obliczyłem oczekiwaną liczbę swapów jako:

    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.
    

Zasadniczo wpadłem na ten pomysł, ponieważ oczekiwaną liczbę zamian można obliczyć na podstawie liczby inwersji tablicy. Korzystając z podanego prawdopodobieństwa, obliczam, czy liczba zostanie zamieniona liczbą A [ j ] .A[i]A[j]

Zauważ, że początkowe elementy tablicy mogą być w dowolnej kolejności, posortowane lub nieposortowane. Następnie każda liczba może się zmienić z pewnym prawdopodobieństwem. Następnie muszę obliczyć oczekiwaną liczbę zamian.

Zadałem podobne pytanie wcześniej, ale nie miało ono wszystkich ograniczeń.

Nie dostałem żadnych dobrych wskazówek, czy jestem na dobrej drodze, czy nie, więc wymieniłem tutaj wszystkie ograniczenia. Proszę o wskazówki, jeśli źle myślę o problemie.

Społeczność
źródło
6
W tytule jest jednak słodkie tpyo.
JeffE
Nie masz na myśli, podaj posortowaną tablicę N liczb całkowitych, każdego elementu ... Wydaje się, że brakuje także zakresu liczb w tablicy początkowej i różnic między nimi w stosunku do b.
Danny Varod,
Należy pamiętać, że w przypadku tego rodzaju analiz należy bardzo wyraźnie określić, jaką konkretną „implementację” należy wziąć pod uwagę w przypadku idei Bubblesort. Byłoby najlepiej, gdybyś podał algorytm w pseudo-kodzie.
Raphael
Ten problem pochodzi z trwającego konkursu na stronie codechef codechef.com/JULY12/problems/LEBOBBLE Z przyjemnością opublikuję moje podejście po konkursie.
rizwanhudda

Odpowiedzi:

11

Niech jest zdefiniowana jako: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)

Biorąc pod uwagę pewną permutację , mówi się, że doszło do inwersji, jeśli x j < x i dla niektórych i < j . Możemy zobaczyć, że B u b b L E S O r t wykonuje sprawdzenie inwersji dla każdej pary, a jeżeli tak, wykonuje wymiany. Niech X będzie liczbą zamian. Nie jest trudno dostrzec w najgorszym przypadku X = ( nx1,,xnxj<xii<j.BubbleSortX dokonane możliwe zamiany. Ale interesuje nas oczekiwany przypadek, który możemy obliczyć, definiującXw kategoriach inwersji wBubbX=(n2)X .BubbleSort

Teraz niech gdzie I i j jest zmienną wskaźnikową, że istnieje odwrócenie dla pewnej pary ( i , j ) . Oczekiwanie jest zdefiniowane jako E [ X ] = E [ j i < j I i j ] = j i < j E [ I i j ]X=jotja<jotjajajotjajajot(ja,jot)mi[X]=mi[jotja<jotjajajot]=jotja<jotmi[jajajot] . Teraz musimy ustalić .P.{jajajot}

Zakładając jakąkolwiek możliwą permutację jako dane wejściowe, każde z jednakowym prawdopodobieństwem, można wykazać, że . Powodem tego jest to, że przy dowolnej możliwej permutacji połowa czasuxj<xiipołowa czasuxi<xjdlaij.P.{jajajot}=12)xjot<xjaxja<xjotjajot

mi[X]=jotja<jotmi[jajajot]=jotja<jot12)=(n2))12)=n(n-1)4

Nicholas Mancuso
źródło