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


14

Враховуючи масив з цілих чисел, кожен елемент масиву може бути збільшений на фіксоване число з деякою ймовірністю , . Я повинен знайти очікувану кількість свопів, які відбудуться для сортування масиву за допомогою сортування бульбашок .ANbp[i]0≤i<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=∑j∑i<jIijIij(i,j)E[X]=E[∑j∑i<jIij]=∑j∑i<jE[Iij]. Тепер нам потрібно визначити .P{Iij}

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

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

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