Очікувана кількість свопів у сортуванні бульбашок


14

Враховуючи масив з цілих чисел, кожен елемент масиву може бути збільшений на фіксоване число з деякою ймовірністю , . Я повинен знайти очікувану кількість свопів, які відбудуться для сортування масиву за допомогою сортування бульбашок .ANbp[i]0i<n

Я спробував таке:

  1. Ймовірність для елемента для може бути легко обчислена з заданих ймовірностей.A[i]>A[j]i<j

  2. Використовуючи вищесказане, я розрахував очікувану кількість свопів як:

    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.
    

В основному я прийшов до цієї ідеї, оскільки очікувана кількість свопів можна обчислити за кількістю інверсій масиву. Отже, використовуючи задану ймовірність, я обчислюю, чи буде число замінено числом .A [ j ]A[i]A[j]

Зауважте, що початкові елементи масиву можуть бути в будь-якому порядку, відсортовані або несортовані. Тоді кожне число може змінюватися з певною вірогідністю. Після цього я повинен підрахувати очікувану кількість свопів.

Я раніше розміщував подібне запитання, але він не мав усіх обмежень.

Я не отримав жодних добрих підказів щодо того, я навіть на правильному шляху чи ні, тому я перерахував тут усі обмеження. Будь ласка, дайте мені підказки, якщо я думаю про проблему неправильно.


6
Симпатичний тпьо в назві, хоча.
JeffE

Хіба ви не маєте на увазі, дайте відсортований масив з N цілих чисел, кожен елемент ... Також діапазон чисел у початковому масиві та різниці між ними відносно b, здається, відсутні.
Danny Varod

Майте на увазі, що для такого типу аналізу ви повинні чітко зрозуміти, яку саме "реалізацію" ви маєте на увазі ідея Bubblesort. Було б найкраще, якби ви дали алгоритм у псевдокоді.
Рафаель

Ця проблема пов'язана з постійним конкурсом на сайті codechef codechef.com/JULY12/problems/LEBOBBLE Я буду радий опублікувати свій підхід після проведення конкурсу.
rizwanhudda

Відповіді:


11

Нехай визначається так: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)

З огляду на деяку перестановку , як кажуть , відбулася інверсія, якщо x j < x i для деяких i < j . Ми бачимо, що B u b b l e S o r t проводить перевірку інверсії для кожної пари, а якщо так, то здійснює своп. Нехай X - кількість свопів. Не важко побачити в гіршому випадку є X = ( nx1,,xnxj<xii<j.BubbleSortX можливі зроблені свопи. Але нас цікавить очікуваний випадок, який ми можемо обчислити, визначившиXз точки зору інверсії вBubbleSort.X=(n2)XBubbleSort

Тепер нехай де I i j - індикативна змінна, що існує інверсія для деякої пари ( i , j ) . Очікування визначається як E [ X ] = E [ j i < j I i j ] = j i < j E [ I i j ]X=ji<jIijIij(i,j)E[X]=E[ji<jIij]=ji<jE[Iij]. Тепер нам потрібно визначити .P{Iij}

Припускаючи будь-яку можливу перестановку як вхідну, кожна з рівномірною ймовірністю, може бути показано, що . Причина цього полягає в тому, що при будь-якій можливій перестановці половина часуxj<xiі половина часуxi<xjдляij.P{Iij}=12xj<xixi<xjij

Повертаючись до нашого розрахунку очікувань, ми бачимо, що E[X]=ji<jE[Iij]=ji<j12=(n2)12=n(n1)4

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.