Учитывая этот псевдокод пузырьковой сортировки:
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
Какие основные идеи я должен иметь в виду, чтобы оценить среднюю сложность по времени? Я уже выполнены вычисления худших и лучших случаях, но я застрял дискуссионный как оценить среднюю сложность внутреннего цикла, чтобы сформировать уравнение.
В худшем случае уравнение имеет вид:
в которой внутренняя сигма представляет внутреннюю петлю, а внешняя сигма представляет внешнюю петлю. Я думаю, что мне нужно изменить обе сигмы из-за предложения if-then-break, которое может повлиять на внешнюю сигму, но также из-за предложения if во внутреннем цикле, что повлияет на действия, выполняемые во время цикла (4 действия + 1 сравнение, если верно, иначе только 1 сравнение).
Для пояснения термина «среднее время»: этому алгоритму сортировки потребуется разное время в разных списках (одинаковой длины), поскольку алгоритму может потребоваться больше или меньше шагов через / внутри циклов, пока список не станет полностью упорядоченным. Я пытаюсь найти математический (не статистический способ) оценки среднего числа необходимых раундов.
Для этого я ожидаю, что любой заказ будет такой же возможности.
Ответы:
Для списков длины среднее обычно означает, что вы должны начать с равномерного распределения по всемперестановки [ , .., ]: это будут все списки, которые вы должны рассмотреть.n ! 1 нn n! 1 n
Ваша средняя сложность будет тогда суммой числа шагов для всех списков, деленных на,n!
Для заданного списка число шагов вашего алгоритма где n d d max i ( max ( 1 , i - x i ) )(xi)i nd d xi i maxi(max(1,i−xi))
Затем вы делаете математику: для каждого найдите число списков с этим конкретным максимальным расстоянием, тогда ожидаемое значение будет:с d dd cd d
И вот основные мысли без трудная часть , которая находя . Может быть, есть более простое решение, хотя.cd
EDIT: добавлен `ожидаемый»
источник
Напомним , что пара (соотв. ) инвертируется , если и .( i , j ) i < j A [ i ] > A [ j ](A[i],A[j]) (i,j) i<j A[i]>A[j]
Предполагая, что ваш алгоритм выполняет один своп для каждой инверсии, время работы вашего алгоритма будет зависеть от числа инверсий.
Вычислить ожидаемое количество инверсий в равномерной случайной перестановке легко:
Пусть перестановка, и пусть будет обратным . Например, если , то .R ( P ) P P = 2 , 1 , 3 , 4 R ( P ) = 4 , 3 , 1 , 2P R(P) P P=2,1,3,4 R(P)=4,3,1,2
Для каждой пары индексов существует инверсия ровно в одном из или .P R ( P )(i,j) P R(P)
Так как общее число пар , а общее число и каждая пара инвертируется в ровно половина из перестановок, предполагая , что все перестановки в одинаковой степени, ожидаемое число инверсий:n(n−1)/2
источник
Число перестановок <Количество итераций (как в оптимизированном, так и в простом сценарии с пузырьками)
Количество инверсий = количество свопов.
Следовательно, число итераций>n(n−1)4
Таким образом, средняя сложность случая равна . Но, поскольку средний случай не может превышать худшего, мы получаем, что это ,O ( n 2 )ω(n2) O(n2)
Это дает нам: Среднее время =θ(n2)
(Временная сложность = Количество итераций № итераций> Количество свопов)
источник
в этом документе средняя сложность времени пузырьковой сортировки достигла O (nlog (n))! http://algo.inria.fr/flajolet/Publications/ViFl90.pdf
источник