Оценка средней сложности времени данного алгоритма сортировки пузырьков.


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=0n(j=0n(i+1)O(1)+O(1))=O(n22+n2)=O(n2)

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

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

Для этого я ожидаю, что любой заказ будет такой же возможности.


6
Сначала вы должны определить, что означает среднее значение. Поскольку алгоритм является детерминированным, вы должны принять какое-то распределение по входам.
Суреш

@Sim Можете ли вы показать, как вы рассчитали сложность времени наихудшего случая? Затем мы можем получить представление о том, что вы подразумеваете под средней сложностью в вашем случае.
0x0

Я имею в виду среднее время с точки зрения наиболее вероятного необходимого времени (или, другими словами, «чистой» математической версии: среднее значение за все время, наблюдаемое при статистическом анализе). Например, быстрая сортировка имеет среднее значение nlogn, хотя ее наихудший случай равен n ^ 2.
Сим

1
@Sim В случае среднего значения пузырьковой сортировки = сложность времени в наихудшем случае, т. Е. Средняя сложность времени такжеn2
0x0

3
Есть разница «при выборе стержень над выбором бросков монеты» , которая не имеет ничего общего с данными быстрой сортировки усредняется. В то время как вы подразумеваете, что вы хотите усреднить «по всем входам», что предполагает (например), что вы ожидаете, что каждое упорядочение входных данных произойдет с одинаковой вероятностью. это разумно, но это должно быть указано явно.
Суреш

Ответы:


9

Для списков длины среднее обычно означает, что вы должны начать с равномерного распределения по всемперестановки [ , .., ]: это будут все списки, которые вы должны рассмотреть.n ! 1 нnn!1n

Ваша средняя сложность будет тогда суммой числа шагов для всех списков, деленных на,n!

Для заданного списка число шагов вашего алгоритма где n d d max i ( max ( 1 , i - x i ) )(xi)inddxiimaxi(max(1,ixi))

Затем вы делаете математику: для каждого найдите число списков с этим конкретным максимальным расстоянием, тогда ожидаемое значение будет:с d ddcdd

1n! d=0n dcd

И вот основные мысли без трудная часть , которая находя . Может быть, есть более простое решение, хотя.cd

EDIT: добавлен `ожидаемый»


Если вы считаете нормальное распределение, есть ли способ приблизить ? cd
Сим

Можно сказатьпотому что вы можете общаться в любом месте всех перестановок [ , .., ] и Append в конце , но это к маленьким , чтобы доказать в среднем. 2 д 1 н ²cd(n+1d)(d1)!2d1n²
jmad

19

Напомним , что пара (соотв. ) инвертируется , если и .( i , j ) i < j A [ i ] > A [ j ](A[i],A[j])(i,j)i<jA[i]>A[j]

Предполагая, что ваш алгоритм выполняет один своп для каждой инверсии, время работы вашего алгоритма будет зависеть от числа инверсий.

Вычислить ожидаемое количество инверсий в равномерной случайной перестановке легко:

Пусть перестановка, и пусть будет обратным . Например, если , то .R ( P ) P P = 2 , 1 , 3 , 4 R ( P ) = 4 , 3 , 1 , 2PR(P)PP=2,1,3,4R(P)=4,3,1,2

Для каждой пары индексов существует инверсия ровно в одном из или .P R ( P )(i,j)PR(P)

Так как общее число пар , а общее число и каждая пара инвертируется в ровно половина из перестановок, предполагая , что все перестановки в одинаковой степени, ожидаемое число инверсий:n(n1)/2

n(n1)4

это оценивает количество инверсий. но как о количестве сравнений , которое зависит от времени обкатки оговорки ступенчатой в
Sim

Вы получаете одно сравнение по свопу, и, что самое важное, один своп может уменьшить количество инверсий максимум на одну.
jmad

не раз результаты сравнения в своп, если если придаточного ложно, никакой инверсии делается.
Sim

@rgrig Если вы предоставите контрпример, я исправлю свой ответ.
Джо

@Joe: Я удалил свой комментарий. Это было не правильно.
rgrig

2

Число перестановок <Количество итераций (как в оптимизированном, так и в простом сценарии с пузырьками)

Количество инверсий = количество свопов.

Следовательно, число итераций>n(n1)4

Таким образом, средняя сложность случая равна . Но, поскольку средний случай не может превышать худшего, мы получаем, что это ,O ( n 2 )ω(n2)O(n2)

Это дает нам: Среднее время = θ(n2)

(Временная сложность = Количество итераций № итераций> Количество свопов)


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.