Оцінка середньої трудомісткості часу заданого алгоритму розгалуження.


11

Враховуючи цей псевдо-код бульбашки:

FOR i := 0 TO arraylength(list) STEP 1  
    switched := false
    FOR j := 0 TO arraylength(list)-(i+1) STEP 1
        IF list[j] > list[j + 1] THEN
            switch(list,j,j+1)
            switched := true
        ENDIF
    NEXT
    IF switched = false THEN
        break
    ENDIF
NEXT

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

Найгірше рівняння:

i=0н(j=0н-(i+1)О(1)+О(1))=О(н22+н2)=О(н2)

в якій внутрішня сигма являє собою внутрішню петлю, а зовнішня сигма - зовнішню петлю. Я думаю, що мені потрібно змінити обидві сигми через клаузу "if-then-break", яка може вплинути на зовнішню сигму, але також через клавішу if у внутрішньому циклі, що вплине на дії, здійснені під час циклу (4 дії + 1 порівняння, якщо це правда, інакше лише 1 порівняння).

Для уточнення терміна "середній час": Цей алгоритм сортування потребуватиме різного часу в різних списках (однакової довжини), оскільки алгоритму може знадобитися більше чи менше кроків через / в циклі, поки список повністю не буде в порядку. Я намагаюся знайти математичний (не статистичний спосіб) оцінювання середнього рівня необхідних раундів.

Для цього я очікую, що будь-яке замовлення має однакову можливість.


6
спочатку потрібно визначити, що середнє значення означає навіть. Оскільки алгоритм є детермінованим, вам доведеться припустити якийсь розподіл по вхідних даних.
Суреш

@Sim Чи можете ви показати, як ви обчислили найгірші часові складності? Тоді ми можемо отримати уявлення про те, що ви маєте на увазі під середньою складністю у вашому випадку.
0х0

Я маю на увазі середній час у спосіб найбільш вірогідного часу, необхідного (або іншими словами, "чистого" математичного варіанту: середнього значення всіх спостережуваних часів, роблячи статистичний аналіз). Наприклад, quicksort має середнє значення nlogn, хоча найгірший випадок - n ^ 2.
Сім

1
@Sim У випадку з бульбашкою сортування середній випадок = найгірший час складності часу, тобто середній випадок Складність часу також н2
0x0

3
Є різниця. quicksort усереднюється "над вибором монетних кидок при виборі стрижня", що не має нічого спільного з даними. В той час, як ви маєте на увазі, що ви хочете, щоб в середньому "над усіма входами", що передбачає (наприклад), що ви очікуєте, що кожне впорядкування вводу буде відбуватися з однаковою ймовірністю. це розумно, але це слід вказати прямо.
Суреш

Відповіді:


9

Для списків довжини середнє зазвичай означає, що вам потрібно починати з рівномірного розподілу на всі n ! перестановки [ 1 , .., n ]: це будуть всі списки, які ви повинні врахувати.нн!1н

Ваша середня складність тоді буде сумою кількості кроків для всіх списків, поділених на .н!

Для даного списку , кількість кроків вашого алгоритму дорівнює n d, де d - найбільша відстань між елементом x i та його правильним розташуванням i (але лише якщо він повинен рухатися ліворуч), є max i ( max ( 1 , i - x i ) ) .(хi)iнггхiiмаксi(макс(1,i-хi))

Тоді ви займаєтеся математикою: для кожного знайдіть число c d списків з цією максимальною відстані, тоді очікуване значення d дорівнює:гcгг

1н! г=0н гcг

І це основні думки без найважчої частини, яка є знаходженням . Можливо, є більш просте рішення.cг

EDIT: додано `очікувано '


Якщо ви вважаєте нормальним розподіл, чи існує спосіб наближення ? cг
Сім

Можна сказати тому що ви можете змішати будь-де всі перестановки [ 2 , .., d ] та додати 1 в кінці, але це мало, щоб довести в середньому. cг(н+1-г)(г-1)!2г1н²
jmad

19

Нагадаємо, що пара (відповідно ) перевернута, якщо і .( i , j ) i < j A [ i ] > A [ j ](А[i],А[j])(i,j)i<jА[i]>А[j]

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

Обчислити очікувану кількість інверсій в рівномірну випадкову перестановку:

Нехай перестановка, і нехай буде зворотним . Наприклад, якщо то .R ( P ) P P = 2 , 1 , 3 , 4 R ( P ) = 4 , 3 , 1 , 2ПR(П)ПП=2,1,3,4R(П)=4,3,1,2

Для кожної пари індексів існує інверсія точно в одному з або .P R ( P )(i,j)ПR(П)

Оскільки загальна кількість пар дорівнює , а загальна кількість і кожна пара перевернуті рівно в половину перестановок, якщо вважати, що всі перестановки є однаково вірогідними, очікувана кількість інверсій:н(н-1)/2

н(н-1)4

це оцінює кількість інверсій. але як про кількість порівнянь , яке залежить від часу обкатки застереження ступінчастою в
Sim

Ви отримуєте одне порівняння свопом, і головне, що один своп може зменшити кількість інверсій щонайменше на одну.
jmad

не кожне порівняння призводить до заміни, якщо клавіша if-значення помилкова, інверсія не робиться.
Сім

@rgrig Якщо ви надаєте зустрічний приклад, я виправлю свою відповідь.
Джо

@Joe: я видалив свій коментар. Це було неправильно.
rgrig

2

Кількість свопів <Кількість повторень (як в оптимізованому, так і у простому сценарії з бульбашкою)

Кількість інверсій = Кількість свопів.

н(н-1)4

ω(н2)О(н2)

θ(н2)

(Час складності = Кількість ітерацій, кількість ітерацій> кількість замінів)


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